From 3cebdddb546ea9285187e3c9caef40cfa6285098 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 5 Sep 2024 12:21:17 -0300 Subject: [PATCH] update demo --- demo/assets/bundle copy.js | 2 ++ demo/assets/bundle.js | 4 ++-- demo/assets/index.html | 1 + demo/bundle.js | 2 -- 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 demo/assets/bundle copy.js delete mode 100644 demo/bundle.js diff --git a/demo/assets/bundle copy.js b/demo/assets/bundle copy.js new file mode 100644 index 0000000..7afb276 --- /dev/null +++ b/demo/assets/bundle copy.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e={282:(e,t,n)=>{n.d(t,{A:()=>s});var o=n(354),i=n.n(o),r=n(314),l=n.n(r)()(i());l.push([e.id,'/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n font: inherit;\n line-height: normal;\n}\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n}\n\n.list-item-checkable input {\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n background-color: white;\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n margin-bottom: 200px;\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n font-size: 0.86rem;\n color: #37352fd9;\n font-weight: 600;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper ul {\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper>button {\n color: #37352fd9;\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.item>button,\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n /* background-color: inherit; */\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n.johannes-editor *::selection {\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #feebeb;\n border-color: #FDDEDE;\n}\n\n.callout-background-green {\n background-color: #ebfbee;\n border-color: #D7F7DC;\n}\n\n.callout-background-blue {\n background-color: #e8f4fa;\n border-color: #D9EDF6;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #FAF4D1;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #E1E0E0;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #37352fd9;\n font-weight: 600;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n.embed-content button {\n cursor: pointer;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Resize handler */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n/** Resize handler **/\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n\n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n /* color: inherit; */\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: #2383e2;\n color: white;\n border: none;\n padding: 3px;\n border-radius: 5px;\n font-weight: 500;\n}\n\n\n/** separator **/\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n.separator-wrapper hr {\n outline: none !important;\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n.separator-selected hr {\n color: white !important;\n border-color: white !important;\n}\n\n/** end separator */\n\n\n\n\n#linkBoxInput{\n\n}\n\n.content-data input:focus,\n#linkBoxInput:focus {\n outline: 2px solid #4A90E2;\n box-shadow: 0 0 5px rgba(74, 144, 226, 0.5);\n}\n\n\n.d-none{\n display: none !important;\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n font: inherit;\n line-height: normal;\n}\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n}\n\n.list-item-checkable input {\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n background-color: white;\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n margin-bottom: 200px;\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n font-size: 0.86rem;\n color: #37352fd9;\n font-weight: 600;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper ul {\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper>button {\n color: #37352fd9;\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.item>button,\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n /* background-color: inherit; */\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n.johannes-editor *::selection {\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #feebeb;\n border-color: #FDDEDE;\n}\n\n.callout-background-green {\n background-color: #ebfbee;\n border-color: #D7F7DC;\n}\n\n.callout-background-blue {\n background-color: #e8f4fa;\n border-color: #D9EDF6;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #FAF4D1;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #E1E0E0;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #37352fd9;\n font-weight: 600;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n.embed-content button {\n cursor: pointer;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Resize handler */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n/** Resize handler **/\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n\n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n /* color: inherit; */\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: #2383e2;\n color: white;\n border: none;\n padding: 3px;\n border-radius: 5px;\n font-weight: 500;\n}\n\n\n/** separator **/\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n.separator-wrapper hr {\n outline: none !important;\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n.separator-selected hr {\n color: white !important;\n border-color: white !important;\n}\n\n/** end separator */\n\n\n\n\n#linkBoxInput{\n\n}\n\n.content-data input:focus,\n#linkBoxInput:focus {\n outline: 2px solid #4A90E2;\n box-shadow: 0 0 5px rgba(74, 144, 226, 0.5);\n}\n\n\n.d-none{\n display: none !important;\n}'],sourceRoot:""}]);const s=l},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var l={};if(o)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[t].concat([r]).join("\n")}return[t].join("\n")}},72:e=>{var t=[];function n(e){for(var n=-1,o=0;o{var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var o,i,r,l,s,a,c,d,u,m,h,A,p,C,g,b,E,f=n(72),B=n.n(f),v=n(825),w=n.n(v),I=n(659),k=n.n(I),y=n(56),x=n.n(y),T=n(540),S=n.n(T),L=n(113),M=n.n(L),N=n(282),q={};q.styleTagTransform=M(),q.setAttributes=x(),q.insert=k().bind(null,"head"),q.domAPI=w(),q.insertStyleElement=S(),B()(N.A,q),N.A&&N.A.locals&&N.A.locals,function(e){e.Paragraph="p",e.Heading_1="h1",e.Heading_2="h2",e.Heading_3="h3",e.Heading_4="h4",e.Heading_5="h5",e.Heading_6="h6",e.CheckList="checkList",e.BulletedList="bulletedList",e.NumberedList="numberedList",e.List="list",e.Table="table",e.Image="image",e.Script="script",e.Iframe="iframe"}(o||(o={}));class O{static generateUniqueId(){const e=Date.now().toString(36),t=new Uint32Array(1);return window.crypto.getRandomValues(t),e+t[0].toString(36)}static rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join("")}static isValidUrl(e){const t=new RegExp("^(https?:\\/\\/)(?!-)[a-zA-Z\\d-]{1,63}(?H.blockParagraph(e)}static paragraphCreator(){return e=>H.paragraph(e)}static headingCreator(e){return t=>H.heading(e,t)}static checkboxItemCreator(){return e=>H.checkboxItem(e||"")}static listItemCreator(){return e=>H.listItem_2(e)}static dragHandleButtonCreator(){return()=>H.dragHandleButton()}static codeCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","ignore-events");const n=document.createElement("div");n.classList.add("code-block","ignore-quick-menu","ignore-text-floating-toolbar");const o=document.createElement("pre");o.classList.add(r.IncludeBlockToolbarClass,r.LanguageSelectionToolClass,r.ExtraOptionsClass);const i=document.createElement("code");return i.contentEditable="true",i.setAttribute("data-placeholder","/* Code snippet */"),i.textContent=e||"",i.classList.add("johannes-code","focusable","hljs","language-plaintext","editable"),i.setAttribute("spellCheck","false"),o.appendChild(i),i.addEventListener("blur",(()=>{i.removeAttribute("data-highlighted"),hljs.highlightElement(i)})),n.appendChild(o),t.appendChild(n),hljs.highlightElement(i),t}}static quoteCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","swittable");const n=document.createElement("blockquote");return n.classList.add("focusable","editable"),n.textContent=e||"",n.contentEditable="true",n.setAttribute("data-placeholder",H.getRandomQuote()),t.appendChild(n),t}}static getRandomQuote(){const e=["Talk is cheap. Show me the code. - Linus Torvalds","Premature optimization is the root of all evil. - Donald Knuth","The most dangerous phrase in the language is, 'We've always done it this way.' - Grace Hopper","Simplicity is prerequisite for reliability. - Edsger W. Dijkstra","Any fool can write code that a computer can understand. Good programmers write code that humans can understand. - Martin Fowler","First, solve the problem. Then, write the code. - John Johnson","In programming, the hard part isn't solving problems, but deciding what problems to solve. - Paul Graham","Code is like humor. When you have to explain it, it's bad. - Cory House","Make it work, make it right, make it fast. - Kent Beck","Before software can be reusable it first has to be usable. - Ralph Johnson"];return e[Math.floor(Math.random()*e.length)]}static checkListCreator(){return e=>{const t=document.createElement("ul");t.classList.add("johannes-content-element","swittable","list","checkbox-list"),t.setAttribute("data-content-type",o.CheckList);const n=H.checkboxItem(e||"");return t.appendChild(n),t}}static bulletedListCreator(){return e=>{const t=document.createElement("ul");t.setAttribute("data-content-type",o.BulletedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=H.listItem_2(e||"");return t.appendChild(n),t}}static numberedListCreator(){return e=>{const t=document.createElement("ol");t.setAttribute("data-content-type",o.NumberedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=H.listItem_2(e||"");return t.appendChild(n),t}}static tableCreator(){return e=>{const t=document.createElement("div");t.classList.add("table-shell","ignore-quick-menu");const n=document.createElement("div");n.classList.add("table-controller");const i=document.createElement("div");i.classList.add("table-wrapper");const l=document.createElement("table");l.classList.add("johannes-content-element","swittable","table",r.IncludeBlockToolbarClass,r.AlignToolClass,r.ExtraOptionsClass),l.setAttribute("data-content-type",o.Table),t.appendChild(n),n.appendChild(i),i.appendChild(l);const s=document.createElement("tbody");l.appendChild(s);const a=e?e.split(","):[],c=document.createElement("tr");a.forEach((e=>{const t=document.createElement("td");t.classList.add("focusable","editable"),t.setAttribute("data-placeholder","cell"),t.textContent=e,t.contentEditable="true",c.appendChild(t)})),s.appendChild(c);const d=document.createElement("div");d.classList.add("add-table-row"),d.innerHTML='';const u=document.createElement("div");return u.classList.add("add-table-column"),u.innerHTML='',n.appendChild(d),n.appendChild(u),t}}static placeholderCreator(e,t,n,o=[]){return i=>{const s=document.createElement("div");s.classList.add(l.ContentElement,"swittable","no-selection",r.IncludeBlockToolbarClass,r.ExtraOptionsClass),s.setAttribute("data-content-type",e);const a=document.createElement("div");a.classList.add("content-placeholder",l.ShowMediaInputOnClick,...o);const c=this.createIcon(t),d=document.createElement("span");return d.classList.add("no-selection"),d.innerText=n,s.appendChild(a),a.appendChild(c),a.appendChild(d),s}}static calloutCreator(){return e=>{const t=document.createElement("div");t.classList.add("ignore-quick-menu","callout","johannes-content-element","swittable",r.IncludeBlockToolbarClass,r.ColorToolClass,r.ExtraOptionsClass);const n=document.createElement("div");n.classList.add("callout-background-grey","callout-wrapper");const o=document.createElement("p");return o.setAttribute("data-placeholder","Type something..."),o.contentEditable="true",o.classList.add("callout-text","editable","focusable"),n.appendChild(o),t.appendChild(n),t}}static separatorCreator(){return()=>{const e=document.createElement("div");e.classList.add("johannes-content-element");const t=document.createElement("div");t.classList.add("separator-wrapper");const n=document.createElement("hr");return n.classList.add("separator"),t.appendChild(n),e.appendChild(t),e}}static paragraph(e=null){const t=document.createElement("p");return t.innerText=e||"",t.contentEditable="true",t.setAttribute("data-content-type",o.Paragraph),t.classList.add("johannes-content-element","swittable","focusable","key-trigger","editable"),t.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),t}static heading(e,t=null){const n=document.createElement(`h${e}`);return n.innerText=t||"",n.contentEditable="true",n.setAttribute("data-content-type",`h${e}`),n.classList.add("johannes-content-element","swittable","focusable","focus","key-trigger","editable"),n.setAttribute("data-placeholder",`Heading ${e}`),n}static checkboxItem(e){const t=O.generateUniqueId();let n=document.createElement("li");n.classList.add("deletable","no-list-style","list-item","list-item-checkable");let o=document.createElement("input");o.id=t,o.setAttribute("type","checkbox");let i=document.createElement("div");return i.textContent=e,i.setAttribute("data-placeholder","To-do"),i.contentEditable="true",i.setAttribute("for",t),i.classList.add("focusable","editable","focus"),n.appendChild(o),n.appendChild(i),n}static listItem_2(e=null){let t=document.createElement("li");t.classList.add("deletable"),t.classList.add("list-item");const n=document.createElement("div");return n.classList.add("focusable","editable","focus","key-trigger"),n.contentEditable="true",n.setAttribute("data-placeholder","Item"),t.appendChild(n),n.innerText=e||"",t}static blockParagraph(e=null){let t=document.createElement("div");t.id=`b-${O.generateUniqueId()}`;let n=H.paragraph(e);return t.appendChild(n),t.classList.add("block"),t.classList.add("deletable"),t}static dragHandleButton(){const e=document.createElement("div");e.classList.add("drag-handler-wrapper",l.EditorOnly);let t=document.createElement("button");return t.innerHTML='',t.classList.add(l.EditorOnly,"drag-handler","button-reset"),t.draggable=!0,e.appendChild(t),e}static createIcon(e){let t=document.createElement("div");return t.classList.add("icon-wrapper"),t.innerHTML=``,t}}!function(e){e.ColorChangeRequest="ColorChangeRequest",e.ShowHideActiveButton="ShowHideActiveButton",e.ResetActiveButtons="ResetActiveButtons",e.CloseElement="HideComponent",e.ShowElement="ShowElement",e.ChangeBlockToolbarLanguage="ChangeBlockToolbarLanguage"}(s||(s={}));class R{id;_canHide;classList=[];props;htmlElement;parent;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}setId(e){this.id=e,this.htmlElement.id=e}addCssClass(...e){this.classList.push(...e),this.htmlElement.classList.add(...e)}appendTo(e){this.parent=e,e.htmlElement.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this.htmlElement.style.display=this.display}hide(){this.htmlElement.style.display="none"}lockHide(){this._canHide=!1}unlockHide(){this._canHide=!0}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,t=this.htmlElement.style.visibility,n=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=t,this.htmlElement.style.position=n),o.right>i||o.left<0}ensureVisible(){this.htmlElement.closest("select, ul")?this.htmlElement.scrollIntoView({behavior:"smooth",block:"nearest",inline:"start"}):console.warn("Attempted to make a non-relevant item visible")}handleCloseElementEvent(e){const t=e.detail;this.id&&this.id==t.targetId&&(e.stopImmediatePropagation(),this.hide())}handleShowElementEvent(e){e.detail.targetId==this.id&&(e.stopImmediatePropagation(),this.show())}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this)),document.addEventListener(s.ShowElement,this.handleShowElementEvent.bind(this))}}class D{static instance=new D;dependencies={};constructor(){}static get Instance(){return D.instance}register(e,t){this.dependencies[e]=t}resolve(e){if(!this.dependencies[e])throw new Error(`Dependency ${e} not found.`);return this.dependencies[e]()}}!function(e){e.Load="load",e.Mouseenter="mouseenter",e.Mouseleave="mouseleave",e.Mousedown="mousedown",e.Mousemove="mousemove",e.Mouseup="mouseup",e.Mouseover="mouseover",e.Keyup="keyup",e.Keydown="keydown",e.Blur="blur",e.SelectStart="selectstart",e.SelectionChange="selectionchange",e.Click="click",e.Focusin="focusin",e.Focusout="focusout",e.DOMContentLoaded="DOMContentLoaded",e.Input="input",e.BblClick="dblclick"}(a||(a={}));class P{static isSelectionInTableCell(){let e=window.getSelection();if(!e?.rangeCount)return!1;let t=e.anchorNode;for(;t;){if(t.nodeType===Node.ELEMENT_NODE&&("TD"===t.tagName||"TH"===t.tagName))return!0;t=t.parentNode}return!1}static getSelectionTextInfo(e){let t,n,o=!1,i=!1;if(""==e.textContent)return o=!0,i=!0,{atStart:o,atEnd:i};const r=window.getSelection();return r&&r.rangeCount>0&&(t=r.getRangeAt(0),n=document.createRange(),n.selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),o=""===n.toString(),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),i=""===n.toString()),{atStart:o,atEnd:i}}static insertAfter(e,t){t.parentNode&&t.parentNode.insertBefore(e,t.nextSibling)}static hasTextContent(e){return""!==e.textContent?.trim()||e.hasChildNodes()&&Array.from(e.childNodes).some((e=>this.hasTextContent(e)))}static cloneAndInsertAfter(e){const t=e.cloneNode(!0),n=e.parentNode;if(!n)return null;if(n.insertBefore(t,e.nextSibling),t.id){const e=t.id.match(/^(.+?)-/);if(e){const n=e[1];t.id=n+"-"+O.generateUniqueId()}else t.id=O.generateUniqueId()}return t}static findClosestAncestorOfActiveElementByClass(e){const t=document.activeElement;if(!t)return null;let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static findClosestAncestorOfSelectionByClass(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;for(n&&n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static rearrangeContentAfterSplit(e,t){const n=P.getCursorPosition(e),o=this.splitContentAtCursorSelection(e);if(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(o[1]),document.getSelection()?.deleteFromDocument(),t&&n){this.setCursorPosition(t,n);const e=this.splitContentAtCursorSelection(t);document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e[0]),document.getSelection()?.deleteFromDocument()}}static getCursorPosition(e){const t=window.getSelection();if(!t||!e)return null;const n=t.getRangeAt(0);if(!n.intersectsNode(e))return null;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>NodeFilter.FILTER_ACCEPT});let i=0,r=o.firstChild();for(;r;){if(r===n.startContainer){i+=n.startOffset;break}i+=r.textContent?.length||0,r=o.nextNode()}return i}static setCursorPosition(e,t){const n=window.getSelection();if(!n)return;n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:()=>NodeFilter.FILTER_ACCEPT});let r=i.nextNode(),l=0;for(;r;){const e=r.textContent?.length||0;if(l+e>=t){o.setStart(r,t-l),o.collapse(!0);break}l+=e,r=i.nextNode()}n.addRange(o)}static getContentTypeFromActiveElement(){const e=P.getCurrentActiveBlock(),t=e?.querySelector(".johannes-content-element");return t&&t.getAttribute("data-content-type")||null}static splitContentAtCursorSelection(e){const t=[],n=window.getSelection();if(!n||0===n.rangeCount)return t;const o=n.getRangeAt(0),i=document.createRange();i.selectNodeContents(e),i.setEnd(o.startContainer,o.startOffset);const r=document.createRange();return r.selectNodeContents(e),r.setStart(o.endContainer,o.endOffset),e.lastChild&&r.setEndAfter(e.lastChild),t.push(i),t.push(r),t}static placeCursorAtStartOfEditableElement(e){setTimeout((()=>{if(e.isContentEditable){e.focus();const t=document.createRange();t.selectNodeContents(e),t.collapse(!0);const n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}else console.warn("The element is not editable.")}))}static placeCursorAtEndOfEditableElement(e){e.isContentEditable?requestAnimationFrame((()=>{e.focus();const t=document.createRange(),n=window.getSelection();t.selectNodeContents(e);let o=e;for(;o.lastChild;)o=o.lastChild;t.setEnd(o,o.nodeType===Node.TEXT_NODE?o.textContent.length:0),t.collapse(!1),n?.removeAllRanges(),n?.addRange(t)})):console.warn("The element is not editable.")}static getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}static isSelectedTextDescendantOf(e){const t=document.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).startContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!!n&&null!==n.closest(e)}static removeFilterText(){let e=null;const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0),o=n.commonAncestorContainer;if(o.nodeType===Node.TEXT_NODE&&o.parentElement?.isContentEditable){let i=o,r=n.startOffset;for(;i&&r>0;){if(e=(i.textContent?.substring(0,r)||"").lastIndexOf("/"),-1!==e){n.setStart(i,e),n.deleteContents();break}r=i.parentNode?.textContent?.lastIndexOf("/")||-1,i=i.parentNode}t.removeAllRanges(),t.addRange(n)}else console.warn("The cursor is not within a contentEditable element or a text node.")}else console.warn("No active selection.");return e}static findClickedElementOrAncestorByDataContentType(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.dataset.contentType===t)return n;let o=n.parentElement;for(;o;){if(o.dataset.contentType===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorById(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.id===t)return n;let o=n.parentElement;for(;o;){if(o.id===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorByClass(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.classList.contains(t))return n;let o=n.parentElement;for(;o;){if(o.classList.contains(t))return o;o=o.parentElement}return null}static isEventTargetDescendantOf(e,t){let n=e.target;if(!(e.target instanceof Element))return!1;for(;n&&n!==document.documentElement;){if(n.matches(t))return!0;n=n.parentElement}return!1}static getParentTargetBySelector(e,t){let n=e.target instanceof Element?e.target:e.target instanceof Node?e.target.parentElement:null;if(!n)return null;for(;n&&n!==document.documentElement;){if(n.matches(t))return n;n=n.parentElement}return null}static getParentFromSelection(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;if(n instanceof Element&&n.matches(e))return n;let o=n instanceof Element?n:n.parentElement;for(;o&&o!==document.documentElement;){if(o.matches(e))return o;o=o.parentElement}return null}static removeClassesWithPrefix(e,t){Array.from(e.classList).filter((e=>e.startsWith(t))).forEach((t=>e.classList.remove(t)))}static isTargetDescendantOfSelector(e,t){let n=null;return e.target instanceof HTMLElement?n=e.target:e.target instanceof Text&&(n=e.target.parentElement),!!n&&null!==n.closest(t)}static querySelectorIncludingSelf(e,t){return e.matches(t)?e:e.querySelector(t)}static sanitizeContentEditable(e){const t=e.innerHTML,n=window.getSelection();if(!n)return;let o=!1,i=0;if(n.rangeCount>0){const r=n.getRangeAt(0);r.endOffset===e.innerText.length&&t.endsWith("
")&&(o=!0,i=r.endOffset)}if(t.endsWith("
")){const t=e.lastChild;t&&"BR"===t.nodeName&&e.removeChild(t)}if(o){const t=new Range,o=this.getTextNodesIn(e);let r=0;for(const e of o){const n=e.length;if(r+n>=i){t.setStart(e,i-r),t.setEnd(e,i-r);break}r+=n}n.removeAllRanges(),n.addRange(t)}}static getTextNodesIn(e){let t=[];if(e.nodeType===Node.TEXT_NODE)t.push(e);else{const n=e.childNodes;for(let e=0;e0?t[n-1]:null}static getNextContentEditable(e){const t=Array.from(document.querySelectorAll('[contenteditable="true"]')),n=t.indexOf(e);return n0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left}}return{charIndex:0,horizontalPos:0}}static restoreCaretPosition2d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos);if(i0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left,verticalPos:n.top}}return{charIndex:0,horizontalPos:0,verticalPos:0}}static restoreCaretPosition3d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos),c=Math.abs(n.top-t.verticalPos),d=Math.sqrt(i**2+c**2);if(d0;)o.appendChild(o.nextSibling.firstChild);e.removeChild(o.nextSibling)}P.mergeInlineElements(o)}}}}!function(e){e.floatingToolbarDisplayed="floatingToolbarDisplayed",e.anchorButtonClicked="anchorButtonClicked",e.boldButtonClicked="boldButtonClicked",e.italicButtonClicked="italicButtonClicked",e.underlineButtonClicked="underlineButtonClicked",e.inlineCodeButtonClicked="inlineCodeButtonClicked",e.strikeThroughButtonClicked="strikeThroughButtonClicked",e.hiliteColorButtonClicked="hiliteColorButtonClicked",e.foreColorButtonClicked="foreColorButtonClicked",e.buttonGroupItemClicked="buttonGroupItemClicked",e.focusOnFirstRequested="focusOnFirstRequested",e.pressedEnterOnTitle="pressedEnterOnTitle",e.transformBlockRequested="transformBlockRequested",e.duplicateBlockRequested="duplicateBlockRequested",e.anchor="anchor",e.bold="bold",e.italic="italic",e.underline="underline",e.inlineCode="inlineCode",e.strikeThrough="strikeThrough",e.hiliteColor="hiliteColor",e.foreColor="foreColor",e.textFormatChanged="textFormatChanged",e.emittedCommand="emittedCommand",e.blockTypeChanged="blockTypeChanged",e.blockDeleted="blockDeleted",e.blockCloned="blockCloned",e.tableCellChanged="tableCellChanged"}(c||(c={})),function(e){e.LowImportance="100",e.SlightlyImportant="200",e.Neutral="300",e.ModeratelyImportant="400",e.VeryImportant="500",e.ExtremelyImportant="600"}(d||(d={}));class F extends R{dropdowns;separators;currentSelectionRange;htmlFocusedElementBeforeOpenQuickMenu;constructor(e){super({id:e}),this.dropdowns=[],this.separators=[],this.currentSelectionRange=null,this.htmlFocusedElementBeforeOpenQuickMenu=null}init(){const e=document.createElement("div");e.id=this.props.id,e.style.display="none",e.classList.add("floating-toolbar","select-wrapper","soft-box-shadow"),e.style.zIndex=d.SlightlyImportant;const t=document.createElement("div");return e.appendChild(t),e}get display(){return"flex"}hide(){this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.currentSelectionRange=null,super.hide())}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendButtonGroup(e){this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.separators.push(e),this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener(c.blockDeleted,(()=>{this.hide()})),document.addEventListener(c.blockTypeChanged,(()=>{this.hide()}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}!function(e){e.HiliteColorRed="#FDDEDE",e.HiliteColorGreen="#D7F7DC",e.HiliteColorBlue="#D9EDF6",e.HiliteColorYellow="#FAF4D1",e.HiliteColorGrey="#E1E0E0",e.HiliteColorNone="transparent",e.BackgroundColorCellRed="#FDDEDE",e.BackgroundColorCellGreen="#D7F7DC",e.BackgroundColorCellBlue="#D9EDF6",e.BackgroundColorCellYellow="#FAF4D1",e.BackgroundColorCellGrey="#E1E0E0",e.BackgroundColorCellNone="transparent",e.ForeColorRed="#D44C47",e.ForeColorGreen="#448361",e.ForeColorBlue="#337EA9",e.ForeColorYellow="#CB912F",e.ForeColorGrey="#787774",e.ForeColorInitial="initial",e.BackgroundColorRed="#FDDEDE",e.BackgroundColorGreen="#D7F7DC",e.BackgroundColorBlue="#D9EDF6",e.BackgroundColorYellow="#FAF4D1",e.BackgroundColorGrey="#E1E0E0",e.BackgroundColorNone="transparent",e.IconActiveBlue="#2382e2",e.IconDefaultBlack="#37352fd9",e.Red="red",e.Tomato="#EB5757",e.OriginalTableColor="#84888d"}(u||(u={})),function(e){e.CalloutBackgroundRed="callout-background-red",e.CalloutBackgroundGreen="callout-background-green",e.CalloutBackgroundBlue="callout-background-blue",e.CalloutBackgroundYellow="callout-background-yellow",e.CalloutBackgroundGrey="callout-background-grey",e.CalloutBackgroundNone="callout-background-none"}(m||(m={})),function(e){e.toggleBold="bold",e.toggleItalic="italic",e.toggleHiliteColor="hiliteColor",e.changeCalloutBackgroundColor="changeCalloutBackgroundColor",e.toggleForeColor="foreColor",e.toggleInlineCode="inlineCode",e.toggleLink="createLink",e.linkReadyToInsert="linkReadyToInsert",e.toggleUnderline="underline",e.toggleStrikeThrough="strikeThrough",e.removeFormat="removeFormat",e.copySelected="copySelected",e.cutSelected="cutSelected",e.past="past",e.transformBlock="transformBlock",e.duplicateBlock="duplicateBlock",e.deleteBlock="deleteBlock",e.createDefaultBlock="createDefaultBlock",e.focusOnNextBlock="focusOnNextBlock",e.focusOnPreviousBlock="focusOnPreviousBlock",e.mergeWithPreviousBlock="mergeWithPreviousBlock",e.mergeWithNextBlock="mergeWithNextBlock",e.focusOnFirstBlock="focusOnFirstBlock",e.deleteBlockAndFocusOnPrevious="deleteBlockAndFocusOnPrevious",e.deleteBlockAndFocusOnNext="deleteBlockAndFocusOnNext",e.JustifyLeft="justifyLeft",e.JustifyCenter="justifyCenter",e.JustifyRight="justifyRight",e.insertNew="insertNew",e.insertTableRowAbove="insertTableRowAbove",e.insertTableRowBelow="insertTableRowBelow",e.insertTableColumnLeft="insertTableColumnLeft",e.insertTableColumnRight="insertTableColumnRight",e.showInsertTableColumnElement="showInsertTableColumnElement",e.showInsertTableRowElement="showInsertTableRowElement",e.hideInsertTableColumnElement="hideInsertTableColumnElement",e.hideInsertTableRowElement="hideInsertTableRowElement",e.toggleCellHiliteColor="toggleCellHiliteColor",e.removeColumn="removeColumn",e.removeRow="removeRow",e.changeTableBorderColor="changeTableBorderColor",e.changeCodeBlockLanguage="changeCodeBlockLanguage"}(h||(h={}));class _{color;constructor(e){this.color=e}}class V{classKey;value;intention;constructor(e,t,n){this.classKey=e,this.value=t,this.intention=n}}class j{classKey;constructor(e){this.classKey=e}}class Y{}class z{}class U{language;blockId;constructor(e,t){this.blockId=e,this.language=t}}class G{static emitCodeBlockLanguageChangedEvent(e,t,n){const o=new CustomEvent(s.ChangeBlockToolbarLanguage,{detail:{targetClass:e,action:new U(t,n)}});document.dispatchEvent(o)}static emitShowElementEvent(e){const t=new CustomEvent(s.ShowElement,{detail:{targetId:e,action:new z}});document.dispatchEvent(t)}static emitCloseElementEvent(e){const t=new CustomEvent(s.CloseElement,{detail:{targetId:e,action:new Y}});document.dispatchEvent(t)}static emitChangeComponentColorEvent(e,t){const n=new CustomEvent(s.ColorChangeRequest,{detail:{targetId:e,action:new _(t)}});document.dispatchEvent(n)}static emitShowHideActiveElementEvent(e,t,n){"hiliteColor"==e&&t==u.HiliteColorNone&&(n="hide"),"foreColor"==e&&t==u.ForeColorInitial&&(n="hide"),"backgroundColor"==e&&t==u.BackgroundColorNone&&(n="hide");const o=new CustomEvent(s.ShowHideActiveButton,{detail:{targetClass:e,action:new V(e,t,n)}});document.dispatchEvent(o)}static emitResetActiveButtonsElementEvent(e){const t=new CustomEvent(s.ResetActiveButtons,{detail:{targetClass:e,action:new j(e)}});document.dispatchEvent(t)}static emitChangeTableBorderColorEvent(e,t){const n=new CustomEvent(c.emittedCommand,{detail:{command:h.changeTableBorderColor,value:t,scope:e}});document.dispatchEvent(n)}}!function(e){e.Link="linkButton",e.Bold="boldButton",e.Italic="italicButton",e.Underline="underlineButton",e.InlineCode="inlineCodeButton",e.Strikethrough="strikethroughButton",e.AlignLeft="alignLeft",e.AlignCenter="alignCenter",e.AlignRight="alignRight"}(A||(A={})),function(e){e.Shift="Shift",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Control="Control",e.Space=" ",e.Delete="Delete"}(p||(p={}));class Z extends F{static id="textFloatingToolbar";static instance;textOperationsService;initialRect=null;lockedHide=!1;debounceTimer=null;constructor(e){if(Z.instance)throw new Error("Use TextContextFloatingToolbar.getInstance() to get instance.");super(Z.id),this.htmlElement.style.zIndex=d.VeryImportant,this.textOperationsService=e,this.attachEvents()}static getInstance(){const e=D.Instance.resolve("ITextOperationsService");return Z.instance||(Z.instance=new Z(e)),Z.instance}processSelectionChangeEffects(){setTimeout((()=>{G.emitResetActiveButtonsElementEvent("hiliteColor"),G.emitResetActiveButtonsElementEvent("foreColor");const e=this.textOperationsService.queryCommandState("createLink"),t=this.textOperationsService.queryCommandState("bold"),n=this.textOperationsService.queryCommandState("italic"),o=this.textOperationsService.queryCommandState("underline"),i=this.textOperationsService.queryCommandState("inlineCode"),r=this.textOperationsService.queryCommandState("strikeThrough"),l={};l[u.HiliteColorRed]=this.textOperationsService.queryHiliteColor(u.HiliteColorRed),l[u.HiliteColorGreen]=this.textOperationsService.queryHiliteColor(u.HiliteColorGreen),l[u.HiliteColorBlue]=this.textOperationsService.queryHiliteColor(u.HiliteColorBlue),l[u.HiliteColorYellow]=this.textOperationsService.queryHiliteColor(u.HiliteColorYellow),l[u.HiliteColorGrey]=this.textOperationsService.queryHiliteColor(u.HiliteColorGrey);const s={};s[u.ForeColorRed]=this.textOperationsService.queryForeColor(u.ForeColorRed),s[u.ForeColorGreen]=this.textOperationsService.queryForeColor(u.ForeColorGreen),s[u.ForeColorBlue]=this.textOperationsService.queryForeColor(u.ForeColorBlue),s[u.ForeColorYellow]=this.textOperationsService.queryForeColor(u.ForeColorYellow),s[u.ForeColorGrey]=this.textOperationsService.queryForeColor(u.ForeColorGrey),Object.entries(l).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")})),Object.entries(s).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("foreColor",e,"show")})),this.emitChangeComponentColorEvent(e,A.Link),this.emitChangeComponentColorEvent(t,A.Bold),this.emitChangeComponentColorEvent(n,A.Italic),this.emitChangeComponentColorEvent(i,A.InlineCode),this.emitChangeComponentColorEvent(o,A.Underline),this.emitChangeComponentColorEvent(r,A.Strikethrough)}),20)}emitChangeComponentColorEvent(e,t){e?G.emitChangeComponentColorEvent(t,u.IconActiveBlue):G.emitChangeComponentColorEvent(t,u.IconDefaultBlack)}processAfterChange(e){const t=document.getSelection();t&&!t.isCollapsed&&this.processSelectionChangeEffects()}attachEvents(){let e,t=!1;this.htmlElement.addEventListener(a.Mouseup,(e=>{e.preventDefault()})),document.addEventListener(a.Mouseup,this.processAfterChange.bind(this)),document.addEventListener(a.BblClick,this.processAfterChange.bind(this)),document.addEventListener(a.SelectionChange,this.processAfterChange.bind(this)),document.addEventListener(a.Keydown,(e=>{e.shiftKey&&(t=!0)})),document.addEventListener(a.Keyup,(e=>{e.key===p.Shift&&(t=!1,this.showHide(e,t))})),document.addEventListener(a.Mousedown,(()=>{t=!0})),document.addEventListener(a.Mouseup,(n=>{t=!1,this.showHide(n,t),clearTimeout(e),e=setTimeout((()=>{t=!1,this.showHide(n,t)}),100)})),document.addEventListener(a.SelectionChange,(e=>{this.showHide(e,t)})),document.addEventListener(a.Keydown,(e=>{setTimeout((()=>{this.canHide&&e.key===p.Escape&&!this.lockedHide&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide())}),10)})),super.attachEvents()}shouldUpdatePosition(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0).getBoundingClientRect();return!this.initialRect||(Math.abs(t.left-this.initialRect.left)>10||Math.abs(t.top-this.initialRect.top)>10)}showHide(e,t){const n=this.hasSelection();if(!n){if(this.lockedHide)return;return this.hide(),void(this.initialRect=null)}if(n&&!t)if(this.isVisible){if(this.shouldUpdatePosition()&&(P.isSelectedTextDescendantOf(".gist")||P.isSelectedTextDescendantOf(".gist")))return}else{if(P.isSelectedTextDescendantOf(".ignore-text-floating-toolbar")||P.isSelectedTextDescendantOf(".gist"))return;this.show()}}hasSelection(){const e=window.getSelection();return!!(e&&e.rangeCount>0&&""!==e.toString().trim())}changeToolbarPositionToBeClosedToSelection(){const e=window.getSelection();if(!e||0===e.rangeCount)return void console.error("No selection found");this.currentSelectionRange=e.getRangeAt(0);const t=this.currentSelectionRange.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20);const a=this.htmlElement.offsetHeight;let c=i+window.scrollY-a-10;c<0&&(c=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${c}px`}show(){const e=window.getSelection();e&&0!==e.rangeCount?P.findClosestAncestorOfActiveElementByClass("title")||(this.changeToolbarPositionToBeClosedToSelection(),this.hideTurnIntoDropdownIfInCell()):console.error("No selection found")}hideTurnIntoDropdownIfInCell(){const e=P.isSelectionInTableCell();this.dropdowns.forEach((t=>{"turnIntoMenu"==t.id&&(t.htmlElement.style.display=e?"none":this.display)})),this.separators.forEach((t=>{"turnIntoSeparator"==t.id&&(t.htmlElement.style.display=e?"none":this.display)}))}updatePosition(){const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0).getBoundingClientRect();this.setPosition(t)}}setPosition(e){const t=this.htmlElement.offsetWidth;let n=e.left+window.scrollX-50;n+t>window.innerWidth&&(n=window.innerWidth-t-20);const o=this.htmlElement.offsetHeight;let i=e.top+window.scrollY-o-10;i<0&&(i=e.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}hide(){this.canHide&&(this.currentSelectionRange=null,super.hide())}lockHide(){this.lockedHide=!0}unlockHide(){this.lockedHide=!1}}class K extends R{parentWrapper;constructor(){super({})}init(){const e=document.createElement("input");return e.id="linkBoxInput",e.type="url",e.placeholder="Paste or type a link...",e.style.position="relative",e}setParentWrapper(e){this.parentWrapper=e}}class W extends R{inputLinkBox;highlights=[];button;textContextFloatingToolbar;constructor(){const e=new K,t=document.createElement("button");super({inputLinkBox:e,button:t}),this.id="linkBox",this.inputLinkBox=e,this.button=t,e.setParentWrapper(this),this.textContextFloatingToolbar=Z.getInstance(),this.attachEvent()}init(){const e=document.createElement("div");e.id="linkBox",e.style.display="none",e.classList.add("dependent-box","soft-box-shadow"),e.style.position="absolute";const t=document.createElement("div");t.classList.add("header"),t.innerText="Link";const n=document.createElement("div");return n.appendChild(this.props.inputLinkBox.htmlElement),n.classList.add("link-box-shell"),this.props.button.classList.add("blue-button"),this.props.button.innerHTML="Insert",n.appendChild(this.props.button),e.appendChild(t),e.appendChild(n),e}attachEvent(){document.addEventListener(a.Keydown,(e=>{this.canHide&&e.key===p.Escape&&(e.stopImmediatePropagation(),this.hide())}),!0),document.addEventListener(a.Keydown,(function(e){e.key===p.Control&&document.body.classList.add("ctrl-active")})),document.addEventListener(a.Keyup,(function(e){e.key===p.Control&&document.body.classList.remove("ctrl-active")})),this.inputLinkBox.htmlElement.addEventListener(a.Keydown,(e=>{e.key==p.Enter&&this.insertLink(e)}),!0),document.addEventListener(a.Click,(e=>{if(e.ctrlKey){const t=e.target;if("A"===t.tagName&&t.getAttribute("href")){const e=t.getAttribute("href");return void window.open(e,"_blank")}}!this.canHide||e.target.closest("#linkBox")||e.target.closest("#textFloatingToolbar")||this.hide()})),this.button.addEventListener(a.Click,this.insertLink.bind(this),!0),super.attachUIEvent()}handleShowElementEvent(e){const t=e.detail;t.targetId!=this.id||this.isVisible?t.targetId==this.id&&this.isVisible&&(e.stopImmediatePropagation(),this.hide()):(e.stopImmediatePropagation(),this.show())}insertLink(e){e.preventDefault(),e.stopImmediatePropagation();const t=this.inputLinkBox.htmlElement.value,n=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;if(O.isValidUrl(n))this.hide(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.linkReadyToInsert,value:n}}));else{const e=this.inputLinkBox.htmlElement;e.style.backgroundColor="rgb(253, 222, 222)",e.classList.add("shake-animation"),setTimeout((()=>{e.classList.remove("shake-animation")}),1e3)}}show(){const e=this.inputLinkBox.htmlElement;e.style.backgroundColor="white",this.textContextFloatingToolbar.lockHide();const t=document.getSelection()?.getRangeAt(0);t&&(this.positionLinkComponentBelowSelection(t),this.highlightSelectedText(t),super.show(),setTimeout((()=>{e.focus()}),100))}positionLinkComponentBelowSelection(e){const t=e.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20),this.htmlElement.offsetHeight;let a=i+window.scrollY+40;a<0&&(a=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${a}px`}hide(){this.textContextFloatingToolbar.unlockHide(),super.hide(),this.removeHighlights(),this.inputLinkBox.htmlElement.value="";const e=this.textContextFloatingToolbar.currentSelectionRange;e&&(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e))}highlightSelectedText(e){const t=e.getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class Q extends R{elementFactoryService;static editorId="johannesEditor";static instance;memento;title;content;addBlock;textFloatingToolbar;quickMenu;tableContextToolbar;mediaInputter;inputLinkBoxWrapper;constructor(e,t,n,o,i,r,l,s,a,c,d){if(super({elementFactoryService:e,blockOperationsService:t,title:o,content:i,addBlock:r,floatingToolbar:l,quickMenu:s,tableToolbar:a,mediaInputter:c,inputLinkBoxWrapper:d}),Q.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.inputLinkBoxWrapper=d,this.elementFactoryService=e,this.memento=n,this.addBlock=r,this.textFloatingToolbar=l,this.quickMenu=s,this.tableContextToolbar=a,this.mediaInputter=c,this.attachEvents(),Q.instance=this,this.memento.saveState()}init(){const e=document.getElementById(Q.editorId)||document.createElement("div");e.classList.add("johannes-editor");const t=document.createElement("div");return t.classList.add("content-wrapper"),window.editorConfig,t.appendChild(this.props.title.htmlElement),t.appendChild(this.props.content.htmlElement),e.appendChild(t),window.editorConfig,e.appendChild(this.props.addBlock.htmlElement),window.editorConfig,e.appendChild(this.props.floatingToolbar.htmlElement),window.editorConfig,e.appendChild(this.props.quickMenu.htmlElement),e.appendChild(this.props.tableToolbar.htmlElement),e.appendChild(this.props.mediaInputter.htmlElement),e.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}static getInstance(e,t,n,o,i,r,l){const s=D.Instance.resolve("IElementFactoryService"),a=D.Instance.resolve("IBlockOperationsService"),c=D.Instance.resolve("IMemento"),d=new W;return Q.instance||(Q.instance=new Q(s,a,c,e,t,n,o,i,r,l,d)),Q.instance}attachEvents(){const e=document.getElementById(Q.editorId);if(e?.addEventListener("mouseover",(e=>{const t=e.target;if(t instanceof Node){let e=t;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const t=e.closest(".block");t&&this.appendDragHandler(t)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",t)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const t=e.clipboardData;if(t){const e=t.getData("text/plain");Q.insertTextAtCursor(e)}}}),!0),this.attachDragHandler()}static insertTextAtCursor(e){const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents();const o=document.createTextNode(e);n.insertNode(o),n.setStartAfter(o),n.setEndAfter(o),t.removeAllRanges(),t.addRange(n)}}appendDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");let n=t?.querySelector(".drag-handler");!n&&t&&(n=this.elementFactoryService.create(H.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(n))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");if(t){const e=t.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}attachDragHandler(){let e=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",this.htmlElement.addEventListener("dragstart",(t=>{t.target?.classList?.contains("drag-handler")&&(e=t.target?.closest(".block"),e.setAttribute("draggable","true"),setTimeout((()=>{e.style.opacity="0.5"}),0))})),this.htmlElement.addEventListener("dragend",(()=>{setTimeout((()=>{e&&(e.style.opacity="",e.removeAttribute("draggable"),e=null),t.remove()}),0)})),this.htmlElement.addEventListener("dragover",(n=>{n.preventDefault();let o=n.target?.closest(".block");if(o&&o!==e){let e=o.getBoundingClientRect(),i=e.y+e.height/2;n.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),this.htmlElement.addEventListener("drop",(n=>{n.preventDefault(),e&&t&&t.parentElement&&(t.parentElement.insertBefore(e,t),t.remove())}))}}class X extends R{blockOperationsService;icon;constructor(e,t){super({icon:t}),this.blockOperationsService=e,this.icon=t,this.attachEvents()}init(){const e=document.createElement("button");return e.title="Add a new block",e.classList.add("add-block","block-operation","pointer"),e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(h.createDefaultBlock,!1)}))}static create(e){const t=D.Instance.resolve("IBlockOperationsService");return new X(t,e)}}class $ extends R{button;constructor(e){super({button:e}),this.button=e}init(){const e=document.createElement("div");return e.classList.add("add-block-wrapper"),e.appendChild(this.props.button.htmlElement),e}static create(e){return new $(e)}}class J{static medium="1rem";static large="1.25rem"}class ee extends R{useElement;constructor(e,t){super({iconId:e,size:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="red !important";let t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.iconId}`),t.style.color="red !important",e.appendChild(t),e.setAttribute("width",this.props.size),e.setAttribute("height",this.props.size),e.setAttribute("fill","currentColor"),e}clone(){return new ee(this.props.iconId,this.props.sizes)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}static create(e,t){return new ee(e,t)}}class te{static build(){return $.create(X.create(ee.create(i.Plus,J.medium)))}}class ne extends R{id;dropdownButton;dropdownList;constructor(e,t,n){super({id:e}),this.id=e,this.dropdownButton=t,this.dropdownList=n,t.appendTo(this),n.appendTo(this)}init(){const e=document.createElement("div");return e.id=this.props.id,e.classList.add("select-wrapper"),e}get display(){return"block"}static create(e,t,n,o=[]){const i=new ne(e+O.generateUniqueId(),t,n);return i.addCssClass(...o),i}}class oe{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let t=0;for(let n of this)e(n.value,t,this),t++}any(e){let t=this.head;for(;t;){if(e(t.value))return!0;if(t=t.nextNode,t===this.head)break}return!1}findFirst(e){if(!this.head)return null;let t=this.head;do{if(e(t.value))return t;t=t.nextNode}while(t&&t!==this.head);return null}findLast(e){if(!this.tail)return null;let t=this.tail;do{if(e(t.value))return t;t=t.previousNode}while(t&&t!==this.tail);return null}find(e){let t=this.head;for(;t;){if(t.value==e)return t;if(t=t.nextNode,t===this.head)break}return null}}class ie{parentList;previousNode;nextNode;value;constructor(e,t){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=t}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let t=this.nextNode;const n=this;for(;t;){if(e(t.value))return t;if(t=t.nextNode,t===n)break}return null}getPreviousSatisfying(e){let t=this.previousNode;const n=this;for(;t&&t!==n;){if(e(t.value))return t;if(t=t.previousNode,t===this)break}return null}}class re extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(t.setPrevious(this.tail),t.setNext(this.head),this.tail.setNext(t),this.head.setPrevious(t),this.tail=t):(this.head=t,this.tail=t,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class le extends R{id;command;value;activeIcon;leftIcon;title;onFocusFunctionList=[];onLoseFocusFunctionList=[];parentDropdownMenuList;constructor(e,t,n,o,i,r,l=null){const s=["list-item","option","option-hover","block-operation","no-list-style","no-selection"],a=new ee("icon-material-small-check",J.medium);a.htmlElement.style.visibility="hidden",o&&i&&(i.style.color=o),super({id:e,classList:s,leftIcon:i,title:r,icon:a,shortcut:l}),this.id=e,this.classList=s,this.leftIcon=i,this.command=n,this.value=o,this.title=r,this.parentDropdownMenuList=t,this.activeIcon=a,this.attachEvents()}addClass(e){this.classList.push(e),this.htmlElement.classList.add(e)}attachOnFocus(e,...t){this.onFocusFunctionList.push((()=>e(...t)))}attachOnLoseFocus(e,...t){this.onLoseFocusFunctionList.push((()=>e(...t)))}get display(){return"flex"}focus(){this.htmlElement.classList.add("option-focused"),this.onFocusFunctionList.forEach((e=>e()))}removeFocus(){this.htmlElement.classList.remove("option-focused"),this.onLoseFocusFunctionList.forEach((e=>e()))}init(){const e=document.createElement("li");e.id=this.props.id;const t=this.props.classList;e.classList.add("pointer",...t),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),this.props.leftIcon&&n.appendChild(this.props.leftIcon);const o=document.createElement("span");if(o.innerText=this.props.title,n.appendChild(o),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const t=document.createElement("span");t.innerText=this.props.shortcut,t.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(t)}return e}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:this.command,value:this.value,block:P.getParentFromSelection(".block")||P.getParentTargetBySelector(e,".block")}});document.dispatchEvent(t)}attachEvents(){this.attachUIEvent(),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousemove,(async()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault(),e.stopImmediatePropagation(),this.emitCommandEvent(e)})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&t.targetClass.includes("code-block-language-menu")){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.value==e.language?this.activeIcon?.changeVisibilityToVisible():this.activeIcon?.changeVisibilityToHidden())}}attachUIEvent(){document.addEventListener(s.ShowHideActiveButton,this.handleShowHideActiveButtonEvent.bind(this)),document.addEventListener(s.ResetActiveButtons,this.handleResetActiveButtonsEvent.bind(this))}handleShowHideActiveButtonEvent(e){const t=e.detail;if(this.classList?.includes(t.targetClass)){const e=t.action,n=e.value;this.value?.toLowerCase()==n.toLowerCase()&&"show"==e.intention&&this.activeIcon?.changeVisibilityToVisible()}}handleResetActiveButtonsEvent(e){const t=e.detail;this.classList?.includes(t.targetClass)&&this.activeIcon?.changeVisibilityToHidden()}}class se extends R{parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;filter="";constructor(e){super({id:e}),this.id=e,this.dropdownItems=new re,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e.style.zIndex=d.ExtremelyImportant,e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener(a.Keydown,(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&(e.stopImmediatePropagation(),e.preventDefault(),this.currentFocusedMenuItem.value.emitCommandEvent(e))}),!0),document.addEventListener(a.Click,(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener(a.Keydown,(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()),e.key!=p.Escape||this.htmlElement.closest(".floating-toolbar")||(e.stopImmediatePropagation(),e.preventDefault(),this.hide()))})),document.addEventListener(a.Keydown,this.handlerKeyDownEvent.bind(this)),document.addEventListener(c.blockCloned,(()=>{this.hide()})),this.attachUIEvent()}handlerKeyDownEvent(e){!this.isVisible||!/^[a-zA-Z]$/.test(e.key)||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey?this.isVisible&&e.key===p.Backspace&&(this.filter=this.filter.slice(0,-1),this.applyFilter()):(e.preventDefault(),this.filter+=e.key,this.applyFilter())}applyFilter(){this.dropdownItems.forEach((e=>{""==e.value||e.value?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())||e.title?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())?e.show():e.hide()}))}show(){this.filter="",this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),this.applyFilter(),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}static create(e,t=[]){const n=new se(e+O.generateUniqueId());return n.addCssClass(...t),n}}class ae extends R{id;constructor(e){super({id:e}),this.id=e}init(){const e=document.createElement("div");return e.id=this.props.id,e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class ce extends R{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e}}class de extends R{command;showUI;icon;constructor(e,t,n){super({title:t,icon:n}),this.command=e,this.showUI=e==h.toggleLink,this.icon=n,this.attachEvents()}init(){const e=document.createElement("button");return e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener(a.Click,(async e=>{const t=P.findClickedElementOrAncestorByClass(e,"block");document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:this.command,showUI:this.showUI,block:t}}))})),document.addEventListener(s.ColorChangeRequest,(e=>{const t=e.detail;this.id==t.targetId&&this.icon.changeColor(t.action.color)}))}static create(e,t,n){return new de(e,t,n)}}class ue extends R{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class me extends R{parentDropdownMenuList;constructor(e,t){super({title:t}),this.parentDropdownMenuList=e}title="";activeIcon;value="";changeActiveIconToVisible(){}getLeftIconBackgroundColor(){return null}resetActiveIcon(){}attachOnLoseFocus(e){throw new Error("Method not implemented.")}attachOnFocus(e){throw new Error("Method not implemented.")}emitCommandEvent(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li");e.classList.add("no-list-style");const t=document.createElement("h3");return t.innerText=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}}!function(e){e.BackgroundOptionRed="BackgroundOptionRed",e.BackgroundOptionGreen="BackgroundOptionRed",e.BackgroundOptionBlue="BackgroundOptionRed",e.BackgroundOptionYellow="BackgroundOptionRed",e.BackgroundOptionGrey="BackgroundOptionRed",e.BackgroundOptionNone="BackgroundOptionRed"}(C||(C={}));class he{static alignTool(){const e=new ce;return de.create(h.JustifyLeft,"Left",ee.create(i.JustifyStart,J.large)).appendTo(e),de.create(h.JustifyCenter,"Center",ee.create(i.JustifyCenter,J.large)).appendTo(e),de.create(h.JustifyRight,"Right",ee.create(i.JustifyEnd,J.large)).appendTo(e),e}static colorTool(){const e=new se("colorInteractiveOptionSelect"+O.generateUniqueId()),t=new pe("colorInteractiveButton"+O.generateUniqueId(),new ue("white").htmlElement,e);t.addCssClass("color-interactive-button");const n=new ne("colorInteractionOptionsMenu"+O.generateUniqueId(),t,e);e.append(new me(e,"Background"));const o=new le(C.BackgroundOptionRed+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("block-toolbox-color");const i=new le(C.BackgroundOptionGreen+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("block-toolbox-color");const r=new le(C.BackgroundOptionBlue+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("block-toolbox-color");const l=new le(C.BackgroundOptionYellow+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("block-toolbox-color");const s=new le(C.BackgroundOptionGrey+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("block-toolbox-color");const a=new le(C.BackgroundOptionNone+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundNone,new ue(u.HiliteColorNone).htmlElement,"None");return a.addClass("block-toolbox-color"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static languageSelectionTool(){const e=se.create("languageSelectionInteractiveOptionSelect"),t=pe.create("languageSelectionInteractiveButton","Plain Text",e,!0,["code-block-language-menu","color-interactive-button"]),n=ne.create("languageSelectionInteractionOptionsMenu",t,e);return e.append(new me(e,"Language")),Object.entries(Ae.languageMap).sort(((e,t)=>e[1].localeCompare(t[1]))).forEach((([t,n])=>{const o=new le("languageSelectionItem-"+O.generateUniqueId(),e,h.changeCodeBlockLanguage,t,null,n);"plaintext"==o.value&&o.activeIcon?.changeVisibilityToVisible(),e.append(o)})),n}static extraOptions(){const e=new ee("icon-material-more",J.large),t=se.create("moreInteractiveOptionSelect",["media-more-option-select"]),n=pe.create("moreInteractiveOptionButton",e.htmlElement,t,!1,["moreMediaOptionsButton"]),o=ne.create("moreInteractiveOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("duplicateOption"+O.generateUniqueId(),t,h.duplicateBlock,null,ee.create(i.Duplicate,J.large).htmlElement,"Clone","Ctrl+D"));const r=new le("deleteOption"+O.generateUniqueId(),t,h.deleteBlock,null,ee.create(i.Trash,J.large).htmlElement,"Delete","Shift+Del");return r.addCssClass("danger-option"),t.append(r),o}}!function(e){e.TD="td",e.TABLE="table"}(g||(g={}));class Ae{static instance;static languageMap={ada:"Ada",apache:"Apache Config",applescript:"AppleScript",arduino:"Arduino",asciidoc:"AsciiDoc",bash:"Bash",basic:"BASIC",c:"C",csharp:"C#",cpp:"C++",css:"CSS",coffeescript:"CoffeeScript",dart:"Dart",go:"Go",html:"HTML",java:"Java",javascript:"JavaScript",json:"JSON",markdown:"Markdown",perl:"Perl",php:"PHP",plaintext:"Plain Text",python:"Python",ruby:"Ruby",scss:"SCSS",shell:"Shell",sql:"SQL",typescript:"TypeScript",xml:"XML",yaml:"YAML"};constructor(){if(Ae.instance)throw new Error("Use BlockToolbox.getInstance() to get instance.");this.attachEvents()}static getInstance(){return Ae.instance||(Ae.instance=new Ae),Ae.instance}listen(){console.log("Listening block toolboxes...")}attachEvents(){document.addEventListener(a.Mouseover,this.insertToolboxIntoBlockOnce.bind(this)),document.addEventListener(a.Focusin,this.handleTableBehaviorFocusIn.bind(this)),document.addEventListener(a.Focusout,this.handleTableBehaviorFocusOut.bind(this)),document.addEventListener(a.Click,this.handleClickEvent.bind(this))}handleClickEvent(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}handleTableBehaviorFocusIn(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!0)}handleTableBehaviorFocusOut(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}toolboxVisibilityController(e,t){const n=e.closest(".block");if(n){const e=n.querySelector(".block-toolbar");e&&(t?e.classList.add("hidden"):e.classList.remove("hidden"))}}insertToolboxIntoBlockOnce(e){const t=e.target.closest(`.${r.IncludeBlockToolbarClass}`);if(!t)return;const n=t.closest(".block");if(n&&null===n.querySelector(".block-toolbar-wrapper")){const e=t.classList.contains(r.LanguageSelectionToolClass),o=t.classList.contains(r.AlignToolClass),i=t.classList.contains(r.ColorToolClass),l=t.classList.contains(r.ExtraOptionsClass),s=Ae.createToolbox(e,o,i,l);n&&(n.appendChild(s),n.addEventListener(a.Mouseenter,(e=>this.resetToolbox(e,n))),n.addEventListener(a.Mousemove,(e=>{const t=s.firstChild?.id,o=document.getElementById(t);o&&(n.contains(e.target)?o.style.display="flex":this.hideBlockToolbox(s))})),n.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s))),document.addEventListener(a.Click,(e=>{P.isTargetDescendantOfSelector(e,`#${n.id}`)||this.hideBlockToolbox(s)})),n.querySelectorAll("iframe").forEach((e=>{e.addEventListener(a.Mouseenter,(()=>{const e=s.firstChild?.id,t=document.getElementById(e);t&&(t.style.display="flex",this.changeToolbarColor(n))})),e.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s)))})))}}changeToolbarColor(e){const t=e.querySelector(".color-interactive-button div"),n=e.querySelector(".callout-wrapper");if(t&&n){var o=window.getComputedStyle(n);t.style.backgroundColor=o.backgroundColor,t.style.borderColor=o.borderColor,t.style.borderColor="#ccc"}}hideBlockToolbox(e){const t=e.firstChild?.id,n=document.getElementById(t);n&&(Ae.isAnyDependentBoxVisible(n)||(n.style.display="none"))}static isAnyDependentBoxVisible(e){const t=e.querySelectorAll(".dependent-box");for(const e of t){const t=window.getComputedStyle(e);if("none"!==t.display&&"hidden"!==t.visibility)return!0}return!1}resetToolbox(e,t){const n=t.querySelector(".block-toolbar");if(!n)return void console.log("block-toolbar not found");const o=n.querySelector(".media-more-option-select");o&&(o.style.display="none");const i=n.querySelector(".color-interactive-select");i&&(i.style.display="none"),this.changeToolbarColor(t)}static createToolbox(e=!1,t=!1,n=!1,o=!1){const i=document.createElement("div");i.classList.add("block-toolbar-wrapper","exclude-from-clone",l.EditorOnly),i.style.position="relative";const r=document.createElement("div");return r.classList.add("block-toolbar","soft-box-shadow"),r.id=`btb-${O.generateUniqueId()}`,i.appendChild(r),e&&r.appendChild(he.languageSelectionTool().htmlElement),t&&r.appendChild(he.alignTool().htmlElement),n&&r.appendChild(he.colorTool().htmlElement),o&&r.appendChild(he.extraOptions().htmlElement),i}}class pe extends R{dropdownList;svgIcon;constructor(e,t,n,o=!0){const i=new ee("icon-wordpress-chevron-down",J.medium);super({id:e,title:t,dropdownList:n,svgIcon:o?i:null}),this.dropdownList=n,this.svgIcon=i,this.attachEvents(),n.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover","pointer"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const t=document.createElement("span");t.classList.add("no-selection"),t.textContent=this.props.title,e.appendChild(t)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible?this.dropdownList.hide():this.dropdownList.show()})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&this.classList.includes(t.targetClass)){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.changeTitle(Ae.languageMap[e.language]),this.dropdownList.hide())}}get display(){return"block"}changeTitle(e){const t=this.htmlElement.querySelector("span");t&&(t.textContent=e)}static create(e,t,n,o,i=[]){const r=new pe(e+O.generateUniqueId(),t,n,o);return r.addCssClass(...i),r}}!function(e){e.ColorTextOptionSelect="colorTextOptionSelect"}(b||(b={})),function(e){e.ColorTextOptionsMenu="colorTextOptionsMenu"}(E||(E={}));class Ce{static build(){const e=Z.getInstance();return e.appendDropdown(Ce.turnIntoDropdown()),e.appendSeparator(Ce.separator("turnIntoSeparator")),e.appendButtonGroup(Ce.buttonGroup()),e.appendDropdown(Ce.colorDropdown()),e.appendSeparator(Ce.separator("textOperationsSeparator")),e.appendDropdown(Ce.moreOptionsDropdown()),e}static turnIntoDropdown(){const e=new se("turnIntoSelect"),t=new pe("turnIntoButton","Text",e),n=new ne("turnIntoMenu",t,e);return e.append(new me(e,"Turn into")),e.append(new le("turnIntoOptionText",e,h.transformBlock,H.ELEMENT_TYPES.PARAGRAPH,ge.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),e.append(new le("turnIntoOptionTodoList",e,h.transformBlock,H.ELEMENT_TYPES.CHECK_LIST,ge.todo_list.htmlElement,"Todo list","Ctrl+1")),e.append(new le("turnIntoOptionBulletedList",e,h.transformBlock,H.ELEMENT_TYPES.BULLETED_LIST,ge.b_list.htmlElement,"Bulleted list","Ctrl+.")),e.append(new le("turnIntoOptionNumberedList",e,h.transformBlock,H.ELEMENT_TYPES.NUMBERED_LIST,ge.n_list.htmlElement,"Numbered list","Ctrl+/")),e.append(new le("turnIntoOptionBlockCode",e,h.transformBlock,H.ELEMENT_TYPES.CODE,ge.code.htmlElement,"Block code")),e.append(new le("turnIntoOptionQuote",e,h.transformBlock,H.ELEMENT_TYPES.QUOTE,ge.quote.htmlElement,"Quote")),e.append(new le("turnIntoOptionHeading2",e,h.transformBlock,H.ELEMENT_TYPES.HEADER_2,ge.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),e.append(new le("turnIntoOptionHeading3",e,h.transformBlock,H.ELEMENT_TYPES.HEADER_3,ge.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),e.append(new le("turnIntoOptionHeading4",e,h.transformBlock,H.ELEMENT_TYPES.HEADER_4,ge.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),n}static separator(e){return new ae(e)}static buttonGroup(){const e=new ce,t=de.create(h.toggleLink,"Link",ee.create(i.Link,J.large));t.setId(A.Link),t.appendTo(e);const n=de.create(h.toggleBold,"Bold",ee.create(i.Bold,J.large));n.setId(A.Bold),n.appendTo(e);const o=de.create(h.toggleItalic,"Italic",ee.create(i.Italic,J.large));o.setId(A.Italic),o.appendTo(e);const r=de.create(h.toggleUnderline,"Underline",ee.create(i.Underline,J.large));r.setId(A.Underline),r.appendTo(e);const l=de.create(h.toggleInlineCode,"Code",ee.create(i.InlineCode,J.large));l.setId(A.InlineCode),l.appendTo(e);const s=de.create(h.toggleStrikeThrough,"Strike-through",ee.create(i.StrikeThrough,J.large));return s.setId(A.Strikethrough),s.appendTo(e),e}static colorDropdown(){const e=new se(b.ColorTextOptionSelect),t=new pe("colorTextButton",new ue("white").htmlElement,e),n=new ne(E.ColorTextOptionsMenu,t,e);e.append(new me(e,"Highlight"));const o=new le(C.BackgroundOptionRed,e,h.toggleHiliteColor,u.HiliteColorRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("hiliteColor");const i=new le(C.BackgroundOptionGreen,e,h.toggleHiliteColor,u.HiliteColorGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("hiliteColor");const r=new le(C.BackgroundOptionBlue,e,h.toggleHiliteColor,u.HiliteColorBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("hiliteColor");const l=new le(C.BackgroundOptionYellow,e,h.toggleHiliteColor,u.HiliteColorYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("hiliteColor");const s=new le(C.BackgroundOptionGrey,e,h.toggleHiliteColor,u.HiliteColorGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("hiliteColor");const a=new le(C.BackgroundOptionNone,e,h.toggleHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");a.addClass("hiliteColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),e.append(new me(e,"Text"));const c=new le("colorOptionRed",e,h.toggleForeColor,u.ForeColorRed,new ee("icon-material-format",J.large).htmlElement,"Red");c.addClass("foreColor");const d=new le("colorOptionGreen",e,h.toggleForeColor,u.ForeColorGreen,new ee("icon-material-format",J.large).htmlElement,"Green");d.addClass("foreColor");const m=new le("colorOptionBlue",e,h.toggleForeColor,u.ForeColorBlue,new ee("icon-material-format",J.large).htmlElement,"Blue");m.addClass("foreColor");const A=new le("colorOptionYellow",e,h.toggleForeColor,u.ForeColorYellow,new ee("icon-material-format",J.large).htmlElement,"Yellow");A.addClass("foreColor");const p=new le("colorOptionGrey",e,h.toggleForeColor,u.ForeColorGrey,new ee("icon-material-format",J.large).htmlElement,"Grey");p.addClass("foreColor");const g=new le("colorOptionNone",e,h.toggleForeColor,u.ForeColorInitial,new ee("icon-material-format",J.large).htmlElement,"None");return g.addClass("foreColor"),e.append(c),e.append(d),e.append(m),e.append(A),e.append(p),e.append(g),n}static moreOptionsDropdown(){const e=new ee("icon-material-more",J.large),t=new se("moreTextOptionSelect"),n=new pe("moreTextOptionButton",e.htmlElement,t,!1),o=new ne("moreTextOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("copyOption",t,h.copySelected,null,ge.copy.htmlElement,"Copy","Ctrl+C")),t.append(new le("cutOption",t,h.cutSelected,null,ge.cut.htmlElement,"Cut","Ctrl+X")),t.append(new le("pasteOption",t,h.past,null,ge.paste.htmlElement,"Replace","Ctrl+V")),t.append(new le("duplicateOption",t,h.duplicateBlock,null,ge.duplicate.htmlElement,"Clone","Ctrl+D")),t.append(new le("resetOption",t,h.removeFormat,null,ge.eraser.htmlElement,"Reset Style","Ctrl+\\"));const i=new le("deleteOption",t,h.deleteBlock,null,ge.delete.htmlElement,"Delete","Shift+Del");return i.addCssClass("danger-option"),t.append(i),o}}const ge={paragraph:new ee("icon-material-format","1.25rem"),todo_list:new ee("icon-material-check-list-2",J.large),b_list:new ee("icon-wordpress-bulleted-list",J.large),n_list:new ee("icon-wordpress-numbered-list",J.large),code:new ee("icon-wordpress-code-mark",J.large),quote:new ee("icon-wordpress-quote",J.large),head1:new ee("icon-julia-head-1",J.large),head2:new ee("icon-julia-head-2",J.large),head3:new ee("icon-julia-head-3",J.large),head4:new ee("icon-julia-head-4",J.large),head5:new ee("icon-julia-head-5",J.large),head6:new ee("icon-julia-head-6",J.large),duplicate:new ee("icon-material-duplicate",J.large),delete:new ee("icon-material-trash",J.large),eraser:new ee("icon-material-clear",J.large),copy:new ee("icon-material-copy",J.large),cut:new ee("icon-material-cut",J.large),paste:new ee("icon-material-paste",J.large)};class be extends R{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No matching block types found.",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}class Ee extends R{static id="quickMenu";currentFocusedMenuItem;menuSections;quickMenuEmpty;filterInput;focusStack;static instance;constructor(e){const t=new be;super({quickMenuEmpty:t}),this.currentFocusedMenuItem=null,this.menuSections=new re,this.quickMenuEmpty=t,this.focusStack=e,this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=Ee.id,e.style.zIndex=d.SlightlyImportant,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const t=document.createElement("div");return t.classList.add("block-options"),t.style.position="relative",t.appendChild(this.props.quickMenuEmpty.htmlElement),e.appendChild(t),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){const e=D.Instance.resolve("IFocusStack");return Ee.instance||(Ee.instance=new Ee(e)),Ee.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.focusStack.peek()?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let t=e;for(;t;){const n=t.value.menuItems.findFirst((e=>e.isVisible));if(n)return void this.switchVisualFocus(n);if(t=t.nextNode,t==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getPreviousSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}}else{let t=this.menuSections.findLast((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getNextSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}}else{let t=this.menuSections.findFirst((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{const e=document.activeElement;if(!e)return void console.error("Failed to display the quickMenu: no active element found.");this.focusStack.push(e);const t=window.getSelection();if(!t||0===t.rangeCount)throw new Error("No selection found.");const n=t.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const o=this.htmlElement.offsetWidth;let i=n.left+window.scrollX;i+o>window.innerWidth&&(i=window.innerWidth-o-20),this.htmlElement.offsetHeight;let r=n.bottom+window.scrollY+10;this.htmlElement.style.left=`${i}px`,this.htmlElement.style.top=`${r}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.focusStack.peek()?.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.focusStack.peek()?.focus(),super.hide()}attachEvents(){document.addEventListener(c.emittedCommand,(e=>{const{command:t}=e.detail;t==h.transformBlock&&this.hide()})),document.addEventListener("keydown",(e=>{const t=P.findClosestAncestorOfActiveElementByClass("block");if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||!t)(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)&&(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)?!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey?this.isVisible&&"Backspace"===e.key?""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems()):!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||this.hide():(this.concatFilterInput(e.key),this.filterItems()):(e.preventDefault(),this.focusPreviousVisibleItem()):(e.preventDefault(),this.focusNextVisibleItem()):(e.preventDefault(),e.stopPropagation());else{if(e.target.closest(".ignore-quick-menu"))return;this.show()}})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if(this.isVisible&&"Enter"===e.key&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();const t=this.currentFocusedMenuItem?.value.blockType;t&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(t)}})),document.addEventListener(c.blockTypeChanged,(e=>{this.hide()}))}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:e}});document.dispatchEvent(t)}transformHtmlFocusedElementBeforeOpenQuickMenu(e){e&&this.emitCommandEvent(e)}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class fe extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(this.tail.setNext(t),t.setPrevious(this.tail),this.tail=t):(this.head=t,this.tail=t),this.length++}}class Be extends R{immediateParent;menuItems=new fe;constructor(e){super({title:e.title,classList:e.classList}),this.immediateParent=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const t=document.createElement("h2");return t.textContent=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((t=>{t.filterValue.toLocaleLowerCase().includes(e)||t.hide()})),this.menuItems.any((t=>t.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class ve extends R{_blockType;_filterValue;_immediateParent;constructor(e,t,n,o,i,r){super({title:t,description:n,iconId:o}),this._blockType=i,this._filterValue=r,this._immediateParent=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation","pointer","no-selection"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const t=document.createElement("div");t.classList.add("option-image");const n=new ee(this.props.iconId,"100%");t.appendChild(n.htmlElement),e.appendChild(t);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}get filterValue(){return this._filterValue}get immediateParent(){return this._immediateParent}get blockType(){return this._blockType}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}emitCommandEvent(){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:this.blockType}});document.dispatchEvent(e)}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this._immediateParent.menuItems.find(this);this._immediateParent.immediateParent.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.emitCommandEvent()}))}}class we{static build(){const e=Ee.getInstance(),t=new Be({quickMenuInstance:e,title:"Basic",classList:"basic-section"});t.appendQuickMenuItems([new ve(t,"Text","Start writing in plain text.","icon-material-format",H.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new ve(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",H.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",H.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list"),new ve(t,"Table","Organize data in rows and columns.","icon-material-table",H.ELEMENT_TYPES.TABLE,"table tr th"),new ve(t,"Callout","Emphasize key points with a callout box.",i.Callout,H.ELEMENT_TYPES.CALLOUT,"callout note spotlight"),new ve(t,"Code","Include a code snippet.","icon-wordpress-code-mark",H.ELEMENT_TYPES.CODE,"code script source markup"),new ve(t,"Quote","Highlight text as a quote.","icon-wordpress-quote",H.ELEMENT_TYPES.QUOTE,"quote blockquote citation quotation cite"),new ve(t,"Heading 2","Medium header for sections.","icon-julia-head-2",H.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(t,"Heading 3","Small header for subsections.","icon-julia-head-2",H.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(t,"Separator","Visually divide blocks.","icon-wordpress-separator",H.ELEMENT_TYPES.SEPARATOR,"separator divider rule line hr")]),e.append(t);const n=new Be({quickMenuInstance:e,title:"Media",classList:"media-section"});n.appendQuickMenuItems([new ve(n,"Image","Upload or embed an image.",i.Image2,H.ELEMENT_TYPES.IMAGE,"image figure photo illustration picture media upload"),new ve(n,"YouTube","Embed a YouTube video.",i.YouTube,"video","video embed youtube clip film movie tape")]),e.append(n);const o=new Be({quickMenuInstance:e,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new ve(o,"Heading 1","Large header for main topics.","icon-julia-head-1",H.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new ve(o,"Heading 2","Medium header for sections.","icon-julia-head-2",H.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(o,"Heading 3","Small header for subsections.","icon-julia-head-3",H.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",H.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new ve(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",H.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new ve(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",H.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),e.append(o);const r=new Be({quickMenuInstance:e,title:"List",classList:"list-section"});r.appendQuickMenuItems([new ve(r,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2",H.ELEMENT_TYPES.CHECK_LIST,"todo list task list checklist"),new ve(r,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",H.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(r,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",H.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list")]),e.append(r);const l=new Be({quickMenuInstance:e,title:"Embed",classList:"embed-section"});return l.appendQuickMenuItems([new ve(l,"GitHub Gist","Embed a GitHub Gist.",i.GitHub,"github-gist","code gist github snippet git"),new ve(l,"CodePen","Embed a CodePen web demo.",i.CodePen,"codepen","code codepen"),new ve(l,"Spotify","Embed a Spotify audio track.",i.Spotify,"spotify","mp3 sound audio music spotify track")]),e.append(l),e}}class Ie extends R{constructor(e){super({value:e})}init(){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("h1");return t.setAttribute("contentEditable","true"),t.setAttribute("data-placeholder","Untitled"),this.props.value&&(t.textContent=this.props.value),e.appendChild(t),e}static create(e){return new Ie(e)}}class ke{static build(){return Ie.create(window.editorConfig?.title)}}var ye,xe,Te,Se,Le,Me;!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight"}(ye||(ye={})),function(e){e.Column="Column",e.Row="Row",e.Cell="Cell",e.SelectedCells="SelectedCells"}(xe||(xe={}));class Ne{static addRow(e,t=null){const n=null!==t&&t>=0&&t<=e.rows.length?t:e.rows.length,o=e.insertRow(n),i=Array.from(e.rows).reduce(((e,t)=>Math.max(e,t.cells.length)),0);let r=[];for(let e=0;e{r.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static addColumn(e,t=null){const n=null!==t?t:void 0;let o=[];for(let t=0;t{o.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static isLastColumn(e,t){if(!e.contains(t))return!1;const n=t.parentElement;return t===n.cells[n.cells.length-1]}static isLastRow(e,t){return!!e.contains(t)&&t.parentElement===e.rows[e.rows.length-1]}static removeColumnByCell(e){if("td"!==e.tagName.toLowerCase()&&"th"!==e.tagName.toLowerCase())throw new Error("The provided element is not a table cell.");const t=e.parentElement.parentElement,n=e.cellIndex;for(let e=0;e=0;t--){const n=e.rows[t];for(let e=n.cells.length-1;e>=0;e--){const t=n.cells[e];if(t.isContentEditable)return t}}return null}static getFirstTableCell(e){for(let t=0;t{e.style.border=`1px double ${n}`}))}static moveFocusToBelowCell(e,t){const n=t.parentElement?.nextElementSibling;if(!n)return!1;const o=t.cellIndex,i=n.cells[o];return!(!i||!i.isContentEditable||(i.focus(),0))}}class qe extends R{constructor(){super({}),this.attachEvent()}init(){const e=document.createElement("div");return e.classList.add("content"),e.style.marginTop="1.3rem",window.editorConfig,e.append(H.blockParagraph()),e}clearSelectionOnDrag(){document.addEventListener(a.Mousedown,(e=>{const t=e.target;let n;t&&(n=t.nodeType==Node.TEXT_NODE?t.parentElement:t,n&&n.closest(".drag-handler")&&window.getSelection()?.removeAllRanges())}))}attachEvent(){this.clearSelectionOnDrag(),this.reRenderPlaceholder(),document.addEventListener(a.Click,(e=>{document.querySelectorAll(".separator-selected").forEach((e=>{e.classList.remove("separator-selected"),e.removeAttribute("tabindex")}));let t=e.target;if(t&&t.closest(".separator-wrapper")){e.stopImmediatePropagation(),e.preventDefault();let n=t.closest(".separator-wrapper");n&&(n.classList.add("separator-selected"),n.setAttribute("tabindex","-1"),setTimeout((()=>{n.focus()}),50))}})),document.addEventListener(a.Blur,(e=>{const t=e.target;if(t instanceof HTMLElement&&t.closest(".separator-selected")){e.stopImmediatePropagation();const n=t.closest(".separator-selected");n.classList.remove("separator-selected"),n.removeAttribute("tabindex")}}),!0),document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),window.addEventListener("load",(()=>{const e=document.querySelector(".johannes-editor");if(e){let t=e.querySelectorAll(".block");if(1==t.length){const e=t[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),document.addEventListener(a.Keydown,(e=>{"Enter"===e.key&&!e.shiftKey&&P.isEventTargetDescendantOf(e,"#johannesEditor .content-wrapper .title")&&(e.preventDefault(),document.dispatchEvent(new CustomEvent(c.pressedEnterOnTitle,{})))}),!0),document.addEventListener(a.Keydown,(async e=>{if(P.isEventTargetDescendantOf(e,".ignore-events")&&"Tab"!==e.key)return;const t=D.Instance.resolve("IQuickMenu"),n=D.Instance.resolve("ITableContextFloatingToolbar");if(!(e.ctrlKey||e.shiftKey||e.altKey))if(e.key!==p.Enter||e.shiftKey||t.isVisible||n.isVisible){if(e.key===p.Backspace){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();n&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithPreviousBlock}})))}}else if(e.key===p.Delete){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.classList.contains("johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();o&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithNextBlock}})))}}else if("ArrowRight"===e.key&&qe.isCursorAtEnd(e.target));else if("ArrowLeft"===e.key&&qe.isCursorAtStart(e.target));else if("ArrowDown"===e.key&&qe.isCursorOnLastLine());else if("ArrowUp"===e.key&&qe.isCursorOnFirstLine());else if("Tab"===e.key&&P.isEventTargetDescendantOf(e,".johannes-code")){e.preventDefault();const t="    ";document.execCommand("insertText",!1,t)}}else{e.preventDefault();const t=e.target.closest(".table-controller");if(t){const n=e.target.closest("td, th"),o=t.querySelector("table");return void(n&&(Ne.moveFocusToBelowCell(o,n)||document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.focusOnNextBlock}}))))}if(e.target.closest(".johannes-code"))return;e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.insertNew}}))}})),document.addEventListener(a.Blur,(e=>this.sanitizeElementEventHandler(e)),!0)}sanitizeElementEventHandler(e){const t=e.target;t instanceof HTMLElement&&"true"===t.contentEditable&&P.sanitizeContentEditable(t)}reRenderPlaceholder(){document.addEventListener(a.Input,(function(e){if(e.target instanceof HTMLElement){const t=e.target;if(t.isContentEditable&&t.hasAttribute("data-placeholder")){const e=t.getAttribute("data-placeholder");""===t.textContent?.trim()&&(t.setAttribute("data-placeholder",e||""),t.textContent="")}}}))}static isCursorAtEnd(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&0===o.startOffset}static isAtFirstVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!0),n.setStart(e,0),n.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!1),n.setEnd(e,e.childNodes.length),n.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const t=window.getSelection();if(!t.rangeCount)return Promise.resolve(!1);const n=t.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=t.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(n.top===i.top&&n.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return 0===t.startOffset&&t.startContainer===t.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return t.endOffset===t.endContainer.textContent?.length&&t.endContainer===t.commonAncestorContainer}static getInstance(){return D.Instance.resolve("IShortcutListeners"),D.Instance.resolve("ITableListeners"),new qe}}class Oe{static build(){return qe.getInstance()}}!function(e){e.Text="Text",e.Cell="Cell",e.Block="Block"}(Te||(Te={}));class He extends F{static id="tableFloatingToolbar";static instance;focusStack;selectedCells=[];actualFocusedCell=null;tableOperationsService;controller;selectionMode=Te.Text;selectionFlag=!1;selectedText="";constructor(e,t){if(He.instance)throw new Error("Use TableContextFloatingToolbar.getInstance() to get instance.");super(He.id),this.clearAndHide=this.clearAndHide.bind(this),this.htmlElement.style.zIndex=d.ModeratelyImportant,this.controller=new AbortController,this.focusStack=e,this.tableOperationsService=t,this.attachEvents()}attachEvents(){document.addEventListener(a.Mousedown,this.handleMouseDown.bind(this)),document.addEventListener(a.Mousemove,this.handleMouseMove.bind(this)),document.addEventListener(a.Mouseup,this.handleMouseUp.bind(this)),document.addEventListener(a.Keydown,this.handleStartSelectionInCellKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleCellSelectionContinuationOnKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleKeyDown.bind(this)),document.addEventListener(a.Keyup,this.handleKeyUp.bind(this)),this.attachUIEvent(),super.attachEvents()}handleMouseDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".figure-embed-container td")&&(console.log("MouseDown event on: ",e.target),e.stopImmediatePropagation(),this.controller.abort(),t!=this.actualFocusedCell&&this.hide(),this.clearAll(),this.addSelectedCell(t),this.selectionFlag=!0,this.selectionMode=Te.Text)}handleMouseMove(e){if(this.selectionFlag){const t=e.target.closest(g.TD);t&&(this.updateSelectionModeByMouseEvent(e),this.selectionMode==Te.Cell&&(e.stopImmediatePropagation(),e.preventDefault(),this.canHide&&this.hide(),this.addSelectedCell(t),document.getSelection()?.removeAllRanges()))}}handleMouseUp(e){this.selectedCells.length>0&&this.selectionFlag&&(this.resetSelectionState(),this.show())}handleKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.key!=p.Enter||e.shiftKey||e.ctrlKey||e.metaKey||e.altKey?e.key==p.Escape&&this.canHide&&!Z.getInstance().isVisible&&setTimeout((()=>{this.canHide&&(e.stopImmediatePropagation(),this.clearAll(),this.hide())}),10):e.stopImmediatePropagation())}handleStartSelectionInCellKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.repeat||e.key!==p.Shift||(e.stopImmediatePropagation(),this.controller.abort(),this.selectionFlag=!0,this.selectionMode=Te.Text,this.addSelectedCell(t)))}handleCellSelectionContinuationOnKeyDown(e){if(this.selectionFlag){const t=e.target.closest(g.TD);if(t&&!t.matches(".gist td")&&this.selectionMode==Te.Cell&&e.shiftKey&&e.key.startsWith("Arrow")&&!e.repeat){e.stopImmediatePropagation(),e.preventDefault();const n=t.closest(g.TABLE),o=Ne.getNeighborCell(n,t,e.key);this.addSelectedCell(t),o&&this.addSelectedCell(o)}}}normalizeText(e){return e.replace(/\s+/g," ").trim()}updateTheSelectionModeByCurrentSelectionState(e){if(this.selectionFlag){const t=document.getSelection();if(t){const n=this.normalizeText(t.toString().trim()),o=e.target.closest(g.TD);if(o.matches(".gist td"))return;const i=this.normalizeText((o.textContent||"").trim()),{atStart:r,atEnd:l}=P.getSelectionTextInfo(o);""===i||n===this.selectedText.trim()&&(r||l)?(this.selectionMode=Te.Cell,this.selectedText="",this.canHide&&this.hide()):n&&(this.selectedText=n)}}}updateSelectionModeByMouseEvent(e){if(this.selectionFlag&&this.actualFocusedCell){const t=this.actualFocusedCell.getBoundingClientRect(),n=e.clientX,o=e.clientY;n>=t.left&&n<=t.right&&o>=t.top&&o<=t.bottom||(this.selectionMode=Te.Cell,this.canHide&&this.hide())}}handleKeyUp(e){e.target.closest(g.TD)&&(e.stopImmediatePropagation(),this.updateTheSelectionModeByCurrentSelectionState(e),e.key===p.Shift&&(this.resetSelectionState(),this.selectedCells.length>0&&this.show()))}addSelectedCell(e){if(0===this.selectedCells.length)return this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,void e.focus();this.selectedCells[this.selectedCells.length-1].closest("table")===e.closest("table")&&(-1===this.selectedCells.indexOf(e)?(this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,e.focus()):(this.actualFocusedCell=e,e.focus()))}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this))}handleCloseElementEvent(e){const t=e.detail;He.id==t.targetId&&this.clearAndHide()}show(){if(!this.actualFocusedCell)return void console.error("No focused cell found");this.resetAbortController(),this.focusStack.push(this.actualFocusedCell),this.changeToolbarPositionToBeClosedTo(this.actualFocusedCell),this.processSelectionChangeEffects();const e=this.actualFocusedCell.closest(".block");let t=null;e&&(t=e.querySelector(".block-toolbar"),t.classList.add("d-none")),super.show(),this.actualFocusedCell.addEventListener(a.Blur,(()=>this.clearAndHide(t)),{signal:this.controller.signal})}processSelectionChangeEffects(){G.emitResetActiveButtonsElementEvent("backgroundColor");const e={};e[u.BackgroundColorRed]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorRed),e[u.BackgroundColorGreen]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGreen),e[u.BackgroundColorBlue]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorBlue),e[u.BackgroundColorYellow]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorYellow),e[u.BackgroundColorGrey]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGrey),Object.entries(e).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("backgroundColor",e,"show")}))}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";const n=this.htmlElement.offsetWidth;let o=t.left+window.scrollX+0;o+n>window.innerWidth&&(o=window.innerWidth-n-20);const i=this.htmlElement.offsetHeight;let r=t.top+window.scrollY-i-10;r<0&&(r=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`}resetSelectionState(){this.selectionMode=Te.Text,this.selectionFlag=!1,this.selectedText=""}clearAll(){this.actualFocusedCell=null,document.querySelectorAll("td").forEach((e=>e.classList.remove("selected"))),this.selectedCells=[]}hide(){this.canHide&&super.hide()}clearAndHide(e=null){e&&e.classList.remove("d-none"),this.clearAll(),this.hide()}resetAbortController(){this.controller=new AbortController}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("ITableOperationsService");return new He(e,t)}}class Re{static build(){const e=D.Instance.resolve("ITableOperationsService"),t=He.getInstance();return t.appendDropdown(Re.tableOptions(e)),t.appendSeparator(Re.separator("tableOperationsSeparator")),t.appendDropdown(Re.tableColorDropdown()),t}static tableOptions(e){const t=new se("tableOptionsSelect"),n=new pe("tableOptions","Options",t),o=new ne("tableOptionsMenu",n,t);t.append(new me(t,"Insert Column")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnLeft,H.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnLeft,J.medium).htmlElement,"Left")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnRight,H.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnRight,J.medium).htmlElement,"Right")),t.append(new me(t,"Insert Row")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowAbove,H.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowAbove,J.medium).htmlElement,"Above")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowBelow,H.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowBelow,J.medium).htmlElement,"Below")),t.append(new me(t,"Remove"));const r=new le("turnIntoOptionText",t,h.removeColumn,H.ELEMENT_TYPES.PARAGRAPH,ee.create(i.deleteSweep,J.medium).htmlElement,"Column");r.addCssClass("danger-option"),t.append(r);const l=new le("turnIntoOptionTodoList",t,h.removeRow,H.ELEMENT_TYPES.CHECK_LIST,ee.create(i.deleteSweep,J.medium).htmlElement,"Row");return l.addCssClass("danger-option"),t.append(l),o}static tableColorDropdown(){const e=new se("colorTableOptionSelect"),t=new pe("colorTableButton",new ue("white").htmlElement,e),n=new ne("tableColorOptionsMenu",t,e);e.append(new me(e,"Background"));const o=new le("backgroundOptionRed",e,h.toggleCellHiliteColor,u.BackgroundColorCellRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("backgroundColor");const i=new le("backgroundOptionGreen",e,h.toggleCellHiliteColor,u.BackgroundColorCellGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("backgroundColor");const r=new le("backgroundOptionBlue",e,h.toggleCellHiliteColor,u.BackgroundColorCellBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("backgroundColor");const l=new le("backgroundOptionYellow",e,h.toggleCellHiliteColor,u.BackgroundColorCellYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("backgroundColor");const s=new le("backgroundOptionGrey",e,h.toggleCellHiliteColor,u.BackgroundColorCellGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("backgroundColor");const a=new le("backgroundOptionNone",e,h.toggleCellHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");return a.addClass("backgroundColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static separator(e){return new ae(e)}}class De{static async embedImage(e,t){const n=new URL(e);if(!await De.validateImage(n.toString()))throw new Error("invalid image");const o=this.createEmbedContainer(),i=document.createElement("img");i.src=n.toString(),i.alt="Embedded Image",i.style.maxWidth="100%",i.style.width="auto",i.style.height="auto",o.appendChild(i),o.classList.add(r.AlignToolClass),De.finalizeEmbed(o,[r.AlignToolClass,"fit-content","x-resizable"],t)}static validateImage(e){return new Promise(((t,n)=>{const o=new Image;o.onload=()=>{t(!0)},o.onerror=()=>{t(!1)},o.src=e}))}static embedGoogleSheet(e,t){const n=e.pathname.split("/")[3],o=De.createEmbedContainer(["embed-container"]),i=document.createElement("iframe"),r=encodeURIComponent(n);i.src=`https://docs.google.com/spreadsheets/d/e/${r}/pubhtml?widget=true&headers=false`,i.style.width="100%",i.style.height="450px",i.frameBorder="0",i.allowFullscreen=!0,o.appendChild(i),De.finalizeEmbed(o,["x-resizable"],t)}static embedYouTubeVideoAsIframe(e,t){const n=e.searchParams.get("v");if(n){const e=this.createEmbedContainer(["embed-container"]),o=document.createElement("iframe"),i=encodeURIComponent(n);o.src=`https://www.youtube.com/embed/${i}`,o.frameBorder="0",o.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",o.allowFullscreen=!0,e.appendChild(o),e.classList.add(r.AlignToolClass),this.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube video URL")}static embedYouTubeShortAsIframe(e,t){const n=e.pathname.split("/"),o=n[n.length-1];if(o){const e=De.createEmbedContainer(["embed-container"]),n=document.createElement("iframe"),i=encodeURIComponent(o);n.src=`https://www.youtube.com/embed/${i}`,n.frameBorder="0",n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,e.appendChild(n),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube Shorts URL")}static embedYouTubePlaylistAsIframe(e,t){const n=e.searchParams.get("list");if(n){const e=De.createEmbedContainer(["embed-container"]),o=encodeURIComponent(n),i=document.createElement("iframe");i.src=`https://www.youtube.com/embed/videoseries?list=${o}`,i.setAttribute("allowfullscreen","true"),e.appendChild(i),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube playlist URL")}static embedSpotifyContent(e,t,n){const o=e.pathname.split("/").pop(),i=this.createEmbedContainer(["embed-container"]);if(i.classList.add("spotify-embed",r.AlignToolClass),!o)return void console.error("contentId is empty");const l=encodeURIComponent(o),s=document.createElement("iframe");switch(s.classList.add("spotify-embed"),s.src=`https://open.spotify.com/embed/${n}/${l}`,s.frameBorder="0",s.setAttribute("scrolling","no"),n){case Se.SpotifyTrack:s.style.height="80px";break;case Se.SpotifyPlaylist:case Se.SpotifyShow:case Se.SpotifyEpisode:case Se.SpotifyArtist:s.style.height="380px";break;default:s.style.height="300px"}i.appendChild(s),this.finalizeEmbed(i,["x-resizable",r.AlignToolClass],t)}static async embedGistAsScript(e,t){const n=e.pathname.split("/").pop();if(!n)return void console.error("Invalid Gist ID");const o=document.createElement("div");o.classList.add("shadow-element");const i=De.createEmbedContainer(["gist-embed-container","figure-embed-container","ignore-text-floating-toolbar"]);i.style.minHeight="100px",i.style.width="100%",t.appendChild(i),i.appendChild(o);const r=o.attachShadow({mode:"open"}),l=`https://gist.github.com/${encodeURIComponent(n)}.js`,s=document.createElement("script");s.type="text/javascript",s.src=l,s.async=!0;const a=document.write;let c="";document.write=e=>{c+=e},s.onload=()=>{document.write=a;const e=document.createElement("div");e.innerHTML=c,Array.from(e.childNodes).forEach((e=>{r.appendChild(e)})),console.log("Gist loaded successfully")},s.onerror=()=>{document.write=a,console.error("Failed to load the Gist")},r.appendChild(s),De.finalizeEmbed(i,[],t)}static embedCodepenAsIframe(e,t){const n=e.pathname.split("/");if(n.length<4||""===n[1]||""===n[3])return void console.error("Invalid URL: Expected format /user/{username}/pen/{penId}");const o=n[1],i=n[3],r=encodeURIComponent(o),l=encodeURIComponent(i),s=De.createEmbedContainer(["embed-container"]),a=document.createElement("iframe");a.src=`https://codepen.io/${r}/embed/${l}?height=265&theme-id=light&default-tab=js,result`,a.style.border="none",a.style.height="100%",a.style.width="100%",a.style.overflow="visible",a.setAttribute("sandbox","allow-scripts allow-same-origin"),s.appendChild(a),De.finalizeEmbed(s,["y-resizable"],t);const c=new ResizeObserver((e=>{for(let t of e){const{height:e}=t.contentRect;a.style.height=`${e}px`}})),d=s.closest(".johannes-content-element");d&&(d.classList.add("overflow-hidden"),c.observe(d))}static createEmbedContainer(e=[]){const t=document.createElement("figure");return t.classList.add(...e),t}static finalizeEmbed(e,t=[],n){const o=n.closest(`.${l.ContentElement}`);if(o){for(o.classList.add(...t);o.firstChild;)o.removeChild(o.firstChild);o.appendChild(e);const n=o.closest(".block"),i=n?.querySelector(".block-toolbar-wrapper");i?.remove()}}static determineEmbedType(e){const t=new URL(e),n=t.hostname.toLowerCase(),o=t.pathname.toLowerCase();if(/^(?:.*\.)?spotify\.com$/.test(n)){if(o.includes("/track"))return Se.SpotifyTrack;if(o.includes("/playlist"))return Se.SpotifyPlaylist;if(o.includes("/artist"))return Se.SpotifyArtist;if(o.includes("/episode"))return Se.SpotifyEpisode;if(o.includes("/show"))return Se.SpotifyShow}else if(/^(?:.*\.)?(youtube\.com|youtu\.be)$/.test(n)){if(o.includes("/watch"))return t.searchParams.has("list")?Se.YouTubePlaylist:Se.YouTubeVideo;if(o.includes("/playlist"))return Se.YouTubePlaylist;if(o.includes("/shorts"))return Se.YouTubeShort}else{if("vimeo.com"===n)return Se.VimeoVideo;if("docs.google.com"===n&&o.includes("/spreadsheets"))return Se.GoogleSheet;if("twitter.com"===n)return Se.Tweet;if("google.com"===n&&o.includes("/maps"))return Se.GoogleMap;if("gist.github.com"===n)return Se.GitHubGist;if("gitlab.com"===n&&o.includes("/snippets"))return Se.GitLabSnippet;if("codepen.io"===n)return Se.CodePen}return null}}!function(e){e.SpotifyTrack="track",e.SpotifyPlaylist="playlist",e.SpotifyArtist="artist",e.SpotifyEpisode="episode",e.SpotifyShow="show",e.YouTubeVideo="video",e.YouTubePlaylist="playlist",e.YouTubeShort="short",e.VimeoVideo="video",e.GoogleSheet="sheet",e.Tweet="tweet",e.GoogleMap="map",e.GitHubGist="gist",e.GitLabSnippet="snippet",e.CodePen="pen"}(Se||(Se={}));class Pe extends R{id;focusStack;constructor(){const e="mediaInputter";super({id:e}),this.id=e,this.focusStack=D.Instance.resolve("IFocusStack"),this.attachEvents()}init(){const e=document.createElement("div");e.id=this.props.id,e.classList.add("tab-container","soft-box-shadow"),e.style.display="none",e.style.zIndex=d.ExtremelyImportant;const t=document.createElement("ul");t.classList.add("nav","nav-underline");const n=this.createNavItem("uploadTab","Upload",!0),o=this.createNavItem("embedTab","Embed");t.appendChild(n),t.appendChild(o);const i=document.createElement("div");i.classList.add("tab-content");const r=this.createUploadContent(),l=this.createEmbedContent();return i.appendChild(r),i.appendChild(l),e.appendChild(t),e.appendChild(i),e}createNavItem(e,t,n=!1){const o=document.createElement("li");o.classList.add("nav-item"),o.id=e;const i=document.createElement("a");return i.classList.add("nav-link"),i.innerText=t,o.appendChild(i),o}createUploadContent(){const e=document.createElement("div");e.id="uploadContent",e.classList.add("upload-content","content-data");const t=document.createElement("label");t.classList.add("blue-button"),t.innerText="Upload file";const n=document.createElement("div");return n.classList.add("text-info"),n.innerText="Maximum file size: 5MB",e.appendChild(t),e.appendChild(n),e}createEmbedContent(){const e=document.createElement("div");e.id="embedContent",e.classList.add("content-data","embed-content");const t=document.createElement("input");t.type="text";const n=document.createElement("button");return n.classList.add("blue-button"),n.innerText="Embed",e.appendChild(t),e.appendChild(n),n.addEventListener(a.Click,(()=>this.embedGeneric(t))),t.addEventListener(a.Keydown,(e=>{e.key==p.Enter&&(e.preventDefault(),e.stopImmediatePropagation(),this.embedGeneric(t))})),t.addEventListener(a.Focusin,(()=>this.resetInputBgColor(t))),e}resetInputBgColor(e){e.style.backgroundColor=""}async embedGeneric(e){const t=e.value,n=this.focusStack.peek(),i=n?.closest(`.${l.ContentElement}`)?.getAttribute("data-content-type");try{const e=new URL(t);if(!O.isValidUrl(e.toString()))throw new Error("Invalid URL");if(!n)return void console.error("not element found");if(i==o.Image)await De.embedImage(t,n);else if(i==o.Iframe){const o=De.determineEmbedType(t);switch(o){case Se.YouTubeVideo:De.embedYouTubeVideoAsIframe(e,n);break;case Se.YouTubePlaylist:De.embedYouTubePlaylistAsIframe(e,n);break;case Se.YouTubeShort:De.embedYouTubeShortAsIframe(e,n);break;case Se.SpotifyTrack:case Se.SpotifyPlaylist:case Se.SpotifyArtist:case Se.SpotifyEpisode:case Se.SpotifyShow:case Se.SpotifyPlaylist:De.embedSpotifyContent(e,n,o);break;case Se.GitHubGist:De.embedGistAsScript(e,n);break;case Se.CodePen:De.embedCodepenAsIframe(e,n);break;default:throw new Error("Unsupported")}}const r=new CustomEvent(c.emittedCommand,{detail:{command:h.createDefaultBlock}});document.dispatchEvent(r),this.hide()}catch(e){const t=document.querySelector("#embedContent input");t&&(t.style.backgroundColor="rgb(253, 222, 222)",t.classList.add("shake-animation"),setTimeout((()=>{t.classList.remove("shake-animation")}),1e3))}}set inputValue(e){const t=this.htmlElement.querySelector("input");t&&(t.value=e)}get display(){return"flex"}attachEvents(){const e=this.htmlElement.querySelector("#uploadTab");e?.addEventListener("click",(()=>{this.setActiveTab("uploadTab","uploadContent")}));const t=this.htmlElement.querySelector("#embedTab");t?.addEventListener("click",(()=>{this.setActiveTab("embedTab","embedContent")})),document.addEventListener(a.Keydown,this.handlerKeydownEvents.bind(this)),document.addEventListener(a.Click,this.handlerClickEvents.bind(this)),super.attachUIEvent()}handlerKeydownEvents(e){e.key==p.Escape&&this.canHide&&this.hide()}handlerClickEvents(e){this.hideMediaInputterOnExternalClick(e),this.showMediaInputterOnMediaInputterElementClick(e)}hideMediaInputterOnExternalClick(e){const t=P.findClickedElementOrAncestorById(e,this.id),n=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(!t&&!n&&this.isVisible)return e.stopImmediatePropagation(),void this.hide()}showMediaInputterOnMediaInputterElementClick(e){const t=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(t)return e.stopImmediatePropagation(),e.preventDefault(),this.focusStack.push(t),void(this.isVisible?this.hide():this.show())}findClassWithSuffix(e,t){const n=new RegExp(`.*${t}$`);for(let t of e.classList)if(n.test(t))return t;return null}getTab(e){return document.getElementById(e)}getContent(e){return document.getElementById(e)}setActiveTab(e,t){document.querySelectorAll(".nav-item").forEach((e=>{e.classList.remove("active")})),document.querySelectorAll(".content-data").forEach((e=>{e.classList.remove("active")})),this.getTab(e)?.classList.add("active");const n=this.getContent(t);if(n){n.classList.add("active");const e=n.querySelector("input");e&&(e.style.backgroundColor="white",setTimeout((()=>{e.focus()}),100))}}show(){const e=this.focusStack.peek(),t=e?.querySelector(`.${l.ShowMediaInputOnClick}`)||e?.closest(`.${l.ShowMediaInputOnClick}`);if(t){const e=this.findClassWithSuffix(t,"-embed-placeholder-text");e&&this.setInputPlaceholder(e)}if(e){const t=e.querySelector(`.${l.ShowMediaInputUpload}`)||e.closest(`.${l.ShowMediaInputUpload}`),n=this.htmlElement.querySelector("#uploadTab"),o=this.htmlElement.querySelector("#embedTab"),i=this.htmlElement.querySelector("#uploadContent"),r=this.htmlElement.querySelector("#embedContent");t&&n&&i?(n.style.display="inline",n.classList.add("active"),i.classList.add("active"),r.classList.remove("active"),o.classList.remove("active")):(n.style.display="none",n.classList.remove("active"),i.classList.remove("active"),r.classList.add("active"),o.classList.add("active"))}this.htmlElement.style.visibility="visible",e&&this.changeToolbarPositionToBeClosedTo(e),super.show();const n=document.querySelector("#embedContent input");n&&this.isElementVisible(n)&&(n.style.backgroundColor="white",setTimeout((()=>{n.focus()}),100))}setInputPlaceholder(e){const t=document.querySelector("#embedContent input");"image-embed-placeholder-text"!=e?"youtube-embed-placeholder-text"!=e?"spotify-embed-placeholder-text"!=e?"github-gist-embed-placeholder-text"!=e?"codepen-embed-placeholder-text"!=e?t.setAttribute("placeholder","Paste URL here..."):t.setAttribute("placeholder","https://codepen.io/..."):t.setAttribute("placeholder","https://gist.github.com/..."):t.setAttribute("placeholder","https://open.spotify.com/..."):t.setAttribute("placeholder","https://www.youtube.com/..."):t.setAttribute("placeholder","https://example.com/image.jpg")}isElementVisible(e){if(null===e.offsetParent)return!1;const t=e.getBoundingClientRect();return t.width>0&&t.height>0}hide(){this.inputValue="",super.hide()}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";let n=t.left+window.scrollX+t.width/2-this.htmlElement.offsetWidth/2,o=t.bottom+window.scrollY+10;this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${o}px`}}class Fe{static build(){return new Pe}}class _e{static build(){return Q.getInstance(ke.build(),Oe.build(),te.build(),Ce.build(),we.build(),Re.build(),Fe.build())}}class Ve{static instance;editor;constructor(e){if(Ve.instance)throw new Error;this.editor=e,Ve.instance=this}static build(){return Ve.instance?Ve.instance:new Ve(_e.build())}start(){return this.insertIcons(),this.editor}insertIcons(){if(!document.querySelector(".svg-icons-container")){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- \r\n \r\n --\x3e\r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n',e.className="svg-icons-container",document.body.appendChild(e)}}}class je{static instance=null;blockOperationsService;tableOperationsService;textOperationsService;constructor(e,t,n){if(je.instance)throw new Error("Attempt to instantiate singleton `CommandDispatcher` more than once.");this.blockOperationsService=e,this.textOperationsService=t,this.tableOperationsService=n}static getInstance(){const e=D.Instance.resolve("IBlockOperationsService"),t=D.Instance.resolve("ITextOperationsService"),n=D.Instance.resolve("ITableOperationsService");return je.instance||(je.instance=new je(e,t,n)),je.instance}listen(){document.addEventListener(c.emittedCommand,this.handleCommandEvent),document.addEventListener(c.pressedEnterOnTitle,(()=>this.blockOperationsService.createANewParagraphFromTitle()))}handleCommandEvent=e=>{const{command:t,showUI:n,value:o,targetBlockType:i,block:r,scope:l}=e.detail;switch(t){case h.linkReadyToInsert:if(!o)throw new Error(`${h.linkReadyToInsert} requires value`);this.textOperationsService.execInsertLink(o);break;case h.toggleLink:this.textOperationsService.execToggleLink();break;case h.toggleBold:this.textOperationsService.execBold();break;case h.toggleInlineCode:this.textOperationsService.execInlineCode();break;case h.toggleItalic:this.textOperationsService.execItalic();break;case h.toggleUnderline:this.textOperationsService.execUnderline();break;case h.toggleStrikeThrough:this.textOperationsService.execStrikeThrough();break;case h.toggleHiliteColor:if(!o)throw new Error(`${h.toggleHiliteColor} requires a color value`);this.textOperationsService.execHiliteColor(o);break;case h.toggleForeColor:if(!o)throw new Error(`${h.toggleForeColor} requires a color value`);this.textOperationsService.execForeColor(o);break;case h.transformBlock:if(!o)throw new Error(`${h.transformBlock} requires a value that represents the target element type.`);this.blockOperationsService.transformBlock(o,r);break;case h.duplicateBlock:this.blockOperationsService.execDuplicateBlock(r);break;case h.deleteBlock:this.blockOperationsService.execDeleteBlock(r);break;case h.deleteBlockAndFocusOnPrevious:this.blockOperationsService.execDeleteFocusOnPrevious();break;case h.deleteBlockAndFocusOnNext:this.blockOperationsService.execDeleteAndFocusOnNext();break;case h.focusOnNextBlock:this.blockOperationsService.execFocusOnNext();break;case h.removeFormat:this.execRemoveFormat(t);break;case h.JustifyLeft:if(!r)throw new Error(`${h.JustifyLeft} requires a block to justify.`);this.blockOperationsService.justifyLeft(r);break;case h.JustifyCenter:if(!r)throw new Error(`${h.JustifyCenter} requires a block to justify.`);this.blockOperationsService.justifyCenter(r);break;case h.JustifyRight:if(!r)throw new Error(`${h.JustifyRight} requires a block to justify.`);this.blockOperationsService.justifyRight(r);break;case h.changeCodeBlockLanguage:if(!r)throw new Error(`${h.changeCodeBlockLanguage} requires a block to change a code block language.`);if(!o)throw new Error(`${h.changeCodeBlockLanguage} requires a value to change a code block language.`);this.blockOperationsService.changeCodeBlockLanguage(r,o);break;case h.createDefaultBlock:this.execCreateDefaultBlock(t);break;case h.insertNew:this.execInsertNew(t);break;case h.focusOnPreviousBlock:this.execFocusOnPreviousBlock(t);break;case h.mergeWithNextBlock:this.blockOperationsService.execMergeWithNextBlock();break;case h.mergeWithPreviousBlock:this.blockOperationsService.execMergeWithPreviousBlock();break;case h.insertTableColumnLeft:this.tableOperationsService.insertColumnLeft();break;case h.insertTableColumnRight:this.tableOperationsService.insertColumnRight(r||null);break;case h.insertTableRowAbove:this.tableOperationsService.insertRowAbove();break;case h.insertTableRowBelow:this.tableOperationsService.insertRowBelow(r||null);break;case h.toggleCellHiliteColor:if(!o)throw new Error(`${h.toggleCellHiliteColor} requires a value that represents the cell background color.`);this.tableOperationsService.execCellBackgroundColor(o);break;case h.changeCalloutBackgroundColor:if(!r)throw new Error(`${h.changeCalloutBackgroundColor} requires a block.`);if(!o)throw new Error(`${h.changeCalloutBackgroundColor} requires a value that represents the background color.`);this.blockOperationsService.execChangeCalloutBackground(r,o);break;case h.removeColumn:this.tableOperationsService.removeColumn();break;case h.removeRow:case h.removeRow:this.tableOperationsService.removeRow();break;case h.changeTableBorderColor:this.tableOperationsService.changeTableBorderColor(l,o);break;default:console.error(`No action defined for command: ${t}`)}};execRemoveFormat(e){const t=this.blockOperationsService.execCommand(e,!1),n=P.getActiveContentEditable();return n&&n.normalize(),t}execCreateDefaultBlock(e){return this.blockOperationsService.execCommand(e,!1)}execInsertNew(e){return this.blockOperationsService.createNewElementAndSplitContent()}execFocusOnPreviousBlock(e){return this.blockOperationsService.execCommand(e,!1)}}class Ye{static instance=null;constructor(){if(Ye.instance)throw new Error("Use ShortcutListeners.getInstance() to get instance.");this.listen()}startListen(){console.log("listening keyboard shortcuts")}static getInstance(){return Ye.instance?Ye.instance:new Ye}listen(){document.addEventListener("keydown",(e=>{const t=e.code.startsWith("Numpad"),n=e.getModifierState("NumLock");(e.ctrlKey||e.metaKey)&&e.shiftKey&&"Enter"===e.key?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.PARAGRAPH}}))):!e.ctrlKey&&!e.metaKey||e.altKey||"Digit1"!==e.code&&"Numpad1"!==e.code?!e.ctrlKey&&!e.metaKey||e.shiftKey||"."!==e.key?!e.ctrlKey&&!e.metaKey||e.shiftKey||"/"!==e.key?e.ctrlKey&&e.altKey&&("Digit1"===e.code||t&&n&&"Numpad1"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_1}}))):e.ctrlKey&&e.altKey&&("Digit2"===e.code||t&&n&&"Numpad2"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_2}}))):e.ctrlKey&&e.altKey&&("Digit3"===e.code||t&&n&&"Numpad3"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_3}}))):e.ctrlKey&&e.altKey&&("Digit4"===e.code||t&&n&&"Numpad4"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_4}}))):e.ctrlKey&&e.altKey&&("Digit5"===e.code||t&&n&&"Numpad5"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_5}}))):e.ctrlKey&&e.altKey&&("Digit6"===e.code||t&&n&&"Numpad6"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_6}}))):"D"!==e.key&&"d"!==e.key||!e.ctrlKey?"Delete"!==e.key&&"Backspace"!==e.key||!e.shiftKey?"\\"===e.key&&(e.ctrlKey||e.metaKey)?document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.removeFormat}})):e.ctrlKey&&e.altKey&&"Digit1"===e.code&&e.preventDefault():(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.duplicateBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.NUMBERED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.BULLETED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.CHECK_LIST}})))}))}}class ze{static instance=null;focusStack;shownElements=new Map;constructor(e){if(ze.instance)throw new Error("Use TableEventListeners.getInstance() to get instance.");this.focusStack=e,this.listen()}startListen(){console.log("listening table clicks")}static getInstance(){const e=D.Instance.resolve("IFocusStack");return ze.instance?ze.instance:new ze(e)}listen(){document.addEventListener("click",(e=>{let t=null;if(t=e.target.nodeType==Node.TEXT_NODE?e.target.parentElement:e.target,t?.closest(".add-table-column")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableColumnRight,block:t.closest(".block")}});document.dispatchEvent(e)}if(t?.closest(".add-table-row")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableRowBelow,block:t.closest(".block")}});document.dispatchEvent(e)}}))}}class Ue{static instance;stack;capacity=10;constructor(){this.stack=[]}static getInstance(){return Ue.instance||(Ue.instance=new Ue),Ue.instance}push(e){this.stack.length>=this.capacity&&this.stack.shift(),this.stack.push(e)}peek(){return this.stack[this.stack.length-1]}clear(){this.stack=[]}}class Ge{static instance;elementFactoryService;memento;focusStack;constructor(e,t,n){if(Ge.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.focusStack=t,this.memento=n,Ge.instance=this}execCommand(e,t,n=null){if(e==h.copySelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();navigator.clipboard.writeText(t).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==h.cutSelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();e.deleteFromDocument(),navigator.clipboard.writeText(t).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==h.past)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const t=document.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents(),n.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==h.transformBlock&&this.getCurrentSelectedBlock()&&n&&this.transformBlock(n),e==h.removeFormat)return document.execCommand(h.removeFormat,!1);if(e==h.createDefaultBlock){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==h.focusOnFirstBlock){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==h.deleteBlockAndFocusOnPrevious)throw new Error("Remove all reference to this code");if(e==h.deleteBlockAndFocusOnNext)throw new Error("Remove all reference to this code");return!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(){const e=D.Instance.resolve("IElementFactoryService"),t=D.Instance.resolve("IFocusStack"),n=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ge(e,t,n)),this.instance}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t.closest(".block")}throw new Error}execMergeWithPreviousBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getPreviousContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(t),setTimeout((()=>{const n=P.saveCaretPosition2d(t);if(t.innerHTML=t.innerHTML+e.innerHTML,e.closest("li")){const t=e.closest("li");t&&t.remove()}else{const t=e.closest(".block");t&&t.remove()}const o={charIndex:n.charIndex+t.textContent.length,horizontalPos:n.horizontalPos};P.restoreCaretPosition2d(t,o)}),10)})))}execMergeWithNextBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getNextContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(e),setTimeout((()=>{const n=P.saveCaretPosition2d(e);if(e.innerHTML=e.innerHTML+t.innerHTML,e.closest("li")){const e=t.closest("li");e&&e.remove()}else{const e=t.closest(".block");e&&e.remove()}P.restoreCaretPosition2d(e,n)}),10)})))}execDuplicateBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock());const t=e.cloneNode(!0);t.querySelectorAll(".exclude-from-clone").forEach((e=>e.remove()));const n=e.nextSibling;e.parentNode?.insertBefore(t,n),t.id=`b-${O.generateUniqueId()}`;const o=new CustomEvent(c.blockCloned,{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}execDeleteBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock()),this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e);const t=new CustomEvent(c.blockDeleted,{bubbles:!0,cancelable:!0});return document.dispatchEvent(t),!0}transformBlock(e,t){let n;n=t?t.closest(".block"):this.focusStack.peek()?.closest(".block")||null,t||(t=P.findClosestAncestorOfActiveElementByClass(".block"));let o=n.querySelector(".swittable");this.focusStack.peek()?.focus(),P.removeFilterText(),this.memento.saveState();let i,r=o?.innerText,l=null;switch(e){case H.ELEMENT_TYPES.PARAGRAPH:{i=this.elementFactoryService.create(H.ELEMENT_TYPES.PARAGRAPH);const e=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&(i.innerHTML=e.innerHTML);break}case H.ELEMENT_TYPES.HEADER_1:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_1),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_2:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_2),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_3:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_3),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_4:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_4),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_5:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_5),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_6:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_6),i.innerText=r;break;case H.ELEMENT_TYPES.CODE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.CODE);break;case H.ELEMENT_TYPES.QUOTE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.QUOTE);break;case H.ELEMENT_TYPES.BULLETED_LIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.BULLETED_LIST,r);break;case H.ELEMENT_TYPES.NUMBERED_LIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.NUMBERED_LIST,r);break;case H.ELEMENT_TYPES.CHECK_LIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.CHECK_LIST,r);break;case H.ELEMENT_TYPES.SEPARATOR:i=this.elementFactoryService.create(H.ELEMENT_TYPES.SEPARATOR);break;case H.ELEMENT_TYPES.TABLE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.TABLE,",,");break;case H.ELEMENT_TYPES.IMAGE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.IMAGE,r),l=i;break;case H.ELEMENT_TYPES.VIDEO:i=this.elementFactoryService.create(H.ELEMENT_TYPES.VIDEO,r),l=i;break;case H.ELEMENT_TYPES.SPOTIFY:i=this.elementFactoryService.create(H.ELEMENT_TYPES.SPOTIFY,r),l=i;break;case H.ELEMENT_TYPES.GITHUB_GIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.GITHUB_GIST,r),l=i;break;case H.ELEMENT_TYPES.GITLAB_SNIPPET:i=this.elementFactoryService.create(H.ELEMENT_TYPES.GITLAB_SNIPPET,r),l=i;break;case H.ELEMENT_TYPES.CODEPEN:i=this.elementFactoryService.create(H.ELEMENT_TYPES.CODEPEN,r),l=i;break;case H.ELEMENT_TYPES.CALLOUT:{i=this.elementFactoryService.create(H.ELEMENT_TYPES.CALLOUT);const e=i.querySelector(".callout-text"),t=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&t&&(e.innerHTML=t.innerHTML);break}default:return void console.error("Unsupported type")}if(!i)return;n.replaceChild(i,o);const s=i.closest(".focusable")||n.querySelector(".focusable");if(s&&(s.focus(),P.placeCursorAtEndOfEditableElement(s)),l&&this.focusStack.push(l),"image"==e||"video"==e||"spotify"==e||"github-gist"==e||"gitlab-snippet"==e||"codepen"==e){const e=l?.querySelector(".content-placeholder");e&&this.focusStack.push(e),G.emitShowElementEvent("mediaInputter")}const a=n?.querySelector(".block-toolbar-wrapper");if(a&&a.remove(),e==H.ELEMENT_TYPES.SEPARATOR){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.createDefaultBlock}});document.dispatchEvent(e)}}createNewElement(e){this.memento.saveState();const t=e.target.closest(".johannes-content-element");t&&t.classList.contains("list")?this.createListItem(t):this.createDefaultBlock(t)}createListItem(e){this.memento.saveState();let t=null,n=(document.activeElement,e.closest(".johannes-content-element"));n.classList.contains("checkbox-list")?t=this.elementFactoryService.create("checkboxItem",""):n.classList.contains("list")&&(t=this.elementFactoryService.create("listItem",""))}createNewElementAndSplitContent(){this.memento.saveState();const e=P.getContentTypeFromActiveElement();if(e==o.Table)return!1;if(e==o.CheckList||e==o.BulletedList||e==o.NumberedList){const e=P.findClosestAncestorOfActiveElementByClass("list-item");if(e&&P.hasTextContent(e)){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),o=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,o)}}else if(e){const t=e.closest(".block");if(t){const n=t.querySelectorAll(".list-item").length,o=H.blockParagraph();P.insertAfter(o,t),e.remove(),1==n&&t.remove();const i=o.querySelector("p");P.placeCursorAtStartOfEditableElement(i)}}}else{const e=P.findClosestAncestorOfActiveElementByClass("block");if(e){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),i=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,i),this.transformBlock(o.Paragraph,t)}const n=t.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(n)}}return!0}createANewParagraphFromTitle(){this.memento.saveState();const e=document.querySelector("#johannesEditor .title h1"),t=P.cloneAndInsertAfter(e);t&&P.rearrangeContentAfterSplit(e,t);const n=this.elementFactoryService.create(H.ELEMENT_TYPES.BLOCK_PARAGRAPH,""),o=n.querySelector(`.${l.ContentElement}`);o&&(o.innerHTML=t?.innerHTML||"");const i=document.querySelector("#johannesEditor .content");if(i){i.prepend(n);const e=n.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(e)}t?.remove()}createDefaultBlock(e){this.memento.saveState();const t=this.elementFactoryService.create(H.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");return e&&e.closest(".block")?e.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus(),this.focusStack.push(t),t}execFocusOnNext(){let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),!0)}execDeleteFocusOnPrevious(){this.memento.saveState();const e=document.activeElement;return this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0}execDeleteAndFocusOnNext(){this.memento.saveState();let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0)}focusOnPrevious(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[e.length-1],void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n));i=i.previousElementSibling}}getPreviousFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.previousElementSibling;if(!n)return null;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.previousElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[e.length-1],t;o=o.previousElementSibling}return t}focusOnNext(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[0],t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n;i=i.nextElementSibling}return n}getNextFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.nextElementSibling;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.nextElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[0],t;o=o.nextElementSibling}return t}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const t=e.closest(".block"),n=e.closest(".deletable");n?.remove(),t&&0==t.querySelectorAll(".editable").length&&t.remove()}applyCursorXEndPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),n.removeAllRanges(),n.addRange(o),e.focus())}applyCursorXStartPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus())}adjustCursorOffset(e,t){let n=document.createRange(),o=e,i=0,r=1/0;for(let o=0;on.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".block")}justifyLeft(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-left")}justifyCenter(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-center")}justifyRight(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-right")}changeCodeBlockLanguage(e,t){this.memento.saveState();const n=e.querySelector("code");n&&(P.removeClassesWithPrefix(n,"language-"),n.classList.add(`language-${t}`),n.removeAttribute("data-highlighted"),hljs.highlightElement(n),G.emitCodeBlockLanguageChangedEvent("code-block-language-menu",e.id,t))}removeJustify(e){const t=e.classList;for(let e=0;e div");n&&(P.removeClassesWithPrefix(n,"callout-background-"),n.classList.add(t))}}class Ze{static instance;memento;textOperationService;constructor(e){if(Ze.instance)throw new Error("Use TextOperationService.getInstance() to get instance.");this.memento=e}static getInstance(){const e=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ze(e)),this.instance}execInsertLink(e){this.memento.saveState(),document.execCommand("createLink",!1,e),setTimeout((()=>{G.emitChangeComponentColorEvent(A.Link,u.IconActiveBlue),this.normalizeAnchors()}),50)}normalizeAnchors(){document.querySelectorAll("#johannesEditor .content a").forEach((e=>{e.hasAttribute("title")||e.setAttribute("title",e.href),e.normalize()}))}execToggleLink(){this.queryAnchorCommandState()?(document.execCommand("unlink",!1),G.emitChangeComponentColorEvent("linkButton",u.IconDefaultBlack)):G.emitShowElementEvent("linkBox")}execBold(){this.memento.saveState(),document.execCommand("bold")&&(document.queryCommandState("bold")?G.emitChangeComponentColorEvent(A.Bold,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Bold,u.IconDefaultBlack))}execInlineCode(){this.memento.saveState(),this.toggleInlineCode()&&(this.queryInlineCodeCommandState()?G.emitChangeComponentColorEvent(A.InlineCode,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.InlineCode,u.IconDefaultBlack))}toggleInlineCode(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0);let n=t.extractContents(),o=!1;const i=document.createElement("span");i.appendChild(n.cloneNode(!0)),i.querySelector("code")&&(o=!0,i.querySelectorAll("code").forEach((e=>{const t=document.createTextNode(e.textContent||"");e.parentNode?.replaceChild(t,e)})),n=i);let r=e.anchorNode;for(;r&&"CODE"!==r.nodeName&&"BODY"!==r.nodeName;)r=r.parentNode;if(r&&"CODE"===r.nodeName){o=!0;const e=document.createTextNode(r.textContent||"");r.parentNode?.replaceChild(e,r)}if(o)t.insertNode(i);else{const e=document.createElement("code");e.appendChild(n),t.insertNode(e)}e.removeAllRanges(),e.addRange(t);const l=P.getActiveContentEditable();return l&&(l.normalize(),P.mergeInlineElements(l)),!0}execItalic(){this.memento.saveState(),document.execCommand("italic")&&(document.queryCommandState("italic")?G.emitChangeComponentColorEvent(A.Italic,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Italic,u.IconDefaultBlack))}execStrikeThrough(){this.memento.saveState(),document.execCommand("strikeThrough")&&(document.queryCommandState("strikeThrough")?G.emitChangeComponentColorEvent(A.Strikethrough,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Strikethrough,u.IconDefaultBlack))}execUnderline(){this.memento.saveState(),document.execCommand("underline")&&setTimeout((()=>{document.queryCommandState("underline")?G.emitChangeComponentColorEvent(A.Underline,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Underline,u.IconDefaultBlack)}),10)}execHiliteColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("hiliteColor"),document.execCommand("hiliteColor",!1,e)&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")}execForeColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("foreColor"),document.execCommand("foreColor",!1,e)&&G.emitShowHideActiveElementEvent("foreColor",e,"show")}queryCommandState(e,t){return e===h.toggleLink?this.queryAnchorCommandState():e===h.toggleUnderline?this.queryUnderlineCommandState():e===h.toggleHiliteColor?this.queryHiliteColor(t):e===h.toggleForeColor?this.queryForeColor(t):e===h.toggleInlineCode?this.queryInlineCodeCommandState():document.queryCommandState(e)}queryAnchorCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0),n=t.startContainer,o=t.endContainer,i=e=>{for(;e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE&&"a"===e.tagName.toLowerCase())return!0;e=e.parentNode}return!1};return!(!i(n)&&!i(o))||t.cloneContents().querySelectorAll("a").length>0}queryInlineCodeCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("code"))return!0;t=t.parentNode}return!1}queryUnderlineCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("u"))return!0;t=t.parentNode}return!1}queryForeColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return O.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryHiliteColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("span[style*='background-color']")||n.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return O.rgbToHex(i).toUpperCase()===e.toUpperCase()}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const t=[];for(let n=0;no.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&t.push(r)}}return t}findClosestMatchingParent(e,t){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const n=e;if(n.tagName.toLowerCase()===t.nodeType.toLowerCase()&&(!t.classes||t.classes.every((e=>n.classList.contains(e)))))return n}e=e.parentElement}return null}extractSelectedText(e){const t=window.getSelection();if(!t||0===t.rangeCount)return"";const n=t.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return n.intersectsNode(e)?(n.startContainer===e?i=n.startOffset:n.startContainer.contains(e)&&(i=0),n.endContainer===e?r=n.endOffset:n.endContainer.contains(e)&&(r=o.length),i{t.style.backgroundColor=e})),G.emitShowHideActiveElementEvent("backgroundColor",e,"show")):console.error("cell not found")}static isCellBackgroundColor(e,t){if(!e||"TD"!==e.tagName||!e.hasAttribute("data-placeholder"))return!1;const n=window.getComputedStyle(e).getPropertyValue("background-color");return O.rgbToHex(n).toUpperCase()===t.toUpperCase()}queryStateCellBackgroundColor(e){const t=Ne.getActiveTableCell();if(t){const n=window.getComputedStyle(t).getPropertyValue("background-color");return O.rgbToHex(n).toUpperCase()===e.toUpperCase()}return!1}queryAllStateCellBackgroundColor(e,t){let n=!0;return t!=u.BackgroundColorNone&&(e.forEach((e=>{const o=window.getComputedStyle(e).backgroundColor;O.rgbToHex(o).toLocaleLowerCase()!==t.toLocaleLowerCase()&&(n=!1)})),n)}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ke(e,t)),this.instance}insertRowAbove(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No cell is focused");const t=e.parentElement;if(!t)return void console.error("No row is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=n.querySelector("tbody")||n,i=Array.from(o.children).indexOf(t);i<0?console.error("Row index not found"):(Ne.addRow(n,i),G.emitCloseElementEvent(Le.TableToolbar))}insertRowBelow(e){if(this.memento.saveState(),e){const t=e.querySelector("table");if(!t)return void console.error("Table does not exist");{const e=t.querySelector("tr:last-child");if(!e)return void console.error("No rows in the table");{const n=Array.from(t.children[0].children).indexOf(e)+1;Ne.addRow(t,n)}}}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.parentElement,o=t.closest("table");if(!o)return void console.error("Table does not exist");if(n){const e=Array.from(o.children[0].children).indexOf(n)+1;Ne.addRow(o,e),G.emitCloseElementEvent(Le.TableToolbar)}}}insertColumnLeft(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o),G.emitCloseElementEvent(Le.TableToolbar)}insertColumnRight(e){if(this.memento.saveState(),e){const t=e.querySelector("table");t&&Ne.addColumn(t)}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o+1),G.emitCloseElementEvent(Le.TableToolbar)}}showInsertLineElement(e){e.querySelector(".add-table-row").style.visibility="visible"}showInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="visible"}hideInsertRowElement(e){e.querySelector(".add-table-row").style.visibility="hidden"}hideInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="hidden"}changeTableBorderColor(e,t){const n=this.focusStack.peek()?.closest(g.TABLE);n&&Ne.changeCellBorderColor(n,e,t)}}class We{static query="#johannesEditor .content-wrapper";static instance;undoStack=[];redoStack=[];get content(){return document.querySelector(We.query)}constructor(){if(We.instance)throw new Error("Use Memento.getInstance() to get instance.");this.attachEvents(),this.saveState()}saveState(){if(this.content){const e=this.content.cloneNode(!0);setTimeout((()=>{const t=P.saveCaretPosition3d(this.content);e.querySelectorAll(`.${l.EditorOnly}`).forEach((e=>e.remove())),this.undoStack.push({html:e.innerHTML,caretPosition:t}),this.redoStack=[]}),10)}}undo(){if(this.undoStack.length>1){this.redoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.undoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}redo(){if(this.redoStack.length>0){this.undoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.redoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}attachEvents(){document.addEventListener("keydown",(e=>{e.ctrlKey&&"z"===e.key?(this.undo(),e.preventDefault()):e.ctrlKey&&"y"===e.key&&(this.redo(),e.preventDefault())})),document.addEventListener(a.Keyup,(e=>{e.key==p.Space&&this.saveState()}))}static getInstance(){return We.instance||(We.instance=new We),We.instance}}!function(e){e.First="First",e.Last="Last"}(Me||(Me={}));class Qe{static instance;quickMenu;constructor(e){document.addEventListener("keydown",this.handleArrowKeys.bind(this)),this.quickMenu=e}listen(){console.log("EditableNavigation is now listening for key events.")}static getInstance(){if(!Qe.instance){const e=D.Instance.resolve("IQuickMenu");Qe.instance=new Qe(e)}return Qe.instance}handleArrowKeys(e){if(!this.quickMenu.isVisible&&e.key.startsWith("Arrow")&&!e.altKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const t=document.activeElement;if(t&&t.isContentEditable&&this.shouldSwitchEditable(t,e.key)){const n=this.findNextEditable(t,e.key);n&&(e.preventDefault(),e.stopImmediatePropagation(),e.key!=ye.ArrowUp&&e.key!=ye.ArrowDown||this.placeCaretInSimilarPosition(t,n),e.key==ye.ArrowLeft&&P.placeCursorAtEndOfEditableElement(n),e.key==ye.ArrowRight&&P.placeCursorAtStartOfEditableElement(n),n.focus())}}}shouldSwitchEditable(e,t){const n=window.getSelection();if(n&&n.rangeCount>0){let e=n.getRangeAt(0);if(e.endOffset!=e.startOffset)return!1}if(n&&n.rangeCount>0){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(e),i=this.isAtLineBoundary(e,Me.First),r=this.isAtLineBoundary(e,Me.Last);return!!(t===ye.ArrowLeft&&n||t===ye.ArrowRight&&o||t===ye.ArrowUp&&(n||i)||t===ye.ArrowDown&&(o||r))}return!1}isAtLineBoundary(e,t){if(""===e.textContent?.trim())return!0;const n=window.getSelection();if(!n||0===n.rangeCount)return!1;const o=n.getRangeAt(0).getClientRects()[0];if(!o)return!0;const i=e.getBoundingClientRect();return t===Me.First?Math.abs(o.top-i.top)<11:t===Me.Last&&Math.abs(o.bottom-i.bottom)<11}findNextEditable(e,t){const n=Array.from(document.querySelectorAll('[contenteditable="true"]')),o=n.indexOf(e);if(e.closest("td")){const n=e.closest("table"),o=e.closest("td");if(n&&o){const e=Ne.getNeighborCell(n,o,t);if(e)return e}}let i=-1;return i=t===ye.ArrowLeft||t===ye.ArrowRight?t===ye.ArrowLeft?o-1:o+1:this.findVerticalEditableIndex(e,n,t),i<0||i>=n.length?null:n[i]||null}findVerticalEditableIndex(e,t,n){let o=t.indexOf(e);return n===ye.ArrowUp?o--:n===ye.ArrowDown&&o++,o>=0&&o0){const e=n.getRangeAt(0).getBoundingClientRect();n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;if(l){do{if(r&&r.nodeValue){o.setStart(r,0),o.setEnd(r,r.nodeValue.length);for(let t=0;tWe.getInstance())),D.Instance.register("IShortcutListeners",(()=>Ye.getInstance())),D.Instance.register("ITableListeners",(()=>ze.getInstance())),D.Instance.register("IFocusStack",(()=>Ue.getInstance())),D.Instance.register("IElementFactoryService",(()=>H.getInstance())),D.Instance.register("ITextOperationsService",(()=>Ze.getInstance())),D.Instance.register("ITableOperationsService",(()=>Ke.getInstance())),D.Instance.register("IBlockOperationsService",(()=>Ge.getInstance())),D.Instance.register("IQuickMenu",(()=>Ee.getInstance())),D.Instance.register("ITableContextFloatingToolbar",(()=>He.getInstance())),D.Instance.register("IEditableNavigation",(()=>Qe.getInstance())),Ve.build().start(),je.getInstance().listen(),Qe.getInstance().listen(),Ae.getInstance().listen(),document.dispatchEvent(new Event("TextEditorLoaded"))}))})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QW9CRSxTQUFTNUssU0FBUyxtQkFBbUIsSUFBTW9xQyxHQUFlMW9DLGdCQUU5RWdKLEVBQW9CRSxTQUFTNUssU0FBUyxlQUFlLElBQU11cUMsR0FBVzdvQyxnQkFDdEVnSixFQUFvQkUsU0FBUzVLLFNBQVMsMEJBQTBCLElBQU03QixFQUFzQnVELGdCQUM1RmdKLEVBQW9CRSxTQUFTNUssU0FBUywwQkFBMEIsSUFBTWl2QyxHQUFzQnZ0QyxnQkFDNUZnSixFQUFvQkUsU0FBUzVLLFNBQVMsMkJBQTJCLElBQU1peEMsR0FBdUJ2dkMsZ0JBQzlGZ0osRUFBb0JFLFNBQVM1SyxTQUFTLDJCQUEyQixJQUFNNHFDLEdBQXVCbHBDLGdCQUc5RmdKLEVBQW9CRSxTQUFTNUssU0FBUyxjQUFjLElBQU1neUIsR0FBVXR3QixnQkFDcEVnSixFQUFvQkUsU0FBUzVLLFNBQVMsZ0NBQWdDLElBQU04NkIsR0FBNEJwNUIsZ0JBQ3hHZ0osRUFBb0JFLFNBQVM1SyxTQUFTLHVCQUF1QixJQUFNeXlDLEdBQW1CL3dDLGdCQUV0RjRsQyxHQUFVeGtCLFFBQVF5a0IsUUFFbEJHLEdBQWtCaG1DLGNBQWNtcUIsU0FDaEM0bUIsR0FBbUIvd0MsY0FBY21xQixTQUNqQ2IsR0FBYXRwQixjQUFjbXFCLFNBRTNCbnpCLFNBQVNtZixjQUFjLElBQUkrN0IsTUFBTSxvQkFFckMsRyIsInNvdXJjZXMiOlsid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3MiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0NvbnRlbnRUeXBlcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vSWNvbnMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9ibG9jay10b29sYm94L1Rvb2xib3hPcHRpb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Db21tb25DbGFzc2VzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DdXN0b21VSUV2ZW50cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRGVmYXVsdEpTRXZlbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DdXN0b21FdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL1pJbmRleC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ29sb3JzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL0NvbW1hbmRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvQnV0dG9uSURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9LZXlib2FyZEtleXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9Ecm9wZG93bkl0ZW1JRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RPTUVsZW1lbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25MaXN0SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25NZW51SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3M/MWZiYSIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYXNlVUlDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3V0aWxpdGllcy9ET01VdGlscy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvRmxvYXRpbmdUb29sYmFyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9DaGFuZ2VDb2xvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL1Jlc2V0QWN0aXZlQnV0dG9ucy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvQ2xvc2VFbGVtZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9TaG93RWxlbWVudC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvRXZlbnRFbWl0dGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3hXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL1NpemVzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvQWRkQmxvY2tCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQmFzZURvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0pOb2RlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DaXJjdWxhckRvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW0udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9idXR0b24tZ3JvdXAvQnV0dG9uR3JvdXBJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0Jsb2NrVG9vbGJveEJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9ibG9jay10b29sYm94L0Jsb2NrVG9vbGJveC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVFbXB0eS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVTZWN0aW9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1F1aWNrTWVudUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy90aXRsZS9UaXRsZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9UaXRsZUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RpcmVjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvU2VsZWN0aW9uTW9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0VtYmVkVG9vbC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL1Rvb2xiYXJJRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0JvdW5kYXJpZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdXRpbGl0aWVzL1RhYmxlVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9jb250ZW50L0NvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvQ29udGVudEJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9NZWRpYUlucHV0dGVyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9FZGl0b3JCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1VJQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9Db21tYW5kRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL1Nob3J0Y3V0TGlzdGVuZXJzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvbGlzdGVuZXJzL1RhYmxlTGlzdGVuZXJzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRm9jdXNTdGFjay50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL1RhYmxlT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9NZW1lbnRvLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRWRpdGFibGVOYXZpZ2F0aW9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiogY3Vyc29yIHN0eWxlICovXG5bY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSB7XG4gICAgY3Vyc29yOiB0ZXh0ICFpbXBvcnRhbnQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7XG59XG5cblxuXG4vKiogQ1NTIHJlc2V0ICovXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xufVxuXG4vKiogYWRkIGJsb2NrICovXG4uYWRkLWJsb2NrIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDMuMTI1cmVtO1xufVxuXG4uYWRkLWJsb2NrLXdyYXBwZXI6aG92ZXIgLmFkZC1ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLyoqIGFuZCBhZGQgYmxvY2sgKi9cblxuXG5cbi8qKiBMaXN0ICAqKi9cbi5saXN0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAxMHB4O1xuXG59XG5cbi5saXN0LWl0ZW0tY2hlY2thYmxlIGlucHV0IHtcbiAgICBtYXJnaW4tdG9wOiAwLjVyZW07XG59XG5cbi5saXN0IGxpIGRpdiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBsaW5lLWhlaWdodDogMTtcbn1cblxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50LFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICBwYWRkaW5nLWxlZnQ6IDFyZW0gIWltcG9ydGFudDtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaT5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgdG9wOiAwO1xuXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcblxufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTo6YmVmb3JlIHtcbiAgICBtYXJnaW4tbGVmdDogMC4zMTI1cmVtO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOmhvdmVyPmJ1dHRvbiB7XG4gICAgLyogZGlzcGxheTogaW5saW5lLWJsb2NrOyAqL1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXG59XG5cbnAuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgLmNoZWNrYm94LWxpc3Qge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xufVxuXG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdWwuY2hlY2tib3gtbGlzdCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtzcGFuIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xuLmJsb2NrIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkK2RpdiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cbi5ibG9jayBvbCxcbi5ibG9jayB1bCB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXG4uYmxvY2sgb2wgLmxpc3QtaXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXG59XG5cbi5ibG9jayBvbCBsaSB7XG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGl0ZW07XG59XG5cbi5ibG9jayBvbCBsaTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBjb3VudGVyKGl0ZW0pIFwiLlwiO1xuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgLyogd2lkdGg6IDE4cHg7ICovXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuXG4uYmxvY2sgdWwgbGk6bm90KC5uby1saXN0LXN0eWxlKTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIuKAolwiO1xuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5saXN0LWl0ZW0tY2hlY2thYmxlIGlucHV0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcbn1cblxuXG4vKiogYW5kIGxpc3QgKiovXG5cblxuLmRyYWctaGFuZGxlciB7XG4gICAgY29sb3I6ICM4NDg4OGQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGN1cnNvcjogZ3JhYjtcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kcmFnLWhhbmRsZXItd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMDtcbiAgICB3aWR0aDogMDtcbn1cblxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG59XG5cbi5ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xufVxuXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzO1xufVxuXG4uZHJvcC1saW5lIHtcbiAgICBoZWlnaHQ6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg0ODg4ZDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuXG4udGl0bGUgaDEge1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG4gICAgbGluZS1oZWlnaHQ6IDNyZW07XG59XG5cblxuW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6Zm9jdXMge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGQ7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTpmb2N1czpiZWZvcmUge31cblxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5jaXRlW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuKltjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdOm5vdChoMSlbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6Zm9jdXM6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxubGkuZGl2W2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6aG92ZXI6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cblxuXG5oMSB7XG4gICAgZm9udC1zaXplOiAyLjVyZW07XG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xufVxuXG4uY29udGVudCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cblxuXG5bY29udGVudGVkaXRhYmxlXSB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuYm9keSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJOb3RvIFNhbnNcIiwgXCJMaWJlcmF0aW9uIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFwiQXBwbGUgQ29sb3IgRW1vamlcIiwgXCJTZWdvZSBVSSBFbW9qaVwiLCBcIlNlZ29lIFVJIFN5bWJvbFwiLCBcIk5vdG8gQ29sb3IgRW1vamlcIjtcbiAgICBtYXJnaW4tYm90dG9tOiAyMDBweDtcbn1cblxuXG4uZWRpdG9yIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi10b3A6IDgwcHg7XG59XG5cbnAge1xuICAgIGNvbG9yOiAjMjQyNDI0O1xufVxuXG5cbi5ibG9jayxcbi5ibG9jayAqIHtcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbn1cblxuXG4jam9oYW5uZXNFZGl0b3Ige1xuICAgIHdpZHRoOiA2MCU7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIGhyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbn1cblxuXG5cbi5qb2hhbm5lcy1lZGl0b3IgYmxvY2txdW90ZSB7XG4gICAgbWFyZ2luOiAwLjVyZW0gMDtcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIGNpdGUge1xuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5cbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAn4oCUICc7XG59XG5cblxuI2xpbmtCb3gge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbiNsaW5rQm94IC5oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgICBmb250LXNpemU6IDAuODZyZW07XG4gICAgY29sb3I6ICMzNzM1MmZkOTtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDFyZW07XG4gICAgcGFkZGluZzogMjBweDtcbn1cblxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwgaW5wdXQge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cblxuLmN0cmwtYWN0aXZlIC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgYSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5cbi8qKiBzb2Z0LWJveC1zaGFkb3cgY2xhc3MgKi9cbi5zb2Z0LWJveC1zaGFkb3cge1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDIxNiwgMTk2LCAxOTYsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcbn1cblxuLyoqIGFuZCBzb2Z0LWJveC1zaGFkb3cgKi9cblxuXG4vKiogc2VsZWN0aW9uLXdyYXBwZXIgY2xhc3MgKi9cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICB0b3A6IDIuMnJlbTtcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuMzEyNXJlbTtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuLFxuLnNlbGVjdC13cmFwcGVyIGJ1dHRvbiBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcbiAgICB3aWR0aDogMS4zNzVyZW07XG4gICAgaGVpZ2h0OiAxLjM3NXJlbTtcbiAgICBjb2xvcjogIzI0MjQyNDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4uc2VsZWN0LXdyYXBwZXI+YnV0dG9uIHtcbiAgICBjb2xvcjogIzM3MzUyZmQ5O1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbn1cblxuLyoqIGVuZCBzZWxlY3Rpb24gd3JhcHBlciAqKi9cblxuXG5cbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xuXG5cblxuLmZsb2F0aW5nLXRvb2xiYXIge1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG5cbi5mbG9hdGluZy10b29sYmFyIC5pdGVtIHtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDEwcHg7XG59XG5cbi5pdGVtPmJ1dHRvbixcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbiB7XG5cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuXG4uZmxvYXRpbmctdG9vbGJhciBzZWxlY3Qge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OyAqL1xufVxuXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4jdHVybkludG9CdXR0b24gc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuXG59XG5cbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcbiAgICBtYXJnaW46IGF1dG87XG59XG5cblxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcbiAgICBjb2xvcjogIzIzODJlMjtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICMyMzgyZTIgIWltcG9ydGFudDtcbn1cblxuXG5cbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ubW9yZVRleHRPcHRpb25XcmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuLmJnYy1yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRERFREU7XG59XG5cbi5iZ2MtZ3JlZW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XG59XG5cbi5iZ2MtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbn1cblxuLmJnYy15ZWxsb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQUY0RDE7XG59XG5cbi5iZ2MtZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcbn1cblxucCxcbm1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG5cbi5ib3JkZXItbGVzcy1pbWFnZSB7XG4gICAgd2lkdGg6IDI0cHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xufVxuXG5cblxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMzczNTJmYTY7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjMxMjVyZW07XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb24ge1xuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcbiAgICBtYXJnaW46IDAuMzEyNXJlbSAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG4gICAgZ2FwOiAwLjZyZW07XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuLm9wdGlvbi1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcbi5kYW5nZXItb3B0aW9uLm9wdGlvbi1mb2N1c2VkIHN2ZyB7XG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcbn1cblxuXG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuXG5cbiNjb2xvclRleHRCdXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcbn1cblxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcbiNjb2xvclRleHRCdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuI21vcmVUZXh0T3B0aW9uQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3Zlcixcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG5cbi5vcHRpb25bZm9jdXNlZD1cInRydWVcIl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGU0ZmY7XG59XG5cbi5vcHRpb24taW1hZ2Uge1xuICAgIHdpZHRoOiAyLjg3NXJlbTtcbiAgICBoZWlnaHQ6IDIuODc1cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NXJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICAgIGNvbG9yOiAjNGY0ZjRmO1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4ub3B0aW9uLWltYWdlIGltZyB7XG4gICAgbWF4LXdpZHRoOiAyLjg3NXJlbTtcbiAgICBtYXgtaGVpZ2h0OiAyLjg3NXJlbTtcbn1cblxuLm9wdGlvbi1pbWFnZSBzdmcge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHBhZGRpbmc6IDAuNjI1cmVtO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbn1cblxuLm9wdGlvbi10ZXh0ICoge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuXG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC41KTtcbn1cblxuLyoqIEVuZCBCbG9jayBPcHRpb25zICoqL1xuXG5cbi5qb2hhbm5lcy1lZGl0b3IgKjo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTtcbiAgICBjb2xvcjogd2hpdGU7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgbWFyayxcbi5qb2hhbm5lcy1lZGl0b3IgKjpub3QoaDEpIHtcbiAgICBsaW5lLWhlaWdodDogMS41ICFpbXBvcnRhbnQ7XG59XG5cbi5vcHRpb24ge1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cblxuLnRleHQtb3B0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMC42MjVyZW07XG59XG5cblxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAvKiBBdW1lbnRhIG8gdGFtYW5obyBkYSBmb250ZSBwYXJhIHRlbGFzIGRlIGFsdGEgZGVuc2lkYWRlICovXG4gICAgfVxufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXG4gICAgfVxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICBtYXgtd2lkdGg6IGluaGVyaXQ7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0aCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XG4gICAgbWluLWhlaWdodDogMjBweDtcbn1cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODQ4ODhkO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGFsaWduLWl0ZW1zOiBzdGFydDtcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBtYXgtd2lkdGg6IDIwMHB4O1xuXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xuXG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZC5zZWxlY3RlZCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZDpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggIzc0YjZkYiBpbnNldDtcbiAgICBib3JkZXI6IDFweCBkb3VibGUgIzc0YjZkYjtcblxufVxuXG50ZCB7XG4gICAgbWluLWhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxuXG50ZDo6cGxhY2Vob2xkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG50ZDplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi50YWJsZS13cmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRhYmxlLWNvbnRyb2xsZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbi5hZGQtdGFibGUtcm93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAxcmVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYWRkLXRhYmxlLWNvbHVtbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAtMS4zMTI1cmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XG4gICAgd2lkdGg6IDFyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFyZW0gLSA1cHgpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uYWRkLXRhYmxlLXJvdzpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLnRhYmxlLXNoZWxsIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cblxuXG4udGFibGUtb3B0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuXG4vKiogQ2FsbG91dCAqKi9cblxuLmNhbGxvdXQtd3JhcHBlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbn1cblxuLmNhbGxvdXQ6aG92ZXIgLm9wdGlvbnMtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4uY2FsbG91dCBwIHtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVlYmViO1xuICAgIGJvcmRlci1jb2xvcjogI0ZEREVERTtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmVlbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ViZmJlZTtcbiAgICBib3JkZXItY29sb3I6ICNEN0Y3REM7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZjRmYTtcbiAgICBib3JkZXItY29sb3I6ICNEOUVERjY7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQteWVsbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2RmO1xuICAgIGJvcmRlci1jb2xvcjogI0ZBRjREMTtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmV5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2VjO1xuICAgIGJvcmRlci1jb2xvcjogI0UxRTBFMDtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ub25lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XG5cbn1cblxuLyoqIGVuZCBjYWxsb3V0ICovXG5cblxuLyoqIG1lZGlhSW5wdXR0ZXIgKiovXG4ubWVkaWFJbnB1dHRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi8qKiBtZWRpYUlucHV0dGVyICoqL1xuXG5cbi5uby1zZWxlY3Rpb24ge1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5wb2ludGVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cblxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cblxuLnRhYi1jb250YWluZXIge1xuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xuXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XG5cblxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG5cbn1cblxuLm5hdi11bmRlcmxpbmUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi1yaWdodDogMTVweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1saW5rIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC41KTtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG59XG5cblxuLm5hdi1pdGVtLmFjdGl2ZSAubmF2LWxpbmsge1xuICAgIGNvbG9yOiAjMzczNTJmZDk7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cblxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgcGFkZGluZzogMjBweDtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEuYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGdhcDogMXJlbTtcbn1cblxuLnRhYi1jb250ZW50IC50ZXh0LWluZm8ge1xuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjYpO1xufVxuXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLmVtYmVkLWNvbnRlbnQgaW5wdXQge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5lbWJlZC1jb250ZW50IGJ1dHRvbiB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5cbi51cGxvYWQtY29udGVudCBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4udXBsb2FkLWNvbnRlbnQgbGFiZWw6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XG59XG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFJlc2l6ZSBoYW5kbGVyICovXG4ucmVzaXplLWhhbmRsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cblxuLnJlc2l6ZS1oYW5kbGUuc2Uge1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbn1cblxuLyoqIFJlc2l6ZSBoYW5kbGVyICoqL1xuXG4uc3BvdGlmeS1lbWJlZCB7XG4gICAgbWluLWhlaWdodDogMTUycHg7XG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiAuNzVyZW0gIWltcG9ydGFudDtcbn1cblxuLmdpc3QtZW1iZWQge1xuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogMTUwcHggIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uc25pcHBldC1lbWJlZCB7XG4gICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICBtaW4taGVpZ2h0OiAxNTBweCAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbi5lbWJlZC1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xuICAgIGhlaWdodDogMDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLmVtYmVkLWNvbnRhaW5lciBpZnJhbWUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cblxuLmlmcmFtZS13cmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuXG4udmlkZW8tY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnZpZGVvLWNvbnRhaW5lciBpZnJhbWUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cblxuXG5cblxuXG5cbi54LXJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XG4gICAgbWluLXdpZHRoOiAyNTBweDtcbn1cblxuLnktcmVzaXphYmxlIHtcbiAgICByZXNpemU6IHZlcnRpY2FsO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGN1cnNvcjogbnMtcmVzaXplO1xuICAgIG1pbi1oZWlnaHQ6IDE1MHB4O1xufVxuXG4uYmFja2dyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTZlMztcbn1cblxuXG4uZml0LWNvbnRlbnQge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBoZWlnaHQ6IGZpdC1jb250ZW50O1xufVxuXG5cbi8qKiBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xuLmJsb2NrLXRvb2xiYXItd3JhcHBlciB7XG4gICAgd2lkdGg6IDA7XG4gICAgaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICBkaXNwbGF5OiBibG9jaztcblxufVxuXG4uYmxvY2stdG9vbGJhciB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZ2FwOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XG5cbiAgICB0b3A6IDVweDtcbiAgICByaWdodDogNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmJsb2NrLXRvb2xiYXIgLml0ZW0ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uYmxvY2stdG9vbGJhciAuaXRlbSBidXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5ibG9jay10b29sYmFyIGJ1dHRvbiB7XG4gICAgY29sb3I6IGJsYWNrO1xufVxuXG4uYmxvY2stdG9vbGJhciAuY29sb3ItaW50ZXJhY3RpdmUtYnV0dG9uIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLyoqIEVuZCBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xuXG5cblxuLmp1c3RpZnktbGVmdCB7XG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xufVxuXG4uanVzdGlmeS1jZW50ZXIge1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uanVzdGlmeS1yaWdodCB7XG4gICAganVzdGlmeS1jb250ZW50OiByaWdodDtcbn1cblxuXG4uaGlkZGVuIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcbn1cblxuXG5cblxuZmlndXJlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuXG4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vKiogSW5saW5lIENvZGUgKiovXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGNvZGU6bm90KHByZSBjb2RlKSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M3YTtcbiAgICBwYWRkaW5nOiAwIDNweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbn1cblxuLyoqIENvbnRlbnQgcGxhY2Vob2xkZXIgKi9cblxuLmNvbnRlbnQtcGxhY2Vob2xkZXIge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTZlMztcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiA1cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY29udGVudC1wbGFjZWhvbGRlciAuaWNvbi13cmFwcGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XG59XG5cblxuLyogZW5kIENvbnRlbnQgcGxhY2Vob2xkZXIgKi9cblxuXG5cbi8qKiBDb2RlICoqL1xuXG5wcmUge1xuICAgIG1hcmdpbjogMDtcbn1cblxucHJlIGNvZGUge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmlnbm9yZS1ldmVudHMge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNvZGUtYmxvY2sge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNvZGUtYmxvY2sgc2VsZWN0IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5jb2RlLWJsb2NrIHNlbGVjdCB7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgLyogY29sb3I6IGluaGVyaXQ7ICovXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAxMHB4IGNlbnRlcjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmNvZGUtYmxvY2s6aG92ZXIgc2VsZWN0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbi5jb2RlLWJsb2NrIGNvZGUge1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcblxufVxuXG5cblxuQGtleWZyYW1lcyBzaGFrZSB7XG5cbiAgICAwJSxcbiAgICAxMDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICAgIH1cblxuICAgIDI1JSxcbiAgICA3NSUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTVweCk7XG4gICAgfVxuXG4gICAgNTAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDVweCk7XG4gICAgfVxufVxuXG4uc2hha2UtYW5pbWF0aW9uIHtcbiAgICBhbmltYXRpb246IHNoYWtlIDAuNnMgY3ViaWMtYmV6aWVyKC4zNiwgLjA3LCAuMTksIC45NykgYm90aDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBwZXJzcGVjdGl2ZTogMTAwMHB4O1xufVxuXG4uYmx1ZS1idXR0b24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMyMzgzZTI7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBwYWRkaW5nOiAzcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cblxuLyoqIHNlcGFyYXRvciAqKi9cblxuLnNlcGFyYXRvci13cmFwcGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZXBhcmF0b3Ige1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG59XG5cbi5zZXBhcmF0b3Itd3JhcHBlciBociB7XG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uc2VwYXJhdG9yLXdyYXBwZXIgaHI6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnNlcGFyYXRvci1zZWxlY3RlZCB7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xufVxuXG4uc2VwYXJhdG9yLXNlbGVjdGVkIGhyIHtcbiAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBib3JkZXItY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG59XG5cbi8qKiBlbmQgc2VwYXJhdG9yICovXG5cblxuXG5cbiNsaW5rQm94SW5wdXR7XG5cbn1cblxuLmNvbnRlbnQtZGF0YSBpbnB1dDpmb2N1cyxcbiNsaW5rQm94SW5wdXQ6Zm9jdXMge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCAjNEE5MEUyO1xuICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSg3NCwgMTQ0LCAyMjYsIDAuNSk7XG59XG5cblxuLmQtbm9uZXtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvYXNzZXRzL2Nzcy9tYWluLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxrQkFBa0I7QUFDbEI7SUFDSSx1QkFBdUI7SUFDdkIsZ0NBQWdDO0FBQ3BDOzs7O0FBSUEsZUFBZTtBQUNmO0lBQ0ksWUFBWTtJQUNaLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsYUFBYTtJQUNiLG1CQUFtQjtBQUN2Qjs7QUFFQSxlQUFlO0FBQ2Y7SUFDSSxTQUFTO0lBQ1QsVUFBVTtJQUNWLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0QixtQkFBbUI7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c0NBQXNDO0FBQzFDOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLDhCQUE4QjtBQUNsQzs7QUFFQSxtQkFBbUI7Ozs7O0FBS25COztBQUVBOztBQUVBOztJQUVJLDBCQUEwQjtJQUMxQiwyQ0FBMkM7QUFDL0M7OztBQUdBO0lBQ0ksd0JBQXdCO0FBQzVCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKiBjdXJzb3Igc3R5bGUgKi9cXG5bY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl0ge1xcbiAgICBjdXJzb3I6IHRleHQgIWltcG9ydGFudDtcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbi8qKiBDU1MgcmVzZXQgKi9cXG4uYnV0dG9uLXJlc2V0IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIGZvbnQ6IGluaGVyaXQ7XFxuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxufVxcblxcbi8qKiBhZGQgYmxvY2sgKi9cXG4uYWRkLWJsb2NrIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XFxufVxcblxcbi5hZGQtYmxvY2std3JhcHBlciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMuMTI1cmVtO1xcbn1cXG5cXG4uYWRkLWJsb2NrLXdyYXBwZXI6aG92ZXIgLmFkZC1ibG9jayB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi8qKiBhbmQgYWRkIGJsb2NrICovXFxuXFxuXFxuXFxuLyoqIExpc3QgICoqL1xcbi5saXN0IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgZ2FwOiAxMHB4O1xcblxcbn1cXG5cXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XFxuICAgIG1hcmdpbi10b3A6IDAuNXJlbTtcXG59XFxuXFxuLmxpc3QgbGkgZGl2IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIGxpbmUtaGVpZ2h0OiAxO1xcbn1cXG5cXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogbm9uZTsgKi9cXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgdG9wOiAwO1xcblxcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuXFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGkge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuXFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjMxMjVyZW07XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6aG92ZXI+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogaW5saW5lLWJsb2NrOyAqL1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cXG59XFxuXFxucC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIGxpbmUtaGVpZ2h0OiAxO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgLmNoZWNrYm94LWxpc3Qge1xcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICAgIHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IGxpIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXTpjaGVja2VkK3NwYW4ge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xcbi5ibG9jayBpbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdOmNoZWNrZWQrZGl2IHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cXG4uYmxvY2sgb2wsXFxuLmJsb2NrIHVsIHtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuXFxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXG5cXG59XFxuXFxuLmJsb2NrIG9sIGxpIHtcXG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGl0ZW07XFxufVxcblxcbi5ibG9jayBvbCBsaTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcXFwiLlxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xcbn1cXG5cXG4uYmxvY2sgdWwgbGk6bm90KC5uby1saXN0LXN0eWxlKTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIuKAolxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG5cXG4vKiogYW5kIGxpc3QgKiovXFxuXFxuXFxuLmRyYWctaGFuZGxlciB7XFxuICAgIGNvbG9yOiAjODQ4ODhkO1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICAgIGN1cnNvcjogZ3JhYjtcXG4gICAgYWxpZ24tc2VsZjogc3RhcnQ7XFxuICAgIHBhZGRpbmctdG9wOiAwLjMzcmVtO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5kcmFnLWhhbmRsZXItd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgaGVpZ2h0OiAwO1xcbiAgICB3aWR0aDogMDtcXG59XFxuXFxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEuMjVyZW0gIWltcG9ydGFudDtcXG59XFxuXFxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxufVxcblxcbi5kcm9wLWxpbmUge1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NDg4OGQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG4udGl0bGUgaDEge1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbiAgICBsaW5lLWhlaWdodDogM3JlbTtcXG59XFxuXFxuXFxuW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOmVtcHR5OmZvY3VzIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuaDFbZGF0YS1wbGFjZWhvbGRlcl06Zm9jdXM6YmVmb3JlIHt9XFxuXFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuY2l0ZVtjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmZvY3VzOmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmxpLmRpdltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuaDEge1xcbiAgICBmb250LXNpemU6IDIuNXJlbTtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY29udGVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4uY29udGVudCAuYmxvY2sgLnRhYmxlLXdyYXBwZXIge1xcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XFxufVxcblxcblxcbltjb250ZW50ZWRpdGFibGVdIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuYm9keSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBcXFwiU2Vnb2UgVUlcXFwiLCBSb2JvdG8sIFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsIFxcXCJOb3RvIFNhbnNcXFwiLCBcXFwiTGliZXJhdGlvbiBTYW5zXFxcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFxcXCJBcHBsZSBDb2xvciBFbW9qaVxcXCIsIFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsIFxcXCJTZWdvZSBVSSBTeW1ib2xcXFwiLCBcXFwiTm90byBDb2xvciBFbW9qaVxcXCI7XFxuICAgIG1hcmdpbi1ib3R0b206IDIwMHB4O1xcbn1cXG5cXG5cXG4uZWRpdG9yIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgbWFyZ2luLXRvcDogODBweDtcXG59XFxuXFxucCB7XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbn1cXG5cXG5cXG4uYmxvY2ssXFxuLmJsb2NrICoge1xcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxufVxcblxcblxcbiNqb2hhbm5lc0VkaXRvciB7XFxuICAgIHdpZHRoOiA2MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgaHIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAycHg7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XFxufVxcblxcblxcblxcbi5qb2hhbm5lcy1lZGl0b3IgYmxvY2txdW90ZSB7XFxuICAgIG1hcmdpbjogMC41cmVtIDA7XFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcXG4gICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZSB7XFxuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuXFxuLmpvaGFubmVzLWVkaXRvciBjaXRlOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiAn4oCUICc7XFxufVxcblxcblxcbiNsaW5rQm94IHtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4jbGlua0JveCAuaGVhZGVyIHtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XFxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcXG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xcbiAgICBjb2xvcjogIzM3MzUyZmQ5O1xcbiAgICBmb250LXdlaWdodDogNjAwO1xcbn1cXG5cXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBnYXA6IDFyZW07XFxuICAgIHBhZGRpbmc6IDIwcHg7XFxufVxcblxcblxcbiNsaW5rQm94IC5saW5rLWJveC1zaGVsbCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4uY3RybC1hY3RpdmUgLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBhIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5cXG4vKiogc29mdC1ib3gtc2hhZG93IGNsYXNzICovXFxuLnNvZnQtYm94LXNoYWRvdyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBib3gtc2hhZG93OlxcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgyMTYsIDE5NiwgMTk2LCAwLjAyKSxcXG4gICAgICAgIC0ycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xcblxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xcbn1cXG5cXG4vKiogYW5kIHNvZnQtYm94LXNoYWRvdyAqL1xcblxcblxcbi8qKiBzZWxlY3Rpb24td3JhcHBlciBjbGFzcyAqL1xcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIHtcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICAgIHRvcDogMi4ycmVtO1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjMxMjVyZW07XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMC42MjVyZW07XFxuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NXJlbTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkgc3BhbixcXG4uc2VsZWN0LXdyYXBwZXIgYnV0dG9uIHNwYW4ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHdpZHRoOiBtYXgtY29udGVudDtcXG4gICAgbGluZS1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Uge1xcbiAgICB3aWR0aDogMS4zNzVyZW07XFxuICAgIGhlaWdodDogMS4zNzVyZW07XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkgLm9wdGlvbi1pbWFnZSBzdmcge1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiB7XFxuICAgIGNvbG9yOiAjMzczNTJmZDk7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaT5oMyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogIzM3MzUyZmE2O1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XFxufVxcblxcbi8qKiBlbmQgc2VsZWN0aW9uIHdyYXBwZXIgKiovXFxuXFxuXFxuXFxuLyoqIFRleHQgZm9ybWF0dGluZyBCYXIgKiovXFxuXFxuXFxuXFxuLmZsb2F0aW5nLXRvb2xiYXIge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG5cXG4uZmxvYXRpbmctdG9vbGJhciAuaXRlbSB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMTBweDtcXG59XFxuXFxuLml0ZW0+YnV0dG9uLFxcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbiB7XFxuXFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHNlbGVjdCB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OyAqL1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b24gc3BhbiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAwLjlyZW07XFxuXFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcXG4gICAgbWFyZ2luOiBhdXRvO1xcbn1cXG5cXG5cXG4udGV4dC1mb3JtYXR0aW5nLWJ1dHRvbi1hY3RpdmUge1xcbiAgICBjb2xvcjogIzIzODJlMjtcXG59XFxuXFxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcXG4gICAgYm9yZGVyLWNvbG9yOiAjMjM4MmUyICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLm1vcmVUZXh0T3B0aW9uV3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuXFxuLmJnYy1yZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xcbn1cXG5cXG4uYmdjLWdyZWVuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcXG59XFxuXFxuLmJnYy1ibHVlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcXG59XFxuXFxuLmJnYy15ZWxsb3cge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGNEQxO1xcbn1cXG5cXG4uYmdjLWdyZXkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFFMEUwO1xcbn1cXG5cXG5wLFxcbm1hcmsge1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuXFxuLmJvcmRlci1sZXNzLWltYWdlIHtcXG4gICAgd2lkdGg6IDI0cHg7XFxuICAgIGhlaWdodDogMjRweDtcXG59XFxuXFxuXFxuXFxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuLmJsb2NrLW9wdGlvbnMtd3JhcHBlciB7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyB7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgbWF4LWhlaWdodDogMTlyZW07XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHNlY3Rpb24gaDIge1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiAjMzczNTJmYTY7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW4tdG9wOiAwLjMxMjVyZW07XFxuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcXG4gICAgcGFkZGluZy1sZWZ0OiAwLjMxMjVyZW07XFxufVxcblxcbi5ibG9jay1vcHRpb25zIC5vcHRpb24ge1xcbiAgICBwYWRkaW5nOiAwLjMxMjVyZW0gMC42MjVyZW07XFxuICAgIG1hcmdpbjogMC4zMTI1cmVtIDA7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xcbiAgICBnYXA6IDAuNnJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi5vcHRpb24tZm9jdXNlZCB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuLmRhbmdlci1vcHRpb24ub3B0aW9uLWZvY3VzZWQsXFxuLmRhbmdlci1vcHRpb24ub3B0aW9uLWZvY3VzZWQgc3ZnIHtcXG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbjpmb2N1cy12aXNpYmxlIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBpbmhlcml0O1xcbn1cXG5cXG5cXG5cXG4jY29sb3JUZXh0QnV0dG9uIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDAuNjI1cmVtO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbiNjb2xvclRleHRCdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbiNtb3JlVGV4dE9wdGlvbkJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDJweCAjZTllOWU5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XFxuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcXG59XFxuXFxuXFxuXFxuLm9wdGlvbltmb2N1c2VkPVxcXCJ0cnVlXFxcIl0ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmRlNGZmO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDIuODc1cmVtO1xcbiAgICBoZWlnaHQ6IDIuODc1cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAwLjE4NzVyZW07XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxuICAgIGNvbG9yOiAjNGY0ZjRmO1xcblxcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmY7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi5vcHRpb24taW1hZ2UgaW1nIHtcXG4gICAgbWF4LXdpZHRoOiAyLjg3NXJlbTtcXG4gICAgbWF4LWhlaWdodDogMi44NzVyZW07XFxufVxcblxcbi5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBwYWRkaW5nOiAwLjYyNXJlbTtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG5cXG59XFxuXFxuLm9wdGlvbi10ZXh0ICoge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAuYmxvY2stdGl0bGUge1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNSk7XFxufVxcblxcbi8qKiBFbmQgQmxvY2sgT3B0aW9ucyAqKi9cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xcbiAgICBjb2xvcjogd2hpdGU7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgbWFyayxcXG4uam9oYW5uZXMtZWRpdG9yICo6bm90KGgxKSB7XFxuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcXG59XFxuXFxuLm9wdGlvbiB7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuXFxuLnRleHQtb3B0aW9uIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiAwLjYyNXJlbTtcXG59XFxuXFxuXFxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgICAgLyogQXVtZW50YSBvIHRhbWFuaG8gZGEgZm9udGUgcGFyYSB0ZWxhcyBkZSBhbHRhIGRlbnNpZGFkZSAqL1xcbiAgICB9XFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXFxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xcbiAgICA6cm9vdCB7XFxuICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXFxuICAgIH1cXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gICAgbWF4LXdpZHRoOiBpbmhlcml0O1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcXG4gICAgbWluLWhlaWdodDogMjBweDtcXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxuXFxuICAgIHRyYW5zaXRpb246IGJvcmRlciAxMDBtcyBlYXNlLW91dCwgYm94LXNoYWRvdyAxMDBtcyBlYXNlLW91dDtcXG5cXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkLnNlbGVjdGVkLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZDpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCAjNzRiNmRiIGluc2V0O1xcbiAgICBib3JkZXI6IDFweCBkb3VibGUgIzc0YjZkYjtcXG5cXG59XFxuXFxudGQge1xcbiAgICBtaW4taGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAxcmVtO1xcbn1cXG5cXG50ZDo6cGxhY2Vob2xkZXIge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxudGQ6ZW1wdHk6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGFjZDtcXG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuXFxuLnRhYmxlLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLnRhYmxlLWNvbnRyb2xsZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmFkZC10YWJsZS1yb3cge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBtYXJnaW4tdG9wOiAwLjM3NXJlbTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxcmVtO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4uYWRkLXRhYmxlLWNvbHVtbiB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IC0xLjMxMjVyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XFxuICAgIHdpZHRoOiAxcmVtO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgdG9wOiAwO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGhlaWdodDogY2FsYygxMDAlIC0gMXJlbSAtIDVweCk7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4uYWRkLXRhYmxlLWNvbHVtbjpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxufVxcblxcbi5hZGQtdGFibGUtcm93OmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLnRhYmxlLXNoZWxsIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG5cXG4udGFibGUtb3B0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICB6LWluZGV4OiA5OTk5OTk7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5cXG4vKiogQ2FsbG91dCAqKi9cXG5cXG4uY2FsbG91dC13cmFwcGVyIHtcXG4gICAgcGFkZGluZzogMXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbn1cXG5cXG4uY2FsbG91dDpob3ZlciAub3B0aW9ucy1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY2FsbG91dCBwIHtcXG4gICAgbWFyZ2luOiAwO1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLXJlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWViZWI7XFxuICAgIGJvcmRlci1jb2xvcjogI0ZEREVERTtcXG59XFxuXFxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmVlbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlYmZiZWU7XFxuICAgIGJvcmRlci1jb2xvcjogI0Q3RjdEQztcXG59XFxuXFxuLmNhbGxvdXQtYmFja2dyb3VuZC1ibHVlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZjRmYTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjRDlFREY2O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLXllbGxvdyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZGY7XFxuICAgIGJvcmRlci1jb2xvcjogI0ZBRjREMTtcXG59XFxuXFxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmV5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlYztcXG4gICAgYm9yZGVyLWNvbG9yOiAjRTFFMEUwO1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLW5vbmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZTdlNmU2O1xcblxcbn1cXG5cXG4vKiogZW5kIGNhbGxvdXQgKi9cXG5cXG5cXG4vKiogbWVkaWFJbnB1dHRlciAqKi9cXG4ubWVkaWFJbnB1dHRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4vKiogbWVkaWFJbnB1dHRlciAqKi9cXG5cXG5cXG4ubm8tc2VsZWN0aW9uIHtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLnBvaW50ZXIge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcbi8qKiB1cGxvYWQvZW1iZWQgKiovXFxuXFxuLnRhYi1jb250YWluZXIge1xcbiAgICBmb250LXNpemU6IDAuODZyZW07XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcXG5cXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuXFxuICAgIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4ycyBlYXNlO1xcblxcblxcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuXFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcbn1cXG5cXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtbGluayB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcbi5uYXYtaXRlbS5hY3RpdmUgLm5hdi1saW5rIHtcXG4gICAgY29sb3I6ICMzNzM1MmZkOTtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcXG59XFxuXFxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBib3JkZXItdG9wOiBub25lO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcbi50YWItY29udGVudCAuY29udGVudC1kYXRhLmFjdGl2ZSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZ2FwOiAxcmVtO1xcbn1cXG5cXG4udGFiLWNvbnRlbnQgLnRleHQtaW5mbyB7XFxuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTtcXG59XFxuXFxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcXG4gICAgZGlzcGxheTogaW5saW5lO1xcbn1cXG5cXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG4uZW1iZWQtY29udGVudCBidXR0b24ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbCB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBwYWRkaW5nOiA0cHg7XFxuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxufVxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qIFJlc2l6ZSBoYW5kbGVyICovXFxuLnJlc2l6ZS1oYW5kbGUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcXG59XFxuXFxuLnJlc2l6ZS1oYW5kbGUuc2Uge1xcbiAgICBib3R0b206IDA7XFxuICAgIHJpZ2h0OiAwO1xcbn1cXG5cXG4vKiogUmVzaXplIGhhbmRsZXIgKiovXFxuXFxuLnNwb3RpZnktZW1iZWQge1xcbiAgICBtaW4taGVpZ2h0OiAxNTJweDtcXG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IC43NXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZ2lzdC1lbWJlZCB7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5zbmlwcGV0LWVtYmVkIHtcXG4gICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcXG4gICAgbWluLWhlaWdodDogMTUwcHggIWltcG9ydGFudDtcXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmVtYmVkLWNvbnRhaW5lciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XFxuICAgIGhlaWdodDogMDtcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxufVxcblxcbi5lbWJlZC1jb250YWluZXIgaWZyYW1lIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcblxcbi5pZnJhbWUtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuXFxuXFxuLnZpZGVvLWNvbnRhaW5lciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XFxuICAgIGhlaWdodDogMDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnZpZGVvLWNvbnRhaW5lciBpZnJhbWUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuLngtcmVzaXphYmxlIHtcXG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgY3Vyc29yOiBuZXN3LXJlc2l6ZTtcXG4gICAgbWluLXdpZHRoOiAyNTBweDtcXG59XFxuXFxuLnktcmVzaXphYmxlIHtcXG4gICAgcmVzaXplOiB2ZXJ0aWNhbDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGN1cnNvcjogbnMtcmVzaXplO1xcbiAgICBtaW4taGVpZ2h0OiAxNTBweDtcXG59XFxuXFxuLmJhY2tncm91bmQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbn1cXG5cXG5cXG4uZml0LWNvbnRlbnQge1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XFxufVxcblxcblxcbi8qKiBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xcbi5ibG9jay10b29sYmFyLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMDtcXG4gICAgaGVpZ2h0OiAwO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG5cXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XFxuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBnYXA6IDEwcHg7XFxuICAgIHBhZGRpbmc6IDVweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxuXFxuICAgIHRvcDogNXB4O1xcbiAgICByaWdodDogNXB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIHtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIGJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIGJ1dHRvbiB7XFxuICAgIGNvbG9yOiBibGFjaztcXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIgLmNvbG9yLWludGVyYWN0aXZlLWJ1dHRvbiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG59XFxuXFxuLyoqIEVuZCBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xcblxcblxcblxcbi5qdXN0aWZ5LWxlZnQge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxufVxcblxcbi5qdXN0aWZ5LWNlbnRlciB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG5cXG4uanVzdGlmeS1yaWdodCB7XFxuICAgIGp1c3RpZnktY29udGVudDogcmlnaHQ7XFxufVxcblxcblxcbi5oaWRkZW4ge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuXFxuZmlndXJlIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG5cXG4ub3ZlcmZsb3ctaGlkZGVuIHtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLyoqIElubGluZSBDb2RlICoqL1xcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgY29kZTpub3QocHJlIGNvZGUpIHtcXG4gICAgZm9udC1zaXplOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjN2E7XFxuICAgIHBhZGRpbmc6IDAgM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxufVxcblxcbi8qKiBDb250ZW50IHBsYWNlaG9sZGVyICovXFxuXFxuLmNvbnRlbnQtcGxhY2Vob2xkZXIge1xcbiAgICBwYWRkaW5nOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBnYXA6IDVweDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5jb250ZW50LXBsYWNlaG9sZGVyIC5pY29uLXdyYXBwZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcXG59XFxuXFxuXFxuLyogZW5kIENvbnRlbnQgcGxhY2Vob2xkZXIgKi9cXG5cXG5cXG5cXG4vKiogQ29kZSAqKi9cXG5cXG5wcmUge1xcbiAgICBtYXJnaW46IDA7XFxufVxcblxcbnByZSBjb2RlIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uaWdub3JlLWV2ZW50cyB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmNvZGUtYmxvY2sge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5jb2RlLWJsb2NrIHNlbGVjdCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLmNvZGUtYmxvY2sgc2VsZWN0IHtcXG4gICAgYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDRweCA4cHg7XFxuICAgIGZvbnQ6IGluaGVyaXQ7XFxuICAgIC8qIGNvbG9yOiBpbmhlcml0OyAqL1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAxMHB4IGNlbnRlcjtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uY29kZS1ibG9jazpob3ZlciBzZWxlY3Qge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuLmNvZGUtYmxvY2sgY29kZSB7XFxuICAgIGZvbnQtc2l6ZTogMXJlbTtcXG5cXG59XFxuXFxuXFxuXFxuQGtleWZyYW1lcyBzaGFrZSB7XFxuXFxuICAgIDAlLFxcbiAgICAxMDAlIHtcXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXG4gICAgfVxcblxcbiAgICAyNSUsXFxuICAgIDc1JSB7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTVweCk7XFxuICAgIH1cXG5cXG4gICAgNTAlIHtcXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1cHgpO1xcbiAgICB9XFxufVxcblxcbi5zaGFrZS1hbmltYXRpb24ge1xcbiAgICBhbmltYXRpb246IHNoYWtlIDAuNnMgY3ViaWMtYmV6aWVyKC4zNiwgLjA3LCAuMTksIC45NykgYm90aDtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcXG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgICBwZXJzcGVjdGl2ZTogMTAwMHB4O1xcbn1cXG5cXG4uYmx1ZS1idXR0b24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjM4M2UyO1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgcGFkZGluZzogM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcblxcbi8qKiBzZXBhcmF0b3IgKiovXFxuXFxuLnNlcGFyYXRvci13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLnNlcGFyYXRvciB7XFxuICAgIGZsZXgtZ3JvdzogMTtcXG4gICAgcGFkZGluZzogMCAxMHB4O1xcbn1cXG5cXG4uc2VwYXJhdG9yLXdyYXBwZXIgaHIge1xcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZXBhcmF0b3Itd3JhcHBlciBocjpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlcGFyYXRvci1zZWxlY3RlZCB7XFxuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xcbn1cXG5cXG4uc2VwYXJhdG9yLXNlbGVjdGVkIGhyIHtcXG4gICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcXG59XFxuXFxuLyoqIGVuZCBzZXBhcmF0b3IgKi9cXG5cXG5cXG5cXG5cXG4jbGlua0JveElucHV0e1xcblxcbn1cXG5cXG4uY29udGVudC1kYXRhIGlucHV0OmZvY3VzLFxcbiNsaW5rQm94SW5wdXQ6Zm9jdXMge1xcbiAgICBvdXRsaW5lOiAycHggc29saWQgIzRBOTBFMjtcXG4gICAgYm94LXNoYWRvdzogMCAwIDVweCByZ2JhKDc0LCAxNDQsIDIyNiwgMC41KTtcXG59XFxuXFxuXFxuLmQtbm9uZXtcXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiZXhwb3J0IGVudW0gQ29udGVudFR5cGVzIHtcclxuICAgIFBhcmFncmFwaCA9IFwicFwiLFxyXG4gICAgSGVhZGluZ18xID0gXCJoMVwiLFxyXG4gICAgSGVhZGluZ18yID0gXCJoMlwiLFxyXG4gICAgSGVhZGluZ18zID0gXCJoM1wiLFxyXG4gICAgSGVhZGluZ180ID0gXCJoNFwiLFxyXG4gICAgSGVhZGluZ181ID0gXCJoNVwiLFxyXG4gICAgSGVhZGluZ182ID0gXCJoNlwiLFxyXG4gICAgQ2hlY2tMaXN0ID0gXCJjaGVja0xpc3RcIixcclxuICAgIEJ1bGxldGVkTGlzdCA9IFwiYnVsbGV0ZWRMaXN0XCIsXHJcbiAgICBOdW1iZXJlZExpc3QgPSBcIm51bWJlcmVkTGlzdFwiLFxyXG4gICAgTGlzdCA9IFwibGlzdFwiLFxyXG4gICAgVGFibGUgPSBcInRhYmxlXCIsXHJcbiAgICBJbWFnZSA9IFwiaW1hZ2VcIixcclxuICAgIFNjcmlwdCA9IFwic2NyaXB0XCIsXHJcbiAgICBJZnJhbWUgPSBcImlmcmFtZVwiXHJcbn0iLCJleHBvcnQgZW51bSBJY29ucyB7XHJcbiAgICBMaW5rID0gXCJpY29uLW1hdGVyaWFsLWxpbmtcIixcclxuICAgIEJvbGQgPSBcImljb24td29yZHByZXNzLWJvbGRcIixcclxuICAgIEl0YWxpYyA9IFwiaWNvbi1tYXRlcmlhbC1pdGFsaWNcIixcclxuICAgIFVuZGVybGluZSA9IFwiaWNvbi1tYXRlcmlhbC11bmRlcmxpbmVcIixcclxuICAgIElubGluZUNvZGUgPSBcImljb24tbWF0ZXJpYWwtY29kZS1pbmxpbmVcIixcclxuICAgIFN0cmlrZVRocm91Z2ggPSBcImljb24td29yZHByZXNzLXN0cmlrZS10aHJvdWdoXCIsXHJcbiAgICBQbHVzID0gXCJpY29uLXBsdXNcIixcclxuICAgIENvbHVtblJpZ2h0ID0gXCJpY29uLW1hdGVyaWFsLWNvbHVtbi1yaWdodFwiLFxyXG4gICAgQ29sdW1uTGVmdCA9IFwiaWNvbi1tYXRlcmlhbC1jb2x1bW4tbGVmdFwiLFxyXG4gICAgUm93QWJvdmUgPSBcImljb24tbWF0ZXJpYWwtcm93LWFib3ZlXCIsXHJcbiAgICBSb3dCZWxvdyA9IFwiaWNvbi1tYXRlcmlhbC1yb3ctYmVsb3dcIixcclxuICAgIGRlbGV0ZVN3ZWVwID0gXCJpY29uLW1hdGVyaWFsLWRlbGV0ZS1zd2VlcFwiLFxyXG4gICAgVHJhc2ggPSBcImljb24tbWF0ZXJpYWwtdHJhc2hcIixcclxuICAgIENsb3NlQ2lyY2xlID0gXCJpY29uLWlvbmljLWNsb3NlLWNpcmNsZVwiLFxyXG4gICAgRW1wdHkgPSBcIkVtcHR5XCIsXHJcbiAgICBDYWxsb3V0ID0gXCJpY29uLW1hdGVyaWFsLWNhbGxvdXRcIixcclxuICAgIEltYWdlID0gXCJpY29uLW1hdGVyaWFsLWltYWdlXCIsXHJcbiAgICBJbWFnZTIgPSBcImljb24tYm9vdHN0cmFwLWltYWdlXCIsXHJcbiAgICBWaWRlbyA9IFwiaWNvbi1tYXRlcmlhbC12aWRlb1wiLFxyXG4gICAgSnVzdGlmeVN0YXJ0ID0gIFwiaWNvbi1tYXRlcmlhbC1qdXN0aWZ5LXN0YXJ0XCIsXHJcbiAgICBKdXN0aWZ5Q2VudGVyID0gXCJpY29uLW1hdGVyaWFsLWp1c3RpZnktY2VudGVyXCIsXHJcbiAgICBKdXN0aWZ5RW5kID0gXCJpY29uLW1hdGVyaWFsLWp1c3RpZnktZW5kXCIsXHJcbiAgICBEdXBsaWNhdGUgPSBcImljb24tbWF0ZXJpYWwtZHVwbGljYXRlXCIsXHJcbiAgICBTcG90aWZ5ID0gXCJpY29uLWJvb3RzdHJhcC1zcG90aWZ5XCIsXHJcbiAgICBHaXRIdWIgPSBcImljb24tYm9vdHN0cmFwLWdpdGh1YlwiLFxyXG4gICAgR2l0TGFiID0gXCJpY29uLWJvb3RzdHJhcC1naXRsYWJcIixcclxuICAgIENvZGVQZW4gPSBcImljb24tY29kZXBlblwiLFxyXG4gICAgWW91VHViZSA9IFwiaWNvbi1ib290c3RyYXAteW91dHViZVwiXHJcblxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIENTUyBjbGFzcyBuYW1lcyB0aGF0IGFjdGl2YXRlIHNwZWNpZmljIGZ1bmN0aW9uYWxpdGllcyBpbiB0aGUgQmxvY2tUb29sYm94LlxyXG4gKiBFYWNoIG9wdGlvbiBjb3JyZXNwb25kcyB0byBhIGNsYXNzIHRoYXQsIHdoZW4gYXBwbGllZCwgZW5hYmxlcyBwYXJ0aWN1bGFyIGZlYXR1cmVzIFxyXG4gKiByZWxhdGVkIHRvIGNvbnRlbnQgZWRpdGluZyBhbmQgc3R5bGluZyB3aXRoaW4gYSBibG9jay5cclxuICpcclxuICogQGVudW0ge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBlbnVtIFRvb2xib3hPcHRpb25zIHtcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB0aGF0IGFjdGl2YXRlcyB0aGUgYmxvY2sgdG9vbGJhciBmb3IgY29udGVudCBpbnRlcmFjdGlvbi5cclxuICAgICAqIFRoaXMgY2xhc3MgaW5jbHVkZXMgdGhlIHRvb2xiYXIgYW5kIGVuYWJsZXMgYmFzaWMgaW50ZXJhY3Rpb24gY2FwYWJpbGl0aWVzLlxyXG4gICAgICovXHJcbiAgICBJbmNsdWRlQmxvY2tUb29sYmFyQ2xhc3MgPSBcImluY2x1ZGUtYmxvY2stdG9vbGJhclwiLCAvL2Jsb2NrLXRvb2xiYXIsIGJsb2NrLXRvb2xiYXIsIGNvbnRlbnQtaW50ZXJhY3RpdmVcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB0aGF0IGFjdGl2YXRlcyB0aGUgYWxpZ25tZW50IHRvb2xzIHdpdGhpbiB0aGUgdG9vbGJveC5cclxuICAgICAqIFRoaXMgY2xhc3MgZW5hYmxlcyBmdW5jdGlvbmFsaXRpZXMgZm9yIGFsaWduaW5nIHRoZSBjb250ZW50IHdpdGhpbiBhIGJsb2NrLlxyXG4gICAgICovXHJcbiAgICBBbGlnblRvb2xDbGFzcyA9IFwiYWxpZ24tdG9vbFwiLCAvL2ludGVyYWN0aXZlLWFsaWduXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdGhhdCBlbmFibGVzIGNvbG9yIGVkaXRpbmcgdG9vbHMgd2l0aGluIHRoZSB0b29sYm94LlxyXG4gICAgICogVGhpcyBjbGFzcyBwcm92aWRlcyBvcHRpb25zIGZvciBjaGFuZ2luZyB0aGUgY29sb3Igb2YgdGV4dCBhbmQgYmFja2dyb3VuZC5cclxuICAgICAqL1xyXG4gICAgQ29sb3JUb29sQ2xhc3MgPSBcImNvbG9yLXRvb2xcIiwgLy9pbnRlcmFjdGl2ZS1jb2xvclxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzcyBuYW1lIHRoYXQgYWN0aXZhdGVzIGFkZGl0aW9uYWwgb3B0aW9ucyB3aXRoaW4gdGhlIHRvb2xib3guXHJcbiAgICAgKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIHRvb2xib3ggd2l0aCBtb3JlIGFkdmFuY2VkIHNldHRpbmdzIGFuZCBmdW5jdGlvbmFsaXRpZXMsIGxpa2UgRGVsZXRlIGFuZCBEdXBsaWNhdGVcclxuICAgICAqL1xyXG4gICAgRXh0cmFPcHRpb25zQ2xhc3MgPSBcImV4dHJhLW9wdGlvbnNcIiwgLy9pbnRlcmFjdGl2ZS1tb3JlXHJcbiAgICBMYW5ndWFnZVNlbGVjdGlvblRvb2xDbGFzcyA9IFwibGFuZ3VhZ2Utc2VsZWN0aW9uLXRvb2xcIiAvL2ludGVyYWN0aXZlLW1vcmVcclxufSIsImV4cG9ydCBlbnVtIENvbW1vbkNsYXNzZXMge1xyXG4gICAgLyoqIFxyXG4gICAgICogQ2xhc3MgbmFtZSBmb3IgdGhlIG1haW4gY29udGVudCBlbGVtZW50cyB3aXRoaW4gYmxvY2tzLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5kaWNhdGVcclxuICAgICAqIHdoaWNoIGVsZW1lbnRzIGNvbnRhaW4gdGhlIGFjdHVhbCBjb250ZW50IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIG9wZXJhdGlvbnMgbGlrZVxyXG4gICAgICogc3R5bGluZyBvciBpbnRlcmFjdGlvbi5cclxuICAgICAqL1xyXG4gICAgQ29udGVudEVsZW1lbnQgPSBcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiLFxyXG4gICAgIC8qKlxyXG4gICAgKiBDbGFzcyBuYW1lIGZvciBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIGR1cmluZyBzYXZlIG9yIGV4cG9ydCBvcGVyYXRpb25zLlxyXG4gICAgKiBBcHBsaWVkIHNwZWNpZmljYWxseSB0byBlZGl0aW5nIFVJIGNvbXBvbmVudHMgd2l0aGluIHRoZSBgLmNvbnRlbnRgIGVsZW1lbnQgdG8gZW5zdXJlXHJcbiAgICAqIHRoZXkgYXJlIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIHNhdmVkIG9yIGV4cG9ydGVkIG91dHB1dC4gRWxlbWVudHMgb3V0c2lkZSB0aGUgYC5jb250ZW50YFxyXG4gICAgKiBzaG91bGQgbm90IHJlY2VpdmUgdGhpcyBjbGFzcyBhcyBpdCB3b3VsZCBsZWFkIHRvIHRoZSBsb3NzIG9mIGV2ZW50IGxpc3RlbmVycyB1cG9uIGFjdGlvbnNcclxuICAgICogbGlrZSB1bmRvIG9yIHJlZG8sIHdoaWNoIHJlbHkgb24gdGhlc2UgZWxlbWVudHMgYmVpbmcgY29uc2lzdGVudGx5IGF2YWlsYWJsZS5cclxuICAgICogRWxlbWVudHMgbWFya2VkIHdpdGggYEVkaXRvck9ubHlgIGluc2lkZSB0aGUgY29udGVudCBkbyBub3QgcmV0YWluIHBlcnNpc3RlbnQgbGlzdGVuZXJzO1xyXG4gICAgKiB0aGV5IGV4aXN0IG9ubHkgdHJhbnNpZW50bHkgZHVyaW5nIHRoZSBlZGl0IHNlc3Npb24sIHN1Y2ggYXMgdGhlIGBCbG9ja1Rvb2xib3hgLCB3aGljaFxyXG4gICAgKiBpcyByZWNyZWF0ZWQgcmF0aGVyIHRoYW4gc2F2ZWQuXHJcbiAgICAqL1xyXG4gICAgRWRpdG9yT25seSA9IFwiZWRpdG9yLW9ubHlcIixcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB1c2VkIHRvIGRlZmluZSBhIGNvbnRlbnQgYmxvY2suIEJsb2NrcyBhcmUgZnVuZGFtZW50YWwgc3RydWN0dXJhbCBlbGVtZW50c1xyXG4gICAgICogaW4gdGhlIGxheW91dCB0aGF0IG1heSBjb250YWluIHRleHQsIGltYWdlcywgb3Igb3RoZXIgdHlwZXMgb2YgY29udGVudC4gVGhpcyBjbGFzc1xyXG4gICAgICogaGVscHMgaW4gYXBwbHlpbmcgY29uc2lzdGVudCBzdHlsaW5nIGFuZCBiZWhhdmlvciB0byBjb250ZW50IGJsb2Nrcy5cclxuICAgICAqL1xyXG4gICAgQmxvY2sgPSBcImJsb2NrXCIsXHJcbiAgICAvKipcclxuICAgICogQ2xhc3MgbmFtZSB1c2VkIHRvIHRyaWdnZXIgdGhlIGRpc3BsYXkgb2YgdGhlIE1lZGlhSW5wdXR0ZXIgY29tcG9uZW50IHVwb24gYSBjbGljayBldmVudC5cclxuICAgICogV2hlbiBhbiBlbGVtZW50IHdpdGggdGhpcyBjbGFzcyBpcyBjbGlja2VkLCB0aGUgTWVkaWFJbnB1dHRlciBsaXN0ZW5zIGZvciB0aGUgZXZlbnRcclxuICAgICogYW5kIGFjdGl2YXRlcywgcHJvdmlkaW5nIGEgdXNlciBpbnRlcmZhY2UgZm9yIGVudGVyaW5nIGEgVVJMIGZvciBhbiBlbWJlZCBvciB1cGxvYWRpbmcgYSBmaWxlLlxyXG4gICAgKlxyXG4gICAgKiBUaGlzIGNsYXNzIGZhY2lsaXRhdGVzIHVzZXIgaW50ZXJhY3Rpb24gZm9yIGVtYmVkZGluZyBtZWRpYSBjb250ZW50IGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50LFxyXG4gICAgKiBzdHJlYW1saW5pbmcgdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIG11bHRpbWVkaWEgZWxlbWVudHMgbGlrZSBpbWFnZXMsIHZpZGVvcywgb3Igb3RoZXIgZW1iZWRkZWQgY29udGVudC5cclxuICAgICovXHJcbiAgICBTaG93TWVkaWFJbnB1dE9uQ2xpY2sgPSBcInNob3ctbWVkaWEtaW5wdXQtb24tY2xpY2tcIixcclxuICAgIFNob3dNZWRpYUlucHV0VXBsb2FkID0gIFwic2hvdy1tZWRpYS1pbnB1dC11cGxvYWRcIixcclxuICAgIFNob3dNZWRpYUlucHV0RW1iZWQgPSAgXCJzaG93LW1lZGlhLWlucHV0LWVtYmVkXCIsXHJcbn0iLCJleHBvcnQgZW51bSBDdXN0b21VSUV2ZW50cyB7XHJcbiAgICBcclxuICAgIENvbG9yQ2hhbmdlUmVxdWVzdCA9IFwiQ29sb3JDaGFuZ2VSZXF1ZXN0XCIsXHJcbiAgICBTaG93SGlkZUFjdGl2ZUJ1dHRvbiA9IFwiU2hvd0hpZGVBY3RpdmVCdXR0b25cIixcclxuICAgIFJlc2V0QWN0aXZlQnV0dG9ucyA9IFwiUmVzZXRBY3RpdmVCdXR0b25zXCIsXHJcbiAgICBDbG9zZUVsZW1lbnQgPSBcIkhpZGVDb21wb25lbnRcIixcclxuICAgIFNob3dFbGVtZW50ID0gXCJTaG93RWxlbWVudFwiLFxyXG4gICAgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgPSBcIkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlXCJcclxuICAgIFxyXG59IiwiLyoqXHJcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZXZlbnRzIGZvciBtb3VzZSwga2V5Ym9hcmQsIGFuZCBmb2N1cyBhY3Rpb25zLlxyXG4gKiBUaGlzIGVudW1lcmF0aW9uIHByb3ZpZGVzIHN0YW5kYXJkaXplZCBzdHJpbmdzIGZvciBhdHRhY2hpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIERPTSBlbGVtZW50cy5cclxuICogVXNlIHRoZXNlIGVudW0gdmFsdWVzIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBhbmQgYXZvaWQgdHlwb3MgaW4gZXZlbnQgbmFtZXMgdGhyb3VnaG91dCB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGVudW0gRGVmYXVsdEpTRXZlbnRzIHtcclxuICAgIExvYWQgPSAgXCJsb2FkXCIsXHJcbiAgICBNb3VzZWVudGVyID0gXCJtb3VzZWVudGVyXCIsXHJcbiAgICBNb3VzZWxlYXZlID0gXCJtb3VzZWxlYXZlXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgZG93bi4gKi9cclxuICAgIE1vdXNlZG93biA9IFwibW91c2Vkb3duXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQgb3ZlciBhbiBlbGVtZW50LiAqL1xyXG4gICAgTW91c2Vtb3ZlID0gXCJtb3VzZW1vdmVcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuICovXHJcbiAgICBNb3VzZXVwID0gXCJtb3VzZXVwXCIsXHJcbiAgICBNb3VzZW92ZXIgPSBcIm1vdXNlb3ZlclwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gYSBrZXkgaXMgcmVsZWFzZWQgb24gdGhlIGtleWJvYXJkLiAqL1xyXG4gICAgS2V5dXAgPSBcImtleXVwXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBhIGtleSBpcyBwcmVzc2VkIGRvd24gb24gdGhlIGtleWJvYXJkLiAqL1xyXG4gICAgS2V5ZG93biA9IFwia2V5ZG93blwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gYW4gZWxlbWVudCBsb3NlcyBmb2N1cy4gKi9cclxuICAgIEJsdXIgPSBcImJsdXJcIixcclxuICAgIFNlbGVjdFN0YXJ0ID0gXCJzZWxlY3RzdGFydFwiLFxyXG4gICAgU2VsZWN0aW9uQ2hhbmdlID0gXCJzZWxlY3Rpb25jaGFuZ2VcIixcclxuICAgIENsaWNrID0gXCJjbGlja1wiLFxyXG4gICAgRm9jdXNpbiA9IFwiZm9jdXNpblwiLFxyXG4gICAgRm9jdXNvdXQgPSBcImZvY3Vzb3V0XCIsXHJcbiAgICBET01Db250ZW50TG9hZGVkID0gXCJET01Db250ZW50TG9hZGVkXCIsXHJcbiAgICBJbnB1dCA9IFwiaW5wdXRcIixcclxuICAgIEJibENsaWNrID0gXCJkYmxjbGlja1wiXHJcbn0iLCJleHBvcnQgZW51bSBDdXN0b21FdmVudHMge1xyXG4gICAgLy9Db21wb25lbnQgZXZlbnRzXHJcbiAgICBmbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWQgPSBcImZsb2F0aW5nVG9vbGJhckRpc3BsYXllZFwiLFxyXG5cclxuICAgIC8vVGV4dCBjbGljayBlZGl0IGV2ZW50c1xyXG4gICAgYW5jaG9yQnV0dG9uQ2xpY2tlZCA9IFwiYW5jaG9yQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgYm9sZEJ1dHRvbkNsaWNrZWQgPSBcImJvbGRCdXR0b25DbGlja2VkXCIsXHJcbiAgICBpdGFsaWNCdXR0b25DbGlja2VkID0gXCJpdGFsaWNCdXR0b25DbGlja2VkXCIsXHJcbiAgICB1bmRlcmxpbmVCdXR0b25DbGlja2VkID0gXCJ1bmRlcmxpbmVCdXR0b25DbGlja2VkXCIsXHJcbiAgICBpbmxpbmVDb2RlQnV0dG9uQ2xpY2tlZCA9IFwiaW5saW5lQ29kZUJ1dHRvbkNsaWNrZWRcIixcclxuICAgIHN0cmlrZVRocm91Z2hCdXR0b25DbGlja2VkID0gXCJzdHJpa2VUaHJvdWdoQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaGlsaXRlQ29sb3JCdXR0b25DbGlja2VkID0gXCJoaWxpdGVDb2xvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGZvcmVDb2xvckJ1dHRvbkNsaWNrZWQgPSBcImZvcmVDb2xvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIFxyXG4gICAgYnV0dG9uR3JvdXBJdGVtQ2xpY2tlZCA9IFwiYnV0dG9uR3JvdXBJdGVtQ2xpY2tlZFwiLFxyXG4gICAgZm9jdXNPbkZpcnN0UmVxdWVzdGVkID0gXCJmb2N1c09uRmlyc3RSZXF1ZXN0ZWRcIixcclxuICAgIHByZXNzZWRFbnRlck9uVGl0bGUgPSBcInByZXNzZWRFbnRlck9uVGl0bGVcIixcclxuICAgIFxyXG4gICAgdHJhbnNmb3JtQmxvY2tSZXF1ZXN0ZWQgPSBcInRyYW5zZm9ybUJsb2NrUmVxdWVzdGVkXCIsXHJcbiAgICBkdXBsaWNhdGVCbG9ja1JlcXVlc3RlZCA9IFwiZHVwbGljYXRlQmxvY2tSZXF1ZXN0ZWRcIixcclxuXHJcbiAgICAvL1RleHQgZWRpdCBldmVudHNcclxuICAgIGFuY2hvciA9IFwiYW5jaG9yXCIsXHJcbiAgICBib2xkID0gXCJib2xkXCIsXHJcbiAgICBpdGFsaWMgPSBcIml0YWxpY1wiLFxyXG4gICAgdW5kZXJsaW5lID0gXCJ1bmRlcmxpbmVcIixcclxuICAgIGlubGluZUNvZGUgPSBcImlubGluZUNvZGVcIixcclxuICAgIHN0cmlrZVRocm91Z2ggPSBcInN0cmlrZVRocm91Z2hcIixcclxuICAgIGhpbGl0ZUNvbG9yID0gXCJoaWxpdGVDb2xvclwiLFxyXG4gICAgZm9yZUNvbG9yID0gXCJmb3JlQ29sb3JcIixcclxuXHJcblxyXG4gICAgdGV4dEZvcm1hdENoYW5nZWQgPSBcInRleHRGb3JtYXRDaGFuZ2VkXCIsXHJcbiAgICBlbWl0dGVkQ29tbWFuZCA9IFwiZW1pdHRlZENvbW1hbmRcIixcclxuICAgIGJsb2NrVHlwZUNoYW5nZWQgPSBcImJsb2NrVHlwZUNoYW5nZWRcIixcclxuICAgIGJsb2NrRGVsZXRlZCA9IFwiYmxvY2tEZWxldGVkXCIsXHJcbiAgICBibG9ja0Nsb25lZCA9IFwiYmxvY2tDbG9uZWRcIixcclxuICAgIHRhYmxlQ2VsbENoYW5nZWQgPSBcInRhYmxlQ2VsbENoYW5nZWRcIixcclxuXHJcblxyXG5cclxuICAgIC8vQmxvY2sgY29tbWFuZHNcclxuICAgIFxyXG59IiwiZXhwb3J0IGVudW0gWkluZGV4IHtcclxuICAgIExvd0ltcG9ydGFuY2UgPSBcIjEwMFwiLCBcclxuICAgIFNsaWdodGx5SW1wb3J0YW50ID0gXCIyMDBcIixcclxuICAgIE5ldXRyYWwgPSBcIjMwMFwiLFxyXG4gICAgTW9kZXJhdGVseUltcG9ydGFudCA9IFwiNDAwXCIsXHJcbiAgICBWZXJ5SW1wb3J0YW50ID0gXCI1MDBcIiwgXHJcbiAgICBFeHRyZW1lbHlJbXBvcnRhbnQgPSBcIjYwMFwiXHJcbn0iLCJleHBvcnQgZW51bSBDb2xvcnMge1xyXG5cclxuICAgIEhpbGl0ZUNvbG9yUmVkID0gXCIjRkRERURFXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBIaWxpdGVDb2xvckJsdWUgPSBcIiNEOUVERjZcIixcclxuICAgIEhpbGl0ZUNvbG9yWWVsbG93ID0gXCIjRkFGNEQxXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEhpbGl0ZUNvbG9yTm9uZSA9IFwidHJhbnNwYXJlbnRcIixcclxuXHJcblxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbFJlZCA9IFwiI0ZEREVERVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbEdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JDZWxsQmx1ZSA9IFwiI0Q5RURGNlwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbFllbGxvdyA9IFwiI0ZBRjREMVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbEdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEJhY2tncm91bmRDb2xvckNlbGxOb25lID0gXCJ0cmFuc3BhcmVudFwiLFxyXG5cclxuICAgIEZvcmVDb2xvclJlZCA9IFwiI0Q0NEM0N1wiLFxyXG4gICAgRm9yZUNvbG9yR3JlZW4gPSBcIiM0NDgzNjFcIixcclxuICAgIEZvcmVDb2xvckJsdWUgPSBcIiMzMzdFQTlcIixcclxuICAgIEZvcmVDb2xvclllbGxvdyA9IFwiI0NCOTEyRlwiLFxyXG4gICAgRm9yZUNvbG9yR3JleSA9IFwiIzc4Nzc3NFwiLFxyXG4gICAgRm9yZUNvbG9ySW5pdGlhbCA9IFwiaW5pdGlhbFwiLFxyXG5cclxuICAgIEJhY2tncm91bmRDb2xvclJlZCA9IFwiI0ZEREVERVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yR3JlZW4gPSBcIiNEN0Y3RENcIixcclxuICAgIEJhY2tncm91bmRDb2xvckJsdWUgPSBcIiNEOUVERjZcIixcclxuICAgIEJhY2tncm91bmRDb2xvclllbGxvdyA9IFwiI0ZBRjREMVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yR3JleSA9IFwiI0UxRTBFMFwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yTm9uZSA9IFwidHJhbnNwYXJlbnRcIixcclxuXHJcbiAgICBJY29uQWN0aXZlQmx1ZSA9IFwiIzIzODJlMlwiLFxyXG4gICAgSWNvbkRlZmF1bHRCbGFjayA9IFwiIzM3MzUyZmQ5XCIsXHJcbiAgICBSZWQgPSBcInJlZFwiLFxyXG4gICAgVG9tYXRvID0gXCIjRUI1NzU3XCIsXHJcbiAgICBPcmlnaW5hbFRhYmxlQ29sb3IgPSBcIiM4NDg4OGRcIlxyXG5cclxufVxyXG5cclxuZXhwb3J0IGVudW0gQ29sb3JzTmFtZXMge1xyXG4gICAgQ2FsbG91dEJhY2tncm91bmRSZWQgPSBcImNhbGxvdXQtYmFja2dyb3VuZC1yZWRcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JlZW4gPSBcImNhbGxvdXQtYmFja2dyb3VuZC1ncmVlblwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRCbHVlID0gXCJjYWxsb3V0LWJhY2tncm91bmQtYmx1ZVwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRZZWxsb3cgPSBcImNhbGxvdXQtYmFja2dyb3VuZC15ZWxsb3dcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JleSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kTm9uZSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLW5vbmVcIixcclxufSIsImV4cG9ydCBlbnVtIENvbW1hbmRzIHtcclxuICAgIC8qKiBUZXh0IG9wZXJhdGlvbnMgY29tbWFuZHMgKi9cclxuICAgIHRvZ2dsZUJvbGQgPSBcImJvbGRcIixcclxuICAgIHRvZ2dsZUl0YWxpYyA9IFwiaXRhbGljXCIsXHJcbiAgICB0b2dnbGVIaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IgPSBcImNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3JcIixcclxuICAgIHRvZ2dsZUZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcbiAgICB0b2dnbGVJbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICB0b2dnbGVMaW5rID0gXCJjcmVhdGVMaW5rXCIsXHJcbiAgICBsaW5rUmVhZHlUb0luc2VydCA9IFwibGlua1JlYWR5VG9JbnNlcnRcIixcclxuICAgIHRvZ2dsZVVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICB0b2dnbGVTdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICByZW1vdmVGb3JtYXQgPSBcInJlbW92ZUZvcm1hdFwiLFxyXG4gICAgY29weVNlbGVjdGVkID0gXCJjb3B5U2VsZWN0ZWRcIixcclxuICAgIGN1dFNlbGVjdGVkID0gXCJjdXRTZWxlY3RlZFwiLFxyXG4gICAgcGFzdCA9IFwicGFzdFwiLFxyXG5cclxuICAgIC8qKiBCbG9jayBvcGVyYXRpb25zIGNvbW1hbmRzICovXHJcbiAgICB0cmFuc2Zvcm1CbG9jayA9IFwidHJhbnNmb3JtQmxvY2tcIixcclxuICAgIGR1cGxpY2F0ZUJsb2NrID0gXCJkdXBsaWNhdGVCbG9ja1wiLFxyXG4gICAgZGVsZXRlQmxvY2sgPSBcImRlbGV0ZUJsb2NrXCIsXHJcbiAgICBjcmVhdGVEZWZhdWx0QmxvY2sgPSBcImNyZWF0ZURlZmF1bHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbk5leHRCbG9jayA9IFwiZm9jdXNPbk5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPblByZXZpb3VzQmxvY2sgPSBcImZvY3VzT25QcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhQcmV2aW91c0Jsb2NrID0gXCJtZXJnZVdpdGhQcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhOZXh0QmxvY2sgPSBcIm1lcmdlV2l0aE5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbkZpcnN0QmxvY2sgPSBcImZvY3VzT25GaXJzdEJsb2NrXCIsXHJcbiAgICBkZWxldGVCbG9ja0FuZEZvY3VzT25QcmV2aW91cyA9IFwiZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXNcIixcclxuICAgIGRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQgPSBcImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHRcIixcclxuXHJcbiAgICBKdXN0aWZ5TGVmdCA9IFwianVzdGlmeUxlZnRcIixcclxuICAgIEp1c3RpZnlDZW50ZXIgPSBcImp1c3RpZnlDZW50ZXJcIixcclxuICAgIEp1c3RpZnlSaWdodCA9IFwianVzdGlmeVJpZ2h0XCIsXHJcblxyXG4gICAgXHJcbiAgICAvKiogd2lsZGNhcmQgY29tbWFuZCBjb250ZXh0IGJhc2VkKi9cclxuICAgIGluc2VydE5ldyA9IFwiaW5zZXJ0TmV3XCIsXHJcblxyXG4gICAgLyoqIHRhYmxlIGNvbW1hbmRzICovXHJcbiAgICBpbnNlcnRUYWJsZVJvd0Fib3ZlID0gXCJpbnNlcnRUYWJsZVJvd0Fib3ZlXCIsXHJcbiAgICBpbnNlcnRUYWJsZVJvd0JlbG93ID0gXCJpbnNlcnRUYWJsZVJvd0JlbG93XCIsXHJcbiAgICBpbnNlcnRUYWJsZUNvbHVtbkxlZnQgPSBcImluc2VydFRhYmxlQ29sdW1uTGVmdFwiLFxyXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5SaWdodCA9IFwiaW5zZXJ0VGFibGVDb2x1bW5SaWdodFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlUm93RWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlUm93RWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgdG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yID0gXCJ0b2dnbGVDZWxsSGlsaXRlQ29sb3JcIixcclxuICAgIHJlbW92ZUNvbHVtbiA9IFwicmVtb3ZlQ29sdW1uXCIsXHJcbiAgICByZW1vdmVSb3cgPSBcInJlbW92ZVJvd1wiLFxyXG4gICAgY2hhbmdlVGFibGVCb3JkZXJDb2xvciA9IFwiY2hhbmdlVGFibGVCb3JkZXJDb2xvclwiLFxyXG5cclxuXHJcblxyXG4gICAgY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UgPSBcImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlXCJcclxufSIsImV4cG9ydCBlbnVtIEJ1dHRvbklEcyB7XHJcbiAgICBMaW5rID0gXCJsaW5rQnV0dG9uXCIsXHJcbiAgICBCb2xkID0gXCJib2xkQnV0dG9uXCIsXHJcbiAgICBJdGFsaWMgPSBcIml0YWxpY0J1dHRvblwiLFxyXG4gICAgVW5kZXJsaW5lID0gXCJ1bmRlcmxpbmVCdXR0b25cIixcclxuICAgIElubGluZUNvZGUgPSBcImlubGluZUNvZGVCdXR0b25cIixcclxuICAgIFN0cmlrZXRocm91Z2ggPSBcInN0cmlrZXRocm91Z2hCdXR0b25cIixcclxuXHJcbiAgICBBbGlnbkxlZnQgPSBcImFsaWduTGVmdFwiLFxyXG4gICAgQWxpZ25DZW50ZXIgPSBcImFsaWduQ2VudGVyXCIsXHJcbiAgICBBbGlnblJpZ2h0ID0gXCJhbGlnblJpZ2h0XCJcclxufSIsImV4cG9ydCBlbnVtIEtleWJvYXJkS2V5cyB7XHJcbiAgICBTaGlmdCA9IFwiU2hpZnRcIixcclxuICAgIEVudGVyID0gXCJFbnRlclwiLFxyXG4gICAgRXNjYXBlID0gXCJFc2NhcGVcIixcclxuICAgIEJhY2tzcGFjZSA9IFwiQmFja3NwYWNlXCIsXHJcbiAgICBDb250cm9sID0gXCJDb250cm9sXCIsXHJcbiAgICBTcGFjZSA9IFwiIFwiLFxyXG4gICAgRGVsZXRlID0gXCJEZWxldGVcIlxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25JdGVtSURzIHtcclxuICAgIEJhY2tncm91bmRPcHRpb25SZWQgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmVlbiA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiLFxyXG4gICAgQmFja2dyb3VuZE9wdGlvbkJsdWUgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25ZZWxsb3cgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmV5ID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uTm9uZSA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiXHJcbn0iLCJleHBvcnQgZW51bSBET01FbGVtZW50cyB7XHJcbiAgICBURCA9IFwidGRcIixcclxuICAgIFRBQkxFID0gXCJ0YWJsZVwiXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bkxpc3RJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uU2VsZWN0ID0gXCJjb2xvclRleHRPcHRpb25TZWxlY3RcIixcclxuXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bk1lbnVJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uc01lbnUgPSBcImNvbG9yVGV4dE9wdGlvbnNNZW51XCJcclxufSIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21haW4uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgICBzdGF0aWMgZ2VuZXJhdGVVbmlxdWVJZCgpIHtcbiAgICAgICAgY29uc3QgdGltZVBhcnQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgY29uc3QgcmFuZG9tQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoMSk7XG4gICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbUFycmF5KTtcbiAgICAgICAgY29uc3QgcmFuZG9tUGFydCA9IHJhbmRvbUFycmF5WzBdLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgcmV0dXJuIHRpbWVQYXJ0ICsgcmFuZG9tUGFydDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmdiVG9IZXgocmdiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZ2JBcnJheSA9IHJnYi5tYXRjaCgvXFxkKy9nKSEubWFwKE51bWJlcik7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHJnYkFycmF5Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IHgudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNWYWxpZFVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKGh0dHBzPzpcXFxcL1xcXFwvKScgK1xuICAgICAgICAgICAgJyg/IS0pW2EtekEtWlxcXFxkLV17MSw2M30oPzwhLSlcXFxcLicgK1xuICAgICAgICAgICAgJyhbYS16QS1aXFxcXGQtXStcXFxcLikqW2EtekEtWl17Mix9JyArXG4gICAgICAgICAgICAnKFxcXFw6XFxcXGR7MSw1fSk/JyArXG4gICAgICAgICAgICAnKFxcXFwvWy1hLXpBLVpcXFxcZCVfLn4rXSopKicgK1xuICAgICAgICAgICAgJyhcXFxcP1stYS16QS1aXFxcXGQlXy5+Kz0mXSopPycgK1xuICAgICAgICAgICAgJygjWy1hLXpBLVpcXFxcZF9dKik/JCcsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICBcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnLi4vJykgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJyUyZSUyZScpIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCclMDAnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodXJsKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgQ29udGVudFR5cGVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbnRlbnRUeXBlc1wiO1xuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuL0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xuaW1wb3J0IHsgVG9vbGJveE9wdGlvbnMgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0b3Ige1xuICAgIChjb250ZW50OiBzdHJpbmcgfCBudWxsKTogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgY3JlYXRvcnM6IHsgW3R5cGU6IHN0cmluZ106IEVsZW1lbnRDcmVhdG9yIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5U2VydmljZTtcblxuICAgIHN0YXRpYyBFTEVNRU5UX1RZUEVTID0ge1xuICAgICAgICBCTE9DS19QQVJBR1JBUEg6IFwiYmxvY2stcFwiLFxuICAgICAgICBQQVJBR1JBUEg6IFwicFwiLFxuICAgICAgICBDSEVDS0JPWF9JVEVNOiBcImNoZWNrYm94SXRlbVwiLFxuICAgICAgICBMSVNUX0lURU06IFwibGlzdEl0ZW1cIixcbiAgICAgICAgQ09ERTogXCJjb2RlXCIsXG4gICAgICAgIFFVT1RFOiBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgQlVMTEVURURfTElTVDogXCJ1bFwiLFxuICAgICAgICBOVU1CRVJFRF9MSVNUOiBcIm9sXCIsXG4gICAgICAgIENIRUNLX0xJU1Q6IFwiY2hlY2tMaXN0c1wiLFxuICAgICAgICBIRUFERVJfMTogXCJoMVwiLFxuICAgICAgICBIRUFERVJfMjogXCJoMlwiLFxuICAgICAgICBIRUFERVJfMzogXCJoM1wiLFxuICAgICAgICBIRUFERVJfNDogXCJoNFwiLFxuICAgICAgICBIRUFERVJfNTogXCJoNVwiLFxuICAgICAgICBIRUFERVJfNjogXCJoNlwiLFxuICAgICAgICBEUkFHX0hBTkRMRV9CVVRUT046IFwiZHJhZy1oYW5kbGUtYnV0dG9uXCIsXG4gICAgICAgIFRBQkxFOiBcInRhYmxlXCIsXG4gICAgICAgIElNQUdFOiBcImltYWdlXCIsXG4gICAgICAgIFZJREVPOiBcInZpZGVvXCIsXG4gICAgICAgIFNQT1RJRlk6IFwic3BvdGlmeVwiLFxuICAgICAgICBHSVRIVUJfR0lTVDogXCJnaXRodWItZ2lzdFwiLFxuICAgICAgICBHSVRMQUJfU05JUFBFVDogXCJnaXRsYWItc25pcHBldFwiLFxuICAgICAgICBDT0RFUEVOOiBcImNvZGVwZW5cIixcbiAgICAgICAgQ0FMTE9VVDogXCJjYWxsb3V0XCIsXG4gICAgICAgIFNFUEFSQVRPUjogXCJzZXBhcmF0b3JcIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5UQUJMRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnRhYmxlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSW1hZ2UsIEljb25zLkltYWdlMiwgXCJVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2VcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRVcGxvYWQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJpbWFnZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU8sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuWW91VHViZSwgXCJFbWJlZCBhIFlvdVR1YmUgdmlkZW9cIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJ5b3V0dWJlLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIl0pKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TUE9USUZZLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGxhY2Vob2xkZXJDcmVhdG9yKENvbnRlbnRUeXBlcy5JZnJhbWUsIEljb25zLlNwb3RpZnksIFwiRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrXCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWQsIFwic3BvdGlmeS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUSFVCX0dJU1QsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuR2l0SHViLCBcIkVtYmVkIGEgR2l0SHViIEdpc3RcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJnaXRodWItZ2lzdC1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIC8vdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRMQUJfU05JUFBFVCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuU2NyaXB0LCBJY29ucy5HaXRMYWIsIFwiRW1iZWQgYSBzbmlwcGV0XCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWRdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERVBFTiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSWZyYW1lLCBJY29ucy5Db2RlUGVuLCBcIkVtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtb1wiLCBbQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dEVtYmVkLCBcImNvZGVwZW4tZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiXSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jYWxsb3V0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5zZXBhcmF0b3JDcmVhdG9yKCkpO1xuXG5cbiAgICAgICAgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLl9pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEVsZW1lbnRGYWN0b3J5U2VydmljZSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgRWxlbWVudEZhY3RvcnlTZXJ2aWNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIGNyZWF0b3I6IEVsZW1lbnRDcmVhdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3JlYXRvcnNbdHlwZV0gPSBjcmVhdG9yO1xuICAgIH1cblxuICAgIGNyZWF0ZSh0eXBlOiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JzW3R5cGVdO1xuXG4gICAgICAgIGlmICghY3JlYXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gY3JlYXRvciByZWdpc3RlcmVkIGZvciB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3JlYXRvcihjb250ZW50IHx8IFwiXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJsb2NrUGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGgoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGFyYWdyYXBoKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmdDcmVhdG9yKGxldmVsOiBudW1iZXIpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuaGVhZGluZyhsZXZlbCwgY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tib3hJdGVtQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tib3hJdGVtKGNvbnRlbnQgfHwgXCJcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbGlzdEl0ZW1DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcblxuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhZ0hhbmRsZUJ1dHRvbkNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmRyYWdIYW5kbGVCdXR0b24oKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb2RlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJpZ25vcmUtZXZlbnRzXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgY29kZUJsb2NrLmNsYXNzTGlzdC5hZGQoXCJjb2RlLWJsb2NrXCIsIFwiaWdub3JlLXF1aWNrLW1lbnVcIiwgXCJpZ25vcmUtdGV4dC1mbG9hdGluZy10b29sYmFyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgIHByZS5jbGFzc0xpc3QuYWRkKFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MsIFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcblxuICAgICAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgICAgICAgIGNvZGUuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICBjb2RlLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCIvKiBDb2RlIHNuaXBwZXQgKi9cIik7XG4gICAgICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgY29kZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb2RlJywgXCJmb2N1c2FibGVcIiwgXCJobGpzXCIsIFwibGFuZ3VhZ2UtcGxhaW50ZXh0XCIsIFwiZWRpdGFibGVcIik7XG4gICAgICAgICAgICBjb2RlLnNldEF0dHJpYnV0ZShcInNwZWxsQ2hlY2tcIiwgXCJmYWxzZVwiKTtcblxuICAgICAgICAgICAgcHJlLmFwcGVuZENoaWxkKGNvZGUpO1xuXG4gICAgICAgICAgICBjb2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb2RlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaGlnaGxpZ2h0ZWRcIik7XG4gICAgICAgICAgICAgICAgaGxqcy5oaWdobGlnaHRFbGVtZW50KGNvZGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGNvZGVCbG9jay5hcHBlbmRDaGlsZChsYW5ndWFnZVNlbGVjdG9yKTtcbiAgICAgICAgICAgIGNvZGVCbG9jay5hcHBlbmRDaGlsZChwcmUpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvZGVCbG9jayk7XG5cbiAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBxdW90ZUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmxvY2txdW90ZVwiKTtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgYmxvY2txdW90ZS50ZXh0Q29udGVudCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICBibG9ja3F1b3RlLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmdldFJhbmRvbVF1b3RlKCkpO1xuXG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChibG9ja3F1b3RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRFbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSYW5kb21RdW90ZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxdW90YXRpb25zID0gW1xuICAgICAgICAgICAgXCJUYWxrIGlzIGNoZWFwLiBTaG93IG1lIHRoZSBjb2RlLiAtIExpbnVzIFRvcnZhbGRzXCIsXG4gICAgICAgICAgICBcIlByZW1hdHVyZSBvcHRpbWl6YXRpb24gaXMgdGhlIHJvb3Qgb2YgYWxsIGV2aWwuIC0gRG9uYWxkIEtudXRoXCIsXG4gICAgICAgICAgICBcIlRoZSBtb3N0IGRhbmdlcm91cyBwaHJhc2UgaW4gdGhlIGxhbmd1YWdlIGlzLCAnV2UndmUgYWx3YXlzIGRvbmUgaXQgdGhpcyB3YXkuJyAtIEdyYWNlIEhvcHBlclwiLFxuICAgICAgICAgICAgXCJTaW1wbGljaXR5IGlzIHByZXJlcXVpc2l0ZSBmb3IgcmVsaWFiaWxpdHkuIC0gRWRzZ2VyIFcuIERpamtzdHJhXCIsXG4gICAgICAgICAgICBcIkFueSBmb29sIGNhbiB3cml0ZSBjb2RlIHRoYXQgYSBjb21wdXRlciBjYW4gdW5kZXJzdGFuZC4gR29vZCBwcm9ncmFtbWVycyB3cml0ZSBjb2RlIHRoYXQgaHVtYW5zIGNhbiB1bmRlcnN0YW5kLiAtIE1hcnRpbiBGb3dsZXJcIixcbiAgICAgICAgICAgIFwiRmlyc3QsIHNvbHZlIHRoZSBwcm9ibGVtLiBUaGVuLCB3cml0ZSB0aGUgY29kZS4gLSBKb2huIEpvaG5zb25cIixcbiAgICAgICAgICAgIFwiSW4gcHJvZ3JhbW1pbmcsIHRoZSBoYXJkIHBhcnQgaXNuJ3Qgc29sdmluZyBwcm9ibGVtcywgYnV0IGRlY2lkaW5nIHdoYXQgcHJvYmxlbXMgdG8gc29sdmUuIC0gUGF1bCBHcmFoYW1cIixcbiAgICAgICAgICAgIFwiQ29kZSBpcyBsaWtlIGh1bW9yLiBXaGVuIHlvdSBoYXZlIHRvIGV4cGxhaW4gaXQsIGl0J3MgYmFkLiAtIENvcnkgSG91c2VcIixcbiAgICAgICAgICAgIFwiTWFrZSBpdCB3b3JrLCBtYWtlIGl0IHJpZ2h0LCBtYWtlIGl0IGZhc3QuIC0gS2VudCBCZWNrXCIsXG4gICAgICAgICAgICBcIkJlZm9yZSBzb2Z0d2FyZSBjYW4gYmUgcmV1c2FibGUgaXQgZmlyc3QgaGFzIHRvIGJlIHVzYWJsZS4gLSBSYWxwaCBKb2huc29uXCJcbiAgICAgICAgXTtcbiAgICBcbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBxdW90YXRpb25zLmxlbmd0aCk7ICAgIFxuICAgICAgICByZXR1cm4gcXVvdGF0aW9uc1tpbmRleF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgXCJsaXN0XCIsIFwiY2hlY2tib3gtbGlzdFwiKTtcbiAgICAgICAgICAgIHVsLnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5DaGVja0xpc3QpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5jaGVja2JveEl0ZW0oY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgdWwuYXBwZW5kQ2hpbGQoaW5pdGlhbEl0ZW0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdWw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVsbGV0ZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuQnVsbGV0ZWRMaXN0KTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG51bWJlcmVkTGlzdENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzd2l0dGFibGUnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbV8yKGNvbnRlbnQgfHwgXCJcIik7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaW5pdGlhbEl0ZW0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgc3RhdGljIHRhYmxlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcblxuICAgICAgICAgICAgY29uc3QgdGFibGVTaGVsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0YWJsZVNoZWxsLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS1zaGVsbFwiLCBcImlnbm9yZS1xdWljay1tZW51XCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS1jb250cm9sbGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS13cmFwcGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XG4gICAgICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKFwiam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIsIFwic3dpdHRhYmxlXCIsIFwidGFibGVcIiwgVG9vbGJveE9wdGlvbnMuSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuICAgICAgICAgICAgdGFibGUuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLlRhYmxlKTtcblxuICAgICAgICAgICAgdGFibGVTaGVsbC5hcHBlbmRDaGlsZCh0YWJsZUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmFwcGVuZENoaWxkKHRhYmxlV3JhcHBlcik7XG4gICAgICAgICAgICB0YWJsZVdyYXBwZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuXG4gICAgICAgICAgICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSBjb250ZW50ID8gY29udGVudC5zcGxpdCgnLCcpIDogW107XG4gICAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xuICAgICAgICAgICAgcm93RGF0YS5mb3JFYWNoKGNlbGxDb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcbiAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJmb2N1c2FibGVcIiwgXCJlZGl0YWJsZVwiKTtcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBjZWxsQ29udGVudDtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgICAgICAgY29uc3QgYWRkUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFkZFJvdy5jbGFzc0xpc3QuYWRkKFwiYWRkLXRhYmxlLXJvd1wiKTtcbiAgICAgICAgICAgIGFkZFJvdy5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjFyZW1cIiBoZWlnaHQ9XCIxcmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLXBsdXNcIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmNsYXNzTGlzdC5hZGQoXCJhZGQtdGFibGUtY29sdW1uXCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMXJlbVwiIGhlaWdodD1cIjFyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tcGx1c1wiPjwvdXNlPjwvc3ZnPmA7XG5cbiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5hcHBlbmRDaGlsZChhZGRSb3cpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmFwcGVuZENoaWxkKGFkZENvbHVtbik7XG5cbiAgICAgICAgICAgIHJldHVybiB0YWJsZVNoZWxsO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBsYWNlaG9sZGVyQ3JlYXRvcihjb250ZW50VHlwZTogQ29udGVudFR5cGVzLCBpY29uOiBJY29ucywgdGV4dDogc3RyaW5nLCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKENvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnQsIFwic3dpdHRhYmxlXCIsIFwibm8tc2VsZWN0aW9uXCIsIFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgY29udGVudFR5cGUpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZChcImNvbnRlbnQtcGxhY2Vob2xkZXJcIiwgQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2ssIC4uLmNsYXNzZXMpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlckljb24gPSB0aGlzLmNyZWF0ZUljb24oaWNvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0LmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XG4gICAgICAgICAgICBwbGFjZWhvbGRlclRleHQuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJJY29uKTtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyVGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50RWxlbWVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjYWxsb3V0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGpvaGFubmVzQ2FsbG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgam9oYW5uZXNDYWxsb3V0LmNsYXNzTGlzdC5hZGQoXCJpZ25vcmUtcXVpY2stbWVudVwiLCBcImNhbGxvdXRcIiwgXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgVG9vbGJveE9wdGlvbnMuSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzLCBUb29sYm94T3B0aW9ucy5Db2xvclRvb2xDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuXG4gICAgICAgICAgICBjb25zdCBjYWxsb3V0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjYWxsb3V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIiwgXCJjYWxsb3V0LXdyYXBwZXJcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlR5cGUgc29tZXRoaW5nLi4uXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC10ZXh0XCIsIFwiZWRpdGFibGVcIiwgXCJmb2N1c2FibGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxvdXRXcmFwcGVyLmFwcGVuZENoaWxkKHRleHRBcmVhKTtcbiAgICAgICAgICAgIGpvaGFubmVzQ2FsbG91dC5hcHBlbmRDaGlsZChjYWxsb3V0V3JhcHBlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBqb2hhbm5lc0NhbGxvdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2VwYXJhdG9yQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcblxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJzZXBhcmF0b3Itd3JhcHBlclwiKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKTtcbiAgICAgICAgICAgIHNlcGFyYXRvci5jbGFzc0xpc3QuYWRkKCdzZXBhcmF0b3InKTtcbiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgcC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIHAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgXCJmb2N1c2FibGVcIiwgXCJrZXktdHJpZ2dlclwiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdXcml0ZSBzb21ldGhpbmcgb3IgdHlwZSAvIChzbGFzaCkgdG8gY2hvb3NlIGEgYmxvY2suLi4nKTtcblxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoZWFkaW5nKGxldmVsOiBudW1iZXIsIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgaCR7bGV2ZWx9YCk7XG5cbiAgICAgICAgaC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIGguY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIGguc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIGBoJHtsZXZlbH1gKTtcbiAgICAgICAgaC5jbGFzc0xpc3QuYWRkKFwiam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIsIFwic3dpdHRhYmxlXCIsIFwiZm9jdXNhYmxlXCIsIFwiZm9jdXNcIiwgXCJrZXktdHJpZ2dlclwiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICBoLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGBIZWFkaW5nICR7bGV2ZWx9YCk7XG5cbiAgICAgICAgcmV0dXJuIGg7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrYm94SXRlbShjb250ZW50OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29uc3QgaWQgPSBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCk7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkZWxldGFibGVcIiwgXCJuby1saXN0LXN0eWxlXCIsIFwibGlzdC1pdGVtXCIsIFwibGlzdC1pdGVtLWNoZWNrYWJsZVwiKTtcblxuICAgICAgICAvLyBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdrZXktdHJpZ2dlcicpO1xuXG4gICAgICAgIGxldCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIGNoZWNrYm94LmlkID0gaWQ7XG4gICAgICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgndHlwZScsICdjaGVja2JveCcpO1xuICAgICAgICAvLyBjaGVja2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcblxuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnVG8tZG8nKTtcbiAgICAgICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJmb3JcIiwgaWQpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiLCBcImVkaXRhYmxlXCIsIFwiZm9jdXNcIik7XG5cbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgbGlzdEl0ZW0odGV4dDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuXG4gICAgLy8gICAgIGxldCBpbml0aWFsSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2RlbGV0YWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdlZGl0YWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdrZXktdHJpZ2dlcicpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0nKTtcblxuICAgIC8vICAgICBpbml0aWFsSXRlbS5pbm5lclRleHQgPSB0ZXh0O1xuXG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgLy8gICAgIHJldHVybiBpbml0aWFsSXRlbTtcblxuICAgIC8vIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtXzIoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGluaXRpYWxJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiLCBcImVkaXRhYmxlXCIsIFwiZm9jdXNcIiwgXCJrZXktdHJpZ2dlclwiKTtcbiAgICAgICAgZGl2LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0l0ZW0nKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5hcHBlbmRDaGlsZChkaXYpO1xuXG5cbiAgICAgICAgZGl2LmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICByZXR1cm4gaW5pdGlhbEl0ZW07XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgYmxvY2tQYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcblxuICAgICAgICBsZXQgbmV3RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5ld0Rpdi5pZCA9IGBiLSR7VXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpfWA7XG4gICAgICAgIGxldCBuZXdFbGVtZW50ID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaChjb250ZW50KTtcblxuICAgICAgICAvLyBsZXQgZHJhZ0hhbmRsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuaW5uZXJIVE1MID0gJzxzdmcgd2lkdGg9XCIxLjM3NXJlbVwiIGhlaWdodD1cIjEuMzc1cmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgaHJlZj1cIiNpY29uLW1hdGVyaWFsLWRyYWdcIj48L3VzZT48L3N2Zz4nO1xuXG4gICAgICAgIC8vIG5ld0Rpdi5hcHBlbmRDaGlsZChuZXdCdXR0b24pO1xuICAgICAgICBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG5cbiAgICAgICAgbmV3RGl2LmNsYXNzTGlzdC5hZGQoJ2Jsb2NrJyk7XG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuY2xhc3NMaXN0LmFkZCgnZHJhZy1oYW5kbGVyJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmNsYXNzTGlzdC5hZGQoJ2J1dHRvbi1yZXNldCcpO1xuICAgICAgICAvLyBkcmFnSGFuZGxlci5kcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBuZXdEaXY7XG4gICAgfVxuXG4gICAgc3RhdGljIGRyYWdIYW5kbGVCdXR0b24oKSB7XG5cbiAgICAgICAgY29uc3QgZHJhZ0hhbmRsZXJXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZHJhZ0hhbmRsZXJXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJkcmFnLWhhbmRsZXItd3JhcHBlclwiLCBDb21tb25DbGFzc2VzLkVkaXRvck9ubHkpO1xuXG4gICAgICAgIGxldCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChDb21tb25DbGFzc2VzLkVkaXRvck9ubHksIFwiZHJhZy1oYW5kbGVyXCIsIFwiYnV0dG9uLXJlc2V0XCIpO1xuICAgICAgICBidXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcblxuXG4gICAgICAgIGRyYWdIYW5kbGVyV3JhcHBlci5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgICAgIHJldHVybiBkcmFnSGFuZGxlcldyYXBwZXI7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUljb24oaWNvbklkOiBzdHJpbmcpIHtcblxuICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpY29uLXdyYXBwZXJcIik7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gYDxzdmcgd2lkdGg9XCIxLjM3NXJlbVwiIGhlaWdodD1cIjEuMzc1cmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgaHJlZj1cIiMke2ljb25JZH1cIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxufSIsImltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVUlDb21wb25lbnQ8VCBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+IHtcclxuXHJcbiAgICBpZD86IHN0cmluZztcclxuICAgIHByaXZhdGUgX2NhbkhpZGU6IGJvb2xlYW47XHJcblxyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICBodG1sRWxlbWVudDogVDtcclxuICAgIHBhcmVudD86IEJhc2VVSUNvbXBvbmVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG5cclxuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQgPSB0aGlzLmluaXQoKSBhcyBUO1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJbml0aWFsaXplcyBhbmQgcmV0dXJucyBhbiBIVE1MRWxlbWVudCB1c2luZyB0aGUgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBBUEkuXHJcbiAgICAqIFRoaXMgYWJzdHJhY3QgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mXHJcbiAgICAqIEhUTUxFbGVtZW50IHRvIGJlIGNyZWF0ZWQgYW5kIHBvc3NpYmx5IGNvbmZpZ3VyZSBpdHMgcHJvcGVydGllcyBvciBzdHlsZXMuXHJcbiAgICAqIERlcGVuZGVuY2llcyBuZWVkZWQgYnkgdGhlIHN1YmNsYXNzZXMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBjb25zdHJ1Y3RvciBhbmRcclxuICAgICogYXJlIHR5cGljYWxseSBtYWRlIGF2YWlsYWJsZSB2aWEgdGhpcy5wcm9wcyBmb3IgdXNlIHdpdGhpbiB0aGlzIG1ldGhvZC5cclxuICAgICpcclxuICAgICogQGFic3RyYWN0XHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEV4YW1wbGUgc3ViY2xhc3MgdGhhdCB1c2VzIGEgZGVwZW5kZW5jeSBwYXNzZWQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IuXHJcbiAgICAqIGNsYXNzIFRvb2xiYXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG4gICAgKiAgICAgY29uc3RydWN0b3IoZGVwZW5kZW5jeSkge1xyXG4gICAgKiAgICAgICAgIHN1cGVyKHtkZXBlbmRlbmN5OiBkZXBlbmRlbmN5fSk7XHJcbiAgICAqICAgICAgICAgdGhpcy5kZXBlbmRlbmN5ID0gZGVwZW5kZW5jeTtcclxuICAgICogICAgIH1cclxuICAgICpcclxuICAgICogICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgKiAgICAgICAgIGNvbnN0IHRvb2xiYXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAqICAgICAgICAgdG9vbGJhckVsZW1lbnQuY2xhc3NOYW1lID0gJ3Rvb2xiYXInO1xyXG4gICAgKiAgICAgICAgIC8vIFVzaW5nIHRoZSBkZXBlbmRlbmN5XHJcbiAgICAqICAgICAgICAgdG9vbGJhckVsZW1lbnQuYXR0cmlidXRlKFwiY3VzdG9tRGVwZW5kZW5jeUJhc2VkXCIsIHRoaXMuZGVwZW5kZW5jeS5kYXRhKTtcclxuICAgICogICBcclxuICAgICogICAgICAgICByZXR1cm4gdG9vbGJhckVsZW1lbnQ7XHJcbiAgICAqICAgICB9XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgbmV3bHkgY3JlYXRlZCBhbmQgY29uZmlndXJlZCBIVE1MRWxlbWVudC5cclxuICAgICovXHJcbiAgICBhYnN0cmFjdCBpbml0KCk6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SWQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmlkID0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ3NzQ2xhc3MoLi4udG9rZW5zOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LnB1c2goLi4udG9rZW5zKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4udG9rZW5zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwZW5kcyB0aGlzIGNvbXBvbmVudCdzIEhUTUwgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBjb21wb25lbnQncyBIVE1MIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgbWV0aG9kIGVzdGFibGlzaGVzIGEgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBpbiB0aGUgRE9NIGJ5IGFwcGVuZGluZyB0aGlzIGluc3RhbmNlJ3NcclxuICAgICogZWxlbWVudCBhcyBhIGNoaWxkIG9mIHRoZSBnaXZlbiBwYXJlbnQncyBlbGVtZW50LiBJdCBhbHNvIHVwZGF0ZXMgdGhlIHBhcmVudCBwcm9wZXJ0eSBvZiB0aGlzXHJcbiAgICAqIGluc3RhbmNlIHRvIHJlZmVyIHRvIHRoZSBwcm92aWRlZCBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0Jhc2VVSUNvbXBvbmVudH0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9uZW50IHRvIHdoaWNoIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudCB3aWxsIGJlIGFwcGVuZGVkLlxyXG4gICAgKiBUaGlzIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBCYXNlVUlDb21wb25lbnQgb3IgYW55IG9mIGl0cyBzdWJjbGFzc2VzLCBlbnN1cmluZyB0aGF0IGl0IGhhcyBhbiBodG1sRWxlbWVudCBwcm9wZXJ0eS5cclxuICAgICovXHJcbiAgICBhcHBlbmRUbyhwYXJlbnQ6IEJhc2VVSUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgIHBhcmVudC5odG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuaHRtbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyB8fCBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nIHx8ICFkb2N1bWVudC5jb250YWlucyhlbGVtZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0eWxlLmRpc3BsYXkgPT09ICdub25lJyB8fCBzdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3coKSB7XHJcbiAgICAgICAgLy8gdGhpcy5fY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcclxuXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIH0sIDEwMCk7XHJcblxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgLy8gaWYgKCF0aGlzLl9jYW5IaWRlKSB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zb2xlLndhcm4oXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICAvLyAgICAgLy8gcmV0dXJuO1xyXG4gICAgICAgIC8vICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBsb2NrSGlkZSgpIHtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2NrSGlkZSgpIHtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuSGlkZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FuSGlkZSAmJiB0aGlzLmlzVmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FuSGlkZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcigpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJpbmhlcml0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbigpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwbGF5ID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmlzaWJpbGl0eSA9IHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKG9yaWdpbmFsRGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5odG1sRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5ID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5O1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBvcmlnaW5hbFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJpZ2h0RWRnZSA9IGVsZW1lbnRSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudFJpZ2h0RWRnZSA+IHNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnRSZWN0LmxlZnQgPCAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZVZpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVsZXZhbnRDb250YWluZXIgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoJ3NlbGVjdCwgdWwnKTtcclxuXHJcbiAgICAgICAgaWYgKHJlbGV2YW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ3N0YXJ0JyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0F0dGVtcHRlZCB0byBtYWtlIGEgbm9uLXJlbGV2YW50IGl0ZW0gdmlzaWJsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDbG9zZUVsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5pZCA9PSBkZXRhaWxzLnRhcmdldElkISkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmIChkZXRhaWxzLnRhcmdldElkID09IHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Jhc2ljIFVJIGV2ZW50c1xyXG4gICAgYXR0YWNoVUlFdmVudCgpIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwgdGhpcy5oYW5kbGVDbG9zZUVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLlNob3dFbGVtZW50LCB0aGlzLmhhbmRsZVNob3dFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRGVwZW5kZW5jeUNvbnRhaW5lciA9IG5ldyBEZXBlbmRlbmN5Q29udGFpbmVyKCk7XHJcbiAgICBwcml2YXRlIGRlcGVuZGVuY2llczogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9ID0ge307XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICAgICAgcmV0dXJuIERlcGVuZGVuY3lDb250YWluZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llc1trZXldID0gY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc29sdmU8VD4oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5ICR7a2V5fSBub3QgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc1trZXldKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERPTVV0aWxzIHtcclxuXHJcblxyXG4gICAgc3RhdGljIGlzU2VsZWN0aW9uSW5UYWJsZUNlbGwoKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbj8ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgbm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xyXG4gICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChub2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUgPT09ICdURCcgfHwgKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSA9PT0gJ1RIJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gVGhlIHNlbGVjdGlvbiBzdGFydHMgaW5zaWRlIGEgdGFibGUgY2VsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7ICAvLyBNb3ZlIHVwIGluIHRoZSBET00gdHJlZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBTZWxlY3Rpb24gaXMgbm90IGluc2lkZSBhIHRhYmxlIGNlbGxcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gd2FzIGFkYXB0ZWQgZnJvbSBhIFN0YWNrT3ZlcmZsb3cgYW5zd2VyLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCB0byBjaGVjay5cclxuICAgICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIGJvb2xlYW4gcHJvcGVydGllczogYGF0U3RhcnRgIGFuZCBgYXRFbmRgLlxyXG4gICAgKlxyXG4gICAgKiBAc2VlIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDUxNDY4L2NvbnRlbnRlZGl0YWJsZS1kaXYtaG93LWNhbi1pLWRldGVybWluZS1pZi10aGUtY3Vyc29yLWlzLWF0LXRoZS1zdGFydC1vci1lbmQtbyNhbnN3ZXItNzQ3ODQyMHxTdGFja092ZXJmbG93IFJlc3BvbnNlfVxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBSZXR1cm5zIHsgYXRTdGFydDogdHJ1ZSwgYXRFbmQ6IGZhbHNlIH0gaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQsIGJ1dCBub3QgYXQgdGhlIGVuZC5cclxuICAgICogY29uc3QgcmVzdWx0ID0gZ2V0U2VsZWN0aW9uVGV4dEluZm8oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRhYmxlJykpO1xyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRTZWxlY3Rpb25UZXh0SW5mbyhlbDogSFRNTEVsZW1lbnQpOiB7IGF0U3RhcnQ6IGJvb2xlYW47IGF0RW5kOiBib29sZWFuIH0ge1xyXG5cclxuICAgICAgICBsZXQgYXRTdGFydCA9IGZhbHNlLCBhdEVuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZWwudGV4dENvbnRlbnQgPT0gXCJcIikge1xyXG4gICAgICAgICAgICBhdFN0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXRFbmQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHsgYXRTdGFydCwgYXRFbmQgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNlbFJhbmdlOiBSYW5nZSwgdGVzdFJhbmdlOiBSYW5nZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHNlbFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIHRlc3RSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNldEVuZChzZWxSYW5nZS5zdGFydENvbnRhaW5lciwgc2VsUmFuZ2Uuc3RhcnRPZmZzZXQpO1xyXG4gICAgICAgICAgICBhdFN0YXJ0ID0gdGVzdFJhbmdlLnRvU3RyaW5nKCkgPT09IFwiXCI7XHJcblxyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNldFN0YXJ0KHNlbFJhbmdlLmVuZENvbnRhaW5lciwgc2VsUmFuZ2UuZW5kT2Zmc2V0KTtcclxuICAgICAgICAgICAgYXRFbmQgPSB0ZXN0UmFuZ2UudG9TdHJpbmcoKSA9PT0gXCJcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGF0U3RhcnQsIGF0RW5kIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEluc2VydHMgYSBuZXcgbm9kZSBpbnRvIHRoZSBET00gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBzcGVjaWZpZWQgcmVmZXJlbmNlIG5vZGUuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZHluYW1pY2FsbHkgbW9kaWZ5aW5nIHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgYnkgYWRkaW5nIG5ldyBjb250ZW50XHJcbiAgICAqIG9yIGNvbXBvbmVudHMgaW4gcmVsYXRpb24gdG8gZXhpc3RpbmcgZWxlbWVudHMuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIFRoZSBuZXcgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00uXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gcmVmZXJlbmNlTm9kZSAtIFRoZSBub2RlIGFmdGVyIHdoaWNoIHRoZSBuZXcgbm9kZSBzaG91bGQgYmUgaW5zZXJ0ZWQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBwZXJmb3JtcyBhIERPTSBtYW5pcHVsYXRpb24gb3BlcmF0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGluc2VydCBhIG5ldyBwYXJhZ3JhcGggYWZ0ZXIgYW4gZXhpc3RpbmcgZGl2IGVsZW1lbnQ6XHJcbiAgICAqIGNvbnN0IG5ld1BhcmFncmFwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICogbmV3UGFyYWdyYXBoLnRleHRDb250ZW50ID0gJ0hlbGxvLCB3b3JsZCEnO1xyXG4gICAgKiBjb25zdCByZWZlcmVuY2VEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlEaXYnKTtcclxuICAgICogaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCByZWZlcmVuY2VEaXYpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHJlZmVyZW5jZU5vZGUgaGFzIGEgcGFyZW50IG5vZGUuIElmIGEgcGFyZW50IG5vZGUgZXhpc3RzLCBpdCB1c2VzXHJcbiAgICAqIGBwYXJlbnROb2RlLmluc2VydEJlZm9yZSgpYCB0byBpbnNlcnQgdGhlIG5ld05vZGUgaW50byB0aGUgRE9NIHJpZ2h0IGFmdGVyIHRoZSByZWZlcmVuY2VOb2RlLlxyXG4gICAgKiBUaGlzIGlzIGFjaGlldmVkIGJ5IHNwZWNpZnlpbmcgYHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmdgIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGBpbnNlcnRCZWZvcmUoKWAsXHJcbiAgICAqIHdoaWNoIGVmZmVjdGl2ZWx5IHBsYWNlcyB0aGUgbmV3Tm9kZSBkaXJlY3RseSBhZnRlciB0aGUgcmVmZXJlbmNlTm9kZSBpbiB0aGUgZG9jdW1lbnQncyBzdHJ1Y3R1cmUuXHJcbiAgICAqIElmIHRoZSByZWZlcmVuY2VOb2RlIGhhcyBubyBwYXJlbnQsIHRoZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIGFzIGluc2VydGlvbiBpcyBub3QgcG9zc2libGUuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGluc2VydEFmdGVyKG5ld05vZGU6IE5vZGUsIHJlZmVyZW5jZU5vZGU6IE5vZGUpIHtcclxuICAgICAgICBpZiAocmVmZXJlbmNlTm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDaGVja3MgaWYgYSBnaXZlbiBET00gTm9kZSBoYXMgYW55IHZpc2libGUgdGV4dCBjb250ZW50LiBUaGUgZnVuY3Rpb24gY29uc2lkZXJzIHRleHQgY29udGVudCBkaXJlY3RseSB3aXRoaW4gdGhlIG5vZGVcclxuICAgICogYXMgd2VsbCBhcyByZWN1cnNpdmVseSBjaGVja2luZyBhbGwgY2hpbGQgbm9kZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IG9yIGFueSBwYXJ0IG9mIGEgc3VidHJlZVxyXG4gICAgKiBoYXMgdGV4dHVhbCBzaWduaWZpY2FuY2UsIHdoaWNoIG1pZ2h0IGFmZmVjdCBkaXNwbGF5IGxvZ2ljLCB2YWxpZGF0aW9uLCBvciBwcm9jZXNzaW5nLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgdG8gY2hlY2sgZm9yIHRleHQgY29udGVudC5cclxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG5vZGUgaXRzZWxmIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4gaGFzIG5vbi1lbXB0eSB0ZXh0IGNvbnRlbnQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gU3VwcG9zZSB5b3Ugd2FudCB0byBjaGVjayBpZiBhIHBhcmFncmFwaCBlbGVtZW50IGlzIGVtcHR5IG9yIG5vdDpcclxuICAgICogY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVQYXJhZ3JhcGgnKTtcclxuICAgICogY29uc3QgaGFzQ29udGVudCA9IGhhc1RleHRDb250ZW50KHBhcmFncmFwaCk7XHJcbiAgICAqIGNvbnNvbGUubG9nKCdEb2VzIHRoZSBwYXJhZ3JhcGggaGF2ZSBjb250ZW50PycsIGhhc0NvbnRlbnQpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgdGhlIHRleHQgY29udGVudCBvZiB0aGUgbm9kZSBpdHNlbGYuIElmIHRoZSBub2RlJ3MgdGV4dENvbnRlbnQsIHdoZW4gdHJpbW1lZCwgaXMgbm90IGFuIGVtcHR5IHN0cmluZyxcclxuICAgICogdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgdmlzaWJsZSB0ZXh0LiBJZiB0aGUgaW5pdGlhbCBjaGVjayBmYWlscywgdGhlIGZ1bmN0aW9uIHRoZW4gcmVjdXJzaXZlbHlcclxuICAgICogY2hlY2tzIGVhY2ggY2hpbGQgbm9kZSB0byBkZXRlcm1pbmUgaWYgYW55IGNoaWxkIGNvbnRhaW5zIHZpc2libGUgdGV4dC4gVGhpcyByZWN1cnNpb24gZW5zdXJlcyB0aGF0IGV2ZW4gZGVlcGx5IG5lc3RlZCB0ZXh0IG5vZGVzXHJcbiAgICAqIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgdmlzaWJsZSBjb250ZW50IGFyZSBhY2NvdW50ZWQgZm9yLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBmaW5kaW5nIHZpc2libGUgdGV4dCxcclxuICAgICogb3B0aW1pemluZyB0aGUgc2VhcmNoIHByb2Nlc3Mgd2l0aGluIHBvdGVudGlhbGx5IGxhcmdlIERPTSBzdHJ1Y3R1cmVzLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBoYXNUZXh0Q29udGVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycgfHxcclxuICAgICAgICAgICAgKG5vZGUuaGFzQ2hpbGROb2RlcygpICYmIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKS5zb21lKGNoaWxkTm9kZSA9PiB0aGlzLmhhc1RleHRDb250ZW50KGNoaWxkTm9kZSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2xvbmVzIGEgc3BlY2lmaWVkIEhUTUxFbGVtZW50IGFuZCBpbnNlcnRzIHRoZSBjbG9uZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3JpZ2luYWwgZWxlbWVudCBpbiB0aGUgRE9NLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgZHVwbGljYXRpbmcgaW50ZXJhY3RpdmUgY29tcG9uZW50cyBvciBjb250ZW50IGJsb2NrcyB3aXRoaW4gYSBkeW5hbWljIGludGVyZmFjZS5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBIVE1MRWxlbWVudCB0byBiZSBjbG9uZWQgYW5kIHJlaW5zZXJ0ZWQuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9uZWQgSFRNTEVsZW1lbnQgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBvciBudWxsIGlmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBwYXJlbnQuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtZSB5b3UgaGF2ZSBhIGxpc3QgaXRlbSB0aGF0IHlvdSB3YW50IHRvIGR1cGxpY2F0ZTpcclxuICAgICogY29uc3QgbGlzdEl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaS5teS1pdGVtJyk7XHJcbiAgICAqIGNvbnN0IG5ld0xpc3RJdGVtID0gY2xvbmVBbmRJbnNlcnRBZnRlcihsaXN0SXRlbSk7XHJcbiAgICAqIGlmIChuZXdMaXN0SXRlbSkge1xyXG4gICAgKiAgICAgY29uc29sZS5sb2coJ0l0ZW0gd2FzIGNsb25lZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gY2xvbmUgdGhlIHByb3ZpZGVkIGBlbGVtZW50YCB1c2luZyBgY2xvbmVOb2RlKHRydWUpYCwgd2hpY2ggZW5zdXJlcyB0aGF0IGFsbCBjaGlsZCBub2RlcyBhbmQgYXR0cmlidXRlcyBhcmUgY29waWVkLlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gdGhlbiBjaGVja3MgaWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaGFzIGEgcGFyZW50IG5vZGUuIElmIGl0IGRvZXMgbm90LCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxsIHNpbmNlIGluc2VydGlvbiBjYW5ub3QgcHJvY2VlZC5cclxuICAgICogSWYgYSBwYXJlbnQgbm9kZSBleGlzdHMsIHRoZSBjbG9uZWQgZWxlbWVudCBpcyBpbnNlcnRlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3JpZ2luYWwgZWxlbWVudCB1c2luZyBgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKWAuXHJcbiAgICAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byBlZmZlY3RpdmVseSBkdXBsaWNhdGUgYW5kIHBsYWNlIHRoZSBuZXcgZWxlbWVudCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiB3aXRoaW4gdGhlIERPTSB0cmVlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBjbG9uZUFuZEluc2VydEFmdGVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRFbGVtZW50ID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNsb25lZEVsZW1lbnQsIGVsZW1lbnQubmV4dFNpYmxpbmcpO1xyXG5cclxuICAgICAgICBpZiAoY2xvbmVkRWxlbWVudC5pZCkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsb25lZEVsZW1lbnQuaWQubWF0Y2goL14oLis/KS0vKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XHJcbiAgICAgICAgICAgICAgICBjbG9uZWRFbGVtZW50LmlkID0gcHJlZml4ICsgJy0nICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2xvbmVkRWxlbWVudC5pZCA9IFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNsb25lZEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgKiBTZWFyY2hlcyBmb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgZWxlbWVudCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgQ1NTIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB1cCBmcm9tIHRoZSBhY3RpdmUgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUgYW5kIGNoZWNrcyBlYWNoIGFuY2VzdG9yIHRvIHNlZSBpZiBpdCBtYXRjaGVzXHJcbiAgICAqIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZS5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIFRoZSBjbGFzcyBuYW1lIHRvIG1hdGNoIGFnYWluc3QgYW5jZXN0b3IgZWxlbWVudHMuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFN1cHBvc2UgeW91IHdhbnQgdG8gZmluZCB0aGUgY2xvc2VzdCBmb3JtIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgaW5wdXQgZmllbGQ6XHJcbiAgICAqIGNvbnN0IGNsb3Nlc3RGb3JtID0gZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoJ215LWZvcm0tY2xhc3MnKTtcclxuICAgICogY29uc29sZS5sb2coY2xvc2VzdEZvcm0pO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBiZWdpbnMgYnkgb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnQgdXNpbmcgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgLlxyXG4gICAgKiBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZWxlbWVudCwgb3IgdGhlIGFjdGl2ZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW55IGFuY2VzdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyxcclxuICAgICogdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbC4gT3RoZXJ3aXNlLCBpdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBhbmNlc3RvcnMgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IHVudGlsIGl0IGZpbmRzXHJcbiAgICAqIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIG9yIHJlYWNoZXMgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50LiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29tcGxleFxyXG4gICAgKiBmb3JtcyBvciBpbnRlcmFjdGl2ZSBhcmVhcyB3aGVyZSBjb250ZXh0LWJhc2VkIGFjdGlvbnMgZGVwZW5kIG9uIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBET00gc3RydWN0dXJlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudDogTm9kZSB8IG51bGwgPSBhY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmXHJcbiAgICAgICAgICAgICAgICAoY3VycmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEZpbmRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUgZnJvbSB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbi5cclxuICAgICogSWYgdGhlIHNlbGVjdGlvbiBpcyBpbiBhIHRleHQgbm9kZSwgaXQgY2xpbWJzIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBjbG9zZXN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgY2xhc3MuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBjb250ZXh0LXNlbnNpdGl2ZSBvcGVyYXRpb25zIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiBkb2N1bWVudCBlZGl0aW5nIG9yIHByb2Nlc3NpbmcgZW52aXJvbm1lbnRzLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gVGhlIGNsYXNzIG5hbWUgdG8gc2VhcmNoIGZvciBpbiBhbmNlc3RvciBlbGVtZW50cy5cclxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gVGhlIGNsb3Nlc3QgYW5jZXN0b3IgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG9yIG51bGwgaWYgbm8gc3VjaCBlbGVtZW50IGlzIGZvdW5kLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2xvc2VzdEFuY2VzdG9yT2ZTZWxlY3Rpb25CeUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBzZWxlY3Rpb24gYW5kIGlmIGl0IGhhcyBhdCBsZWFzdCBvbmUgcmFuZ2VcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgc3RhcnRpbmcgbm9kZSBvZiB0aGUgc2VsZWN0aW9uXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGlzIGEgdGV4dCBub2RlLCBzdGFydCBmcm9tIGl0cyBwYXJlbnQgZWxlbWVudFxyXG4gICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3NcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoY3VycmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFJlYXJyYW5nZSBjb250ZW50IGFyb3VuZCB0aGUgc3BsaXQgcG9pbnQgYmFzZWQgb24gdGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIHNwbGl0dGluZyB0aGUgY29udGVudCBhdCB0aGUgY3Vyc29yLFxyXG4gICAgKiB0aGVuIHJlYXJyYW5naW5nIHRoZSBjb250ZW50IGJ5IGRlbGV0aW5nIGFwcHJvcHJpYXRlIHBhcnRzIGluIHRoZSBvcmlnaW5hbFxyXG4gICAgKiBhbmQgY2xvbmVkIG5vZGVzLiBJdCBlbnN1cmVzIHRoYXQgYWZ0ZXIgdGhlIHNwbGl0LCB0aGUgb3JpZ2luYWwgbm9kZSBjb250YWluc1xyXG4gICAgKiBvbmx5IHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCB0aGUgY2xvbmVkIG5vZGUgY29udGFpbnMgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGN1cnNvci5cclxuICAgICogSW1wb3J0YW50bHksIHRoaXMgZnVuY3Rpb24gbWFpbnRhaW5zIHRoZSB2YWxpZGl0eSBvZiB0aGUgRE9NIHN0cnVjdHVyZSBhZnRlciBtb2RpZmljYXRpb25zLFxyXG4gICAgKiBwcmV2ZW50aW5nIGFueSBkaXNydXB0aW9ucyBpbiBkb2N1bWVudCBzdHJ1Y3R1cmUgdGhhdCBjb3VsZCBhZmZlY3QgcmVuZGVyaW5nIG9yIGZ1cnRoZXIgc2NyaXB0aW5nLlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtOb2RlfSBjdXJyZW50Tm9kZSAtIFRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQgYmVmb3JlIHRoZSBzcGxpdC5cclxuICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gVGhlIGNsb25lZCBub2RlIHRoYXQgd2lsbCBjb250YWluIHRoZSBjb250ZW50IGFmdGVyIHRoZSBzcGxpdC5cclxuICAgICogQHJldHVybnMge3ZvaWR9IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWU7IGl0IG1vZGlmaWVzIERPTSBub2RlcyBkaXJlY3RseS5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtaW5nIGN1cnJlbnROb2RlIGlzIGFuIGVsZW1lbnQgd2l0aCB0ZXh0IGNvbnRlbnQgYW5kIGEgY3Vyc29yIHBvc2l0aW9uIHdpdGhpbiBpdCxcclxuICAgICogLy8gYW5kIG5ld05vZGUgaXMgaXRzIGNsb25lZCBjb3VudGVycGFydDpcclxuICAgICogcmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY3VycmVudE5vZGUsIG5ld05vZGUpO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYSBwYXJ0IG9mIGFuIGVkaXRpbmcgc3lzdGVtIHdoZXJlIGNvbnRlbnQgbmVlZHMgdG8gYmUgZHluYW1pY2FsbHlcclxuICAgICogc3BsaXQgYW5kIHJlYXJyYW5nZWQuIEl0IHVzZXMgYSBjdXJzb3ItYmFzZWQgYXBwcm9hY2ggdG8gZGV0ZXJtaW5lIHRoZSBzcGxpdCBwb2ludCxcclxuICAgICogcmVtb3ZlcyBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIGFuZCB0aGUgY2xvbmUgYmFzZWQgb24gdGhlIGN1cnNvcidzIHBvc2l0aW9uLFxyXG4gICAgKiBhbmQgc2V0cyB1cCB0aGUgbm9kZXMgZm9yIHN1YnNlcXVlbnQgdXNlciBpbnRlcmFjdGlvbnMuIFRoZSBET00gcmVtYWlucyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQsXHJcbiAgICAqIGVuc3VyaW5nIHRoYXQgc3Vic2VxdWVudCBvcGVyYXRpb25zLCBzdWNoIGFzIGZ1cnRoZXIgc3BsaXRzIG9yIHN0eWxlIGNoYW5nZXMsIGNhbiBiZSBwZXJmb3JtZWRcclxuICAgICogd2l0aG91dCBhZGRpdGlvbmFsIGNoZWNrcyBvciBjb3JyZWN0aW9ucy5cclxuICAgICovXHJcbiAgICBzdGF0aWMgcmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY3VycmVudE5vZGU6IE5vZGUsIG5ld05vZGU6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IERPTVV0aWxzLmdldEN1cnNvclBvc2l0aW9uKGN1cnJlbnROb2RlIGFzIE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlczEgPSB0aGlzLnNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKGN1cnJlbnROb2RlIGFzIE5vZGUpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIG9yaWdpbmFsXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZShyYW5nZXMxWzFdKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uZGVsZXRlRnJvbURvY3VtZW50KCk7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgY2xvbmVcclxuICAgICAgICBpZiAobmV3Tm9kZSAmJiBjdXJzb3JQb3NpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNldEN1cnNvclBvc2l0aW9uKG5ld05vZGUsIGN1cnNvclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlczIgPSB0aGlzLnNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKG5ld05vZGUgYXMgTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZShyYW5nZXMyWzBdKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2FsY3VsYXRlcyB0aGUgY3Vyc29yIHBvc2l0aW9uIHdpdGhpbiB0aGUgc3BlY2lmaWVkIG5vZGUuIFRoZSBwb3NpdGlvbiBpcyBkZXRlcm1pbmVkXHJcbiAgICAqIGJ5IGNvdW50aW5nIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG5vZGUgdG8gdGhlIGN1cnNvcidzIGxvY2F0aW9uIHdpdGhpbiB0aGUgbm9kZS5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIHNjZW5hcmlvcyB3aGVyZSBwcmVjaXNlIHRleHQgbWFuaXB1bGF0aW9uIGlzIHJlcXVpcmVkLCBzdWNoIGFzXHJcbiAgICAqIHRleHQgZWRpdG9ycyBvciBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29udGVudCBmaWVsZHMuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aXRoaW4gd2hpY2ggdG8gY2FsY3VsYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSBUaGUgemVyby1iYXNlZCBpbmRleCByZXByZXNlbnRpbmcgdGhlIGN1cnNvcidzIHBvc2l0aW9uIHdpdGhpbiB0aGUgbm9kZSxcclxuICAgICogb3IgbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IGludGVyc2VjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbm9kZSBvciBpZiB0aGVyZSBhcmUgYW55IGlzc3Vlc1xyXG4gICAgKiByZXRyaWV2aW5nIHRoZSBzZWxlY3Rpb24uXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGFuZCB0aGUgY3Vyc29yIGlzIGluc2lkZSBpdDpcclxuICAgICogY29uc3QgcG9zaXRpb24gPSBnZXRDdXJzb3JQb3NpdGlvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktZWRpdGFibGUtZGl2JykpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnQ3Vyc29yIHBvc2l0aW9uOicsIHBvc2l0aW9uKTtcclxuICAgICogXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24ncyByYW5nZSBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBpbnRlcnNlY3RzIHdpdGggdGhlXHJcbiAgICAqIGdpdmVuIG5vZGUuIElmIGFuIGludGVyc2VjdGlvbiBpcyBmb3VuZCwgaXQgdXNlcyBhIFRyZWVXYWxrZXIgdG8gdHJhdmVyc2UgdGhlIHRleHQgbm9kZXMgdW5kZXJcclxuICAgICogdGhlIGdpdmVuIG5vZGUsIGNvdW50aW5nIGNoYXJhY3RlcnMgdW50aWwgaXQgcmVhY2hlcyB0aGUgc3RhcnQgY29udGFpbmVyIG9mIHRoZSByYW5nZS5cclxuICAgICogVGhpcyBhbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBhbiBhY2N1cmF0ZSBjaGFyYWN0ZXIgaW5kZXggZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgbmVzdGVkIGVsZW1lbnRzXHJcbiAgICAqIG9yIG1peGVkIGNvbnRlbnQgKHRleHQgY29tYmluZWQgd2l0aCBlbGVtZW50cykuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGdldEN1cnNvclBvc2l0aW9uKG5vZGU6IE5vZGUpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIW5vZGUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBpZiAoIXJhbmdlLmludGVyc2VjdHNOb2RlKG5vZGUpKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbiAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxyXG4gICAgICAgICAgICB7IGFjY2VwdE5vZGU6IG5vZGUgPT4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgY2hhckNvdW50ID0gMDtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLmZpcnN0Q2hpbGQoKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PT0gcmFuZ2Uuc3RhcnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGNoYXJDb3VudCArPSByYW5nZS5zdGFydE9mZnNldDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGFyQ291bnQgKz0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjaGFyQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBlbGVtZW50IGJhc2VkIG9uIGEgY2hhcmFjdGVyIGluZGV4LlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcmFuZ2UgYW5kIHVzZXMgYSBUcmVlV2Fsa2VyIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHRleHQgbm9kZXNcclxuICAgICogd2l0aGluIHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIGV4YWN0IGxvY2F0aW9uIHRvIHNldCB0aGUgY3Vyc29yLiBUaGUgcG9zaXRpb24gaXMgc2V0XHJcbiAgICAqIGJ5IGNvdW50aW5nIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHNwZWNpZmllZCBpbmRleC5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBzZXQgdGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIC0gVGhlIHplcm8tYmFzZWQgY2hhcmFjdGVyIGluZGV4IHdoZXJlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHBvc2l0aW9uZWQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBkaXJlY3RseSBtb2RpZmllcyB0aGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIHBhcmFncmFwaCBlbGVtZW50IGFuZCB5b3Ugd2FudCB0byBzZXQgdGhlIGN1cnNvciBhdCB0aGUgMTB0aCBjaGFyYWN0ZXI6XHJcbiAgICAqIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteS1wYXJhZ3JhcGgnKTtcclxuICAgICogc2V0Q3Vyc29yUG9zaXRpb24ocGFyYWdyYXBoLCAxMCk7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhlIGZ1bmN0aW9uIGNsZWFycyBhbnkgZXhpc3Rpbmcgc2VsZWN0aW9ucywgY2FsY3VsYXRlcyB0aGUgY29ycmVjdCB0ZXh0IG5vZGUgYW5kIG9mZnNldCB3aXRoaW4gdGhhdCBub2RlLFxyXG4gICAgKiBhbmQgdGhlbiBzZXRzIGEgbmV3IHJhbmdlIGF0IHRoYXQgcG9zaXRpb24uIEl0IGVuc3VyZXMgdGhhdCB0aGUgY3Vyc29yIGlzIG1vdmVkIGFjY3VyYXRlbHksIGV2ZW4gd2l0aGluXHJcbiAgICAqIGNvbXBsZXggbmVzdGVkIGNvbnRlbnQgc3RydWN0dXJlcy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB0ZXh0IGVkaXRpbmcgYXBwbGljYXRpb25zIGFuZCBkeW5hbWljXHJcbiAgICAqIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW1zIHdoZXJlIHByZWNpc2UgY3Vyc29yIGNvbnRyb2wgaXMgcmVxdWlyZWQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHNldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ6IE5vZGUsIHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgY29uc3QgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbiAgICAgICAgICAgIGVsZW1lbnQsXHJcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxyXG4gICAgICAgICAgICB7IGFjY2VwdE5vZGU6ICgpID0+IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50UG9zID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9zICsgdGV4dExlbmd0aCA+PSBwb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY3VycmVudE5vZGUsIHBvc2l0aW9uIC0gY3VycmVudFBvcyk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRQb3MgKz0gdGV4dExlbmd0aDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnQgdHlwZSBhdHRyaWJ1dGUgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb250ZW50IGJsb2NrIGluIHRoZSBkb2N1bWVudC5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBwcmltYXJpbHkgdXNlZCBpbiBjb250ZXh0cyB3aGVyZSBkaWZmZXJlbnQgYWN0aW9ucyBvciBiZWhhdmlvcnMgYXJlIGNvbmRpdGlvbmVkXHJcbiAgICAqIHVwb24gdGhlIHR5cGUgb2YgY29udGVudCB0aGUgdXNlciBpcyBpbnRlcmFjdGluZyB3aXRoLlxyXG4gICAgKlxyXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gVGhlIHZhbHVlIG9mIHRoZSAnZGF0YS1jb250ZW50LXR5cGUnIGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMgb24gdGhlIGNvbnRlbnQgZWxlbWVudCxcclxuICAgICogb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCBvciB0aGUgY29udGVudCBlbGVtZW50IGRvZXMgbm90IGV4aXN0LlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBJZiB5b3UgbmVlZCB0byBhcHBseSBzcGVjaWZpYyBsb2dpYyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBjb250ZW50IGN1cnJlbnRseSBiZWluZyBlZGl0ZWQ6XHJcbiAgICAqIGNvbnN0IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCgpO1xyXG4gICAgKiBpZiAoY29udGVudFR5cGUgPT09ICdwJykge1xyXG4gICAgKiAgICAgY29uc29sZS5sb2coJ0VkaXRpbmcgYSB0ZXh0IGJsb2NrJyk7XHJcbiAgICAqIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT09ICdoMScpIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdFZGl0aW5nIGFuIGhlYWRpbmcnKTtcclxuICAgICogfVxyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBiZWdpbnMgYnkgY2FsbGluZyBgZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKClgLCB3aGljaCBzaG91bGQgcmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIGJsb2NrIGVsZW1lbnRcclxuICAgICogaW4gdGhlIFVJLiBJdCB0aGVuIHNlYXJjaGVzIGZvciBhbiBlbGVtZW50IHdpdGhpbiB0aGlzIGJsb2NrIHdpdGggdGhlIGNsYXNzICcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JyxcclxuICAgICogd2hpY2ggaXMgZXhwZWN0ZWQgdG8gY2FycnkgYSAnZGF0YS1jb250ZW50LXR5cGUnIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGNvbnRlbnQgKGUuZy4sICd0ZXh0JywgJ2ltYWdlJywgZXRjLikuXHJcbiAgICAqIFRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKTtcclxuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGJsb2NrPy5xdWVyeVNlbGVjdG9yKFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAoIWNvbnRlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGNvbnRlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50VHlwZSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTcGxpdHMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCByb290IG5vZGUgaW50byB0d28gcmFuZ2VzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHR3byByYW5nZXM6IG9uZSBmb3IgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBjdXJzb3IgYW5kIG9uZSBmb3IgdGhlIGNvbnRlbnQgYWZ0ZXIuXHJcbiAgICAqIFRoZSBvcGVyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgYm91bmRhcmllcyBvZiB0aGUgcHJvdmlkZWQgcm9vdCBub2RlLCBlbnN1cmluZyB0aGF0IHRoZSBkaXZpc2lvbiByZXNwZWN0c1xyXG4gICAgKiB0aGUgc3RydWN0dXJhbCBpbnRlZ3JpdHkgb2YgdGhlIGNvbnRlbnQgd2l0aGluIHRoYXQgbm9kZS5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gcm9vdE5vZGUgLSBUaGUgcm9vdCBub2RlIHdpdGhpbiB3aGljaCB0aGUgY29udGVudCBpcyB0byBiZSBzcGxpdC4gVGhpcyBub2RlIHNldHMgdGhlIGJvdW5kYXJ5IGZvciB0aGUgc3BsaXQgb3BlcmF0aW9uLlxyXG4gICAgKiBAcmV0dXJucyB7UmFuZ2VbXX0gQW4gYXJyYXkgb2YgdHdvIGBSYW5nZWAgb2JqZWN0czogdGhlIGZpcnN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBjdXJzb3IsIGFuZCB0aGUgc2Vjb25kIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGN1cnNvci5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtZSB0aGVyZSBpcyBhIGRpdiBlbGVtZW50IHdpdGggY29udGVudCBhbmQgYSBjdXJzb3IgcG9zaXRpb24gc29tZXdoZXJlIGluc2lkZSBpdDpcclxuICAgICogY29uc3QgY29udGVudERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50RGl2Jyk7XHJcbiAgICAqIGNvbnN0IHJhbmdlcyA9IHNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKGNvbnRlbnREaXYpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnQ29udGVudCBiZWZvcmUgY3Vyc29yOicsIHJhbmdlc1swXS5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnQ29udGVudCBhZnRlciBjdXJzb3I6JywgcmFuZ2VzWzFdLmNsb25lQ29udGVudHMoKS50ZXh0Q29udGVudCk7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgcmFuZ2UgYW5kIGNoZWNrcyBpZiBpdCBpbnRlcnNlY3RzIHdpdGggdGhlIHByb3ZpZGVkIHJvb3ROb2RlLlxyXG4gICAgKiBJZiBzbywgaXQgY29uc3RydWN0cyB0d28gbmV3IHJhbmdlcyB1c2luZyB0aGUgcm9vdE5vZGUgYXMgdGhlIGNvbnRleHQ6XHJcbiAgICAqIC0gVGhlIGZpcnN0IHJhbmdlIGNhcHR1cmVzIGFsbCBjb250ZW50IGZyb20gdGhlIHN0YXJ0IG9mIHJvb3ROb2RlIHVwIHRvIHRoZSBjdXJzb3IncyBzdGFydC5cclxuICAgICogLSBUaGUgc2Vjb25kIHJhbmdlIGNhcHR1cmVzIGFsbCBjb250ZW50IGZyb20gdGhlIGN1cnNvcidzIGVuZCB0byB0aGUgZW5kIG9mIHJvb3ROb2RlLCBvcHRpb25hbGx5IGV4dGVuZGluZyB0byB0aGUgbGFzdCBjaGlsZCBvZiByb290Tm9kZSBpZiBuZWNlc3NhcnkuXHJcbiAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgaW52b2x2aW5nIHJpY2ggdGV4dCBlZGl0aW5nIG9yIGFueSBzY2VuYXJpbyB3aGVyZSBjb250ZW50IG5lZWRzIHRvIGJlIHNlZ21lbnRlZCBhcm91bmQgYSB1c2VyJ3MgcG9pbnQgb2YgZm9jdXMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKHJvb3ROb2RlOiBOb2RlKTogUmFuZ2VbXSB7XHJcbiAgICAgICAgY29uc3QgcmFuZ2VzOiBSYW5nZVtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIHJhbmdlcztcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2VCZWZvcmUgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlQmVmb3JlLnNlbGVjdE5vZGVDb250ZW50cyhyb290Tm9kZSk7XHJcbiAgICAgICAgcmFuZ2VCZWZvcmUuc2V0RW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlQWZ0ZXIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlQWZ0ZXIuc2VsZWN0Tm9kZUNvbnRlbnRzKHJvb3ROb2RlKTtcclxuICAgICAgICByYW5nZUFmdGVyLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcclxuICAgICAgICBpZiAocm9vdE5vZGUubGFzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHJhbmdlQWZ0ZXIuc2V0RW5kQWZ0ZXIocm9vdE5vZGUubGFzdENoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJhbmdlcy5wdXNoKHJhbmdlQmVmb3JlKTtcclxuICAgICAgICByYW5nZXMucHVzaChyYW5nZUFmdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUGxhY2VzIHRoZSBjdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIGEgc3BlY2lmaWVkIGVkaXRhYmxlIEhUTUwgZWxlbWVudC4gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgXHJcbiAgICAqIGNvbnRlbnQtZWRpdGFibGUsIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gdXNlciBpbnRlcmZhY2VzXHJcbiAgICAqIHdoZXJlIHRleHQgZWRpdGluZyBjYXBhYmlsaXRpZXMgYXJlIGR5bmFtaWNhbGx5IGVuYWJsZWQsIGFuZCBpbW1lZGlhdGUgdXNlciBpbnRlcmFjdGlvbiBpcyBleHBlY3RlZC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWRpdGFibGVFbGVtZW50IC0gVGhlIGNvbnRlbnQtZWRpdGFibGUgSFRNTCBlbGVtZW50IHdoZXJlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgc3RhcnQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBkaXJlY3RseSBtYW5pcHVsYXRlcyB0aGUgRE9NIGFuZCBzZWxlY3Rpb24gc3RhdGUuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtaW5nIHRoZXJlIGlzIGEgY29udGVudC1lZGl0YWJsZSBwYXJhZ3JhcGggaW4gdGhlIGRvY3VtZW50OlxyXG4gICAgKiBjb25zdCBlZGl0YWJsZVBhcmFncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0YWJsZVBhcmFncmFwaCcpO1xyXG4gICAgKiBwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChlZGl0YWJsZVBhcmFncmFwaCk7XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBpZiB0aGUgYGVkaXRhYmxlRWxlbWVudGAgaXMgY29udGVudC1lZGl0YWJsZS4gSWYgaXQgaXMgbm90LCBhIHdhcm5pbmcgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxyXG4gICAgKiBJZiB0aGUgZWxlbWVudCBpcyBlZGl0YWJsZSwgaXQ6XHJcbiAgICAqIDEuIFNldHMgZm9jdXMgb24gdGhlIGVsZW1lbnQgdG8gZW5zdXJlIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHVzZXIgaW5wdXQuXHJcbiAgICAqIDIuIENyZWF0ZXMgYSBuZXcgUmFuZ2Ugb2JqZWN0LCBzZWxlY3RzIGFsbCB0aGUgY29udGVudHMgb2YgdGhlIGVsZW1lbnQsIGFuZCBjb2xsYXBzZXMgdGhpcyByYW5nZSB0byB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAqIDMuIENsZWFycyBhbnkgZXhpc3Rpbmcgc2VsZWN0aW9ucyBhbmQgYXBwbGllcyB0aGUgbmV3IHJhbmdlLCBlZmZlY3RpdmVseSBwb3NpdGlvbmluZyB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudC5cclxuICAgICogVGhpcyBhcHByb2FjaCBpcyBjcnVjaWFsIGZvciBlZGl0aW5nIGludGVyZmFjZXMsIGVuc3VyaW5nIHRoYXQgdXNlciBpbnRlcmFjdGlvbiBpcyBpbnR1aXRpdmUgYW5kIGltbWVkaWF0ZWx5IHJlc3BvbnNpdmUuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGVkaXRhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRhYmxlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgZWxlbWVudCBpcyBub3QgZWRpdGFibGUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNldHMgdGhlIGZvY3VzIGFuZCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgdGV4dCB3aXRoaW4gYSBzcGVjaWZpZWQgY29udGVudC1lZGl0YWJsZSBIVE1MIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgbWV0aG9kIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBoYW5kbGUgY29udGVudC1lZGl0YWJsZSBlbGVtZW50cyBieSBwb3NpdGlvbmluZyB0aGUgY3Vyc29yXHJcbiAgICAqIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnRlbnQncyBjb21wb3NpdGlvbiAodGV4dCwgZWxlbWVudHMsIGV0Yy4pLlxyXG4gICAgKlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIGNvbnRlbnQtZWRpdGFibGUuIElmIGl0IGlzLCBpdCB1c2VzIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXHJcbiAgICAqIHRvIGVuc3VyZSB0aGF0IGFsbCBET00gdXBkYXRlcyBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgc2V0dGluZyBmb2N1cyBhbmQgYWRqdXN0aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEl0IHRoZW4gY3JlYXRlcyBhIHJhbmdlIHNwYW5uaW5nIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBmaW5kcyB0aGUgZGVlcGVzdCBsYXN0IG5vZGUsIGFuZCBzZXRzIHRoZVxyXG4gICAgKiBjdXJzb3IgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIG5vZGUuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgcmljaCB0ZXh0IGVkaXRvcnMgb3IgYW55IGFwcGxpY2F0aW9uXHJcbiAgICAqIHRoYXQgcmVxdWlyZXMgcHJlY2lzZSBjb250cm9sIG92ZXIgY3Vyc29yIHBsYWNlbWVudCBpbiBlZGl0YWJsZSBjb250ZW50LlxyXG4gICAgKlxyXG4gICAgKiBJZiB0aGUgZWxlbWVudCBpcyBub3QgY29udGVudC1lZGl0YWJsZSwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGVkaXRlZC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEJsb2NrIC0gVGhlIGNvbnRlbnQtZWRpdGFibGUgSFRNTCBlbGVtZW50IHdoZXJlIHRoZSBjdXJzb3Igd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGVuZC5cclxuICAgICovXHJcbiAgICBzdGF0aWMgcGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGNvbnRlbnRCbG9jazogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoY29udGVudEJsb2NrLmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50QmxvY2suZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRlbnRCbG9jayk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGxhc3ROb2RlOiBOb2RlIHwgbnVsbCA9IGNvbnRlbnRCbG9jaztcclxuICAgICAgICAgICAgICAgIHdoaWxlIChsYXN0Tm9kZS5sYXN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IGxhc3ROb2RlLmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQobGFzdE5vZGUsIGxhc3ROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSA/IGxhc3ROb2RlLnRleHRDb250ZW50IS5sZW5ndGggOiAwKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBlbGVtZW50IGlzIG5vdCBlZGl0YWJsZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRDdXJyZW50QWN0aXZlQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNsb3Nlc3QoXCIuYmxvY2tcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YocGFyZW50U2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBFbGVtZW50KS5jbG9zZXN0KHBhcmVudFNlbGVjdG9yKSAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlRmlsdGVyVGV4dCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgICBsZXQgbGFzdFNsYXNoUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBjb250YWluZXIucGFyZW50RWxlbWVudD8uaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBvZmZzZXQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IG5vZGUudGV4dENvbnRlbnQ/LnN1YnN0cmluZygwLCBvZmZzZXQpIHx8IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoUG9zaXRpb24gPSB0ZXh0QmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKFwiL1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaFBvc2l0aW9uICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBsYXN0U2xhc2hQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG5vZGUucGFyZW50Tm9kZT8udGV4dENvbnRlbnQ/Lmxhc3RJbmRleE9mKFwiL1wiKSB8fCAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBjdXJzb3IgaXMgbm90IHdpdGhpbiBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50IG9yIGEgdGV4dCBub2RlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIGFjdGl2ZSBzZWxlY3Rpb24uXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxhc3RTbGFzaFBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgc3RhdGljIGZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeURhdGFDb250ZW50VHlwZShldmVudDogTW91c2VFdmVudCwgZGF0YUNvbnRlbnRUeXBlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBjbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmRhdGFzZXQuY29udGVudFR5cGUgPT09IGRhdGFDb250ZW50VHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2xpY2tlZEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZGF0YXNldC5jb250ZW50VHlwZSA9PT0gZGF0YUNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkKGV2ZW50OiBNb3VzZUV2ZW50LCBpZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNsaWNrZWRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlDbGFzcyhldmVudDogTW91c2VFdmVudCwgY2xhc3NLZXk6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudCE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzS2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2xpY2tlZEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZihldmVudDogS2V5Ym9hcmRFdmVudCwgc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCB0YXJnZXQ6IEVsZW1lbnQgfCBudWxsID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFBhcmVudFRhcmdldEJ5U2VsZWN0b3IoZXZlbnQ6IE1vdXNlRXZlbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogRWxlbWVudCB8IG51bGwgPSAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkgPyBldmVudC50YXJnZXQgOiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlID8gZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQgOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQYXJlbnRGcm9tU2VsZWN0aW9uKHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gfCBudWxsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgbGV0IHJhbmdlOiBSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGxldCBjb21tb25BbmNlc3RvckNvbnRhaW5lcjogTm9kZSA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCAmJiBjb21tb25BbmNlc3RvckNvbnRhaW5lci5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQ6IEVsZW1lbnQgfCBudWxsID0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50XHJcbiAgICAgICAgICAgID8gY29tbW9uQW5jZXN0b3JDb250YWluZXJcclxuICAgICAgICAgICAgOiBjb21tb25BbmNlc3RvckNvbnRhaW5lci5wYXJlbnRFbGVtZW50O1xyXG4gICAgXHJcbiAgICAgICAgd2hpbGUgKHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZW1vdmVDbGFzc2VzV2l0aFByZWZpeChlbGVtZW50OiBFbGVtZW50LCBwcmVmaXg6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXNUb1JlbW92ZSA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLmZpbHRlcihjbHMgPT4gY2xzLnN0YXJ0c1dpdGgocHJlZml4KSk7XHJcbiAgICAgICAgY2xhc3Nlc1RvUmVtb3ZlLmZvckVhY2goY2xzID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNUYXJnZXREZXNjZW5kYW50T2ZTZWxlY3RvcihldmVudDogRXZlbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgVGV4dCkge1xyXG4gICAgICAgICAgICB0YXJnZXQgPSAoZXZlbnQudGFyZ2V0IGFzIFRleHQpLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhbmNlc3RvciA9IHRhcmdldC5jbG9zZXN0KHNlbGVjdG9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9yICE9PSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkIHNlbGVjdG9yLCBjaGVja2luZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIGl0cyBkZXNjZW5kYW50cy5cclxuICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20sIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guXHJcbiAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgQ1NTIHNlbGVjdG9yIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAqIEByZXR1cm5zIFRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIGluY2x1ZGluZyB0aGUgZWxlbWVudCBpdHNlbGYsIG9yIG51bGwgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JJbmNsdWRpbmdTZWxmKGVsZW1lbnQ6IEVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBtYXRjaGVzIHRoZSBzZWxlY3RvclxyXG4gICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBub3QsIHVzZSB0aGUgc3RhbmRhcmQgcXVlcnlTZWxlY3RvciB0byBmaW5kIGEgbWF0Y2hpbmcgZGVzY2VuZGFudFxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN0YXRpYyBzYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50LmlubmVySFRNTDtcclxuICAgIC8vICAgICBpZiAoY29udGVudC5lbmRzV2l0aCgnPGJyPicpKSB7XHJcbiAgICAvLyAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudC5zbGljZSgwLCAtNCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHN0YXRpYyBzYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50LmlubmVySFRNTDtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaG91bGRSZXN0b3JlQ2FyZXQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgY2FyZXRQb3MgPSAwO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VFbmRzQXRDb250ZW50RW5kID0gcmFuZ2UuZW5kT2Zmc2V0ID09PSBlbGVtZW50LmlubmVyVGV4dC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAocmFuZ2VFbmRzQXRDb250ZW50RW5kICYmIGNvbnRlbnQuZW5kc1dpdGgoJzxicj4nKSkge1xyXG4gICAgICAgICAgICAgICAgc2hvdWxkUmVzdG9yZUNhcmV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNhcmV0UG9zID0gcmFuZ2UuZW5kT2Zmc2V0OyAvLyBNYW50ZXIgYSBwb3Npw6fDo28gb3JpZ2luYWwgZG8gY2FyZXRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlciA8YnI+IGZpbmFsLCBzZSBleGlzdGlyLCB1c2FuZG8gbWFuaXB1bGHDp8OjbyBkbyBET01cclxuICAgICAgICBpZiAoY29udGVudC5lbmRzV2l0aCgnPGJyPicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGVsZW1lbnQubGFzdENoaWxkO1xyXG4gICAgICAgICAgICBpZiAobGFzdENoaWxkICYmIGxhc3RDaGlsZC5ub2RlTmFtZSA9PT0gJ0JSJykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChsYXN0Q2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkUmVzdG9yZUNhcmV0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gbmV3IFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHROb2RlcyA9IHRoaXMuZ2V0VGV4dE5vZGVzSW4oZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGxldCBjaGFyQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXh0Tm9kZSBvZiB0ZXh0Tm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVMZW5ndGggPSB0ZXh0Tm9kZS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhckNvdW50ICsgbm9kZUxlbmd0aCA+PSBjYXJldFBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCBjYXJldFBvcyAtIGNoYXJDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKHRleHROb2RlLCBjYXJldFBvcyAtIGNoYXJDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnQgKz0gbm9kZUxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUZXh0Tm9kZXNJbihub2RlOiBOb2RlKTogVGV4dFtdIHtcclxuICAgICAgICBsZXQgdGV4dE5vZGVzOiBUZXh0W10gPSBbXTtcclxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSBhcyBUZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGVzID0gdGV4dE5vZGVzLmNvbmNhdCh0aGlzLmdldFRleHROb2Rlc0luKGNoaWxkcmVuW2ldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHROb2RlcztcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGFsbENvbnRlbnRFZGl0YWJsZXMuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxDb250ZW50RWRpdGFibGVzW2luZGV4IC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZXh0Q29udGVudEVkaXRhYmxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhbGxDb250ZW50RWRpdGFibGVzOiBIVE1MRWxlbWVudFtdID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgICAgICBjb25zdCBpbmRleCA9IGFsbENvbnRlbnRFZGl0YWJsZXMuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICBpZiAoaW5kZXggPCBhbGxDb250ZW50RWRpdGFibGVzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbENvbnRlbnRFZGl0YWJsZXNbaW5kZXggKyAxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXRBY3RpdmVDb250ZW50RWRpdGFibGUoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gRE9NVXRpbHMuZmluZENvbnRlbnRFZGl0YWJsZUluRGVzY2VuZGFudHMoYWN0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGZpbmRDb250ZW50RWRpdGFibGVJbkRlc2NlbmRhbnRzKGVsZW1lbnQ6IEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGlmICgoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IERPTVV0aWxzLmZpbmRDb250ZW50RWRpdGFibGVJbkRlc2NlbmRhbnRzKGNoaWxkKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2F2ZUNhcmV0UG9zaXRpb24yZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFySW5kZXggPSBBcnJheS5mcm9tKGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpLnNsaWNlKDAsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQpLmxlbmd0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgY2hhckluZGV4LCBob3Jpem9udGFsUG9zOiByZWN0LmxlZnQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgY2hhckluZGV4OiAwLCBob3Jpem9udGFsUG9zOiAwIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlc3RvcmVDYXJldFBvc2l0aW9uMmQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xyXG4gICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE5vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUubm9kZVZhbHVlKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKHRlc3RSZWN0LmxlZnQgLSBwb3NpdGlvbi5ob3Jpem9udGFsUG9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3ROb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IGk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGNsb3NlIGVub3VnaCwgYnJlYWsgZWFybHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSA8IDUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChiZXN0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYmVzdE5vZGUsIGJlc3RPZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBzYXZlQ2FyZXRQb3NpdGlvbjNkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogeyBjaGFySW5kZXg6IG51bWJlciwgaG9yaXpvbnRhbFBvczogbnVtYmVyLCB2ZXJ0aWNhbFBvczogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJJbmRleCA9IEFycmF5LmZyb20oZWxlbWVudC50ZXh0Q29udGVudCB8fCAnJykuc2xpY2UoMCwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCkubGVuZ3RoO1xyXG4gICAgICAgICAgICByZXR1cm4geyBjaGFySW5kZXgsIGhvcml6b250YWxQb3M6IHJlY3QubGVmdCwgdmVydGljYWxQb3M6IHJlY3QudG9wIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGNoYXJJbmRleDogMCwgaG9yaXpvbnRhbFBvczogMCwgdmVydGljYWxQb3M6IDAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVzdG9yZUNhcmV0UG9zaXRpb24zZChlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zaXRpb246IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbGVtZW50LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XHJcbiAgICAgICAgICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgICAgIGxldCBiZXN0Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgIGxldCBiZXN0T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghbm9kZS5ub2RlVmFsdWUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3RhbmNlID0gTWF0aC5hYnModGVzdFJlY3QubGVmdCAtIHBvc2l0aW9uLmhvcml6b250YWxQb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC50b3AgLSBwb3NpdGlvbi52ZXJ0aWNhbFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IE1hdGguc3FydChob3Jpem9udGFsRGlzdGFuY2UgKiogMiArIHZlcnRpY2FsRGlzdGFuY2UgKiogMik7ICAvLyBVc2UgRXVjbGlkZWFuIGRpc3RhbmNlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbERpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IHRvdGFsRGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3ROb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IGk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGNsb3NlIGVub3VnaCwgYnJlYWsgZWFybHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsRGlzdGFuY2UgPCA1KSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYmVzdE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN0YXRpYyBtZXJnZUFuZE5vcm1hbGl6ZUlubGluZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGVsZW1lbnQubm9ybWFsaXplKCk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IG1lcmdlSW5saW5lRWxlbWVudHMgPSAobm9kZTogQ2hpbGROb2RlKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIFsnU1BBTicsICdDT0RFJywgJ0VNJywgJ1NUUk9ORycsICdCJywgJ0knXS5pbmNsdWRlcyhjdXJyZW50Tm9kZS5ub2RlTmFtZSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtZXJnZUlubGluZUVsZW1lbnRzKGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbGV0IG5leHROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuZXh0Tm9kZS5ub2RlTmFtZSA9PT0gY3VycmVudE5vZGUubm9kZU5hbWUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHROb2RlLmZpcnN0Q2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmFwcGVuZENoaWxkKG5leHROb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVUb1JlbW92ZSA9IG5leHROb2RlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQobm9kZVRvUmVtb3ZlKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfTtcclxuXHJcbiAgICAvLyAgICAgbWVyZ2VJbmxpbmVFbGVtZW50cyhlbGVtZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgbWVyZ2VJbmxpbmVFbGVtZW50cyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGVsZW1lbnQubm9ybWFsaXplKCk7ICAvLyBOb3JtYWxpemEgb3MgbsOzcyBkZSB0ZXh0byBwcmltZWlyb1xyXG5cclxuICAgICAgICBjb25zdCBjaGlsZHJlbjogTm9kZUxpc3RPZjxDaGlsZE5vZGU+ID0gZWxlbWVudC5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50ID0gY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoWydTUEFOJywgJ0NPREUnLCAnRU0nLCAnU1RST05HJywgJ0InLCAnSSddLmluY2x1ZGVzKGNoaWxkRWxlbWVudC5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDEgJiYgY2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nICYmIGNoaWxkRWxlbWVudC5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRFbGVtZW50Lm5vZGVOYW1lID09PSAoY2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQuYXBwZW5kQ2hpbGQoKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuZmlyc3RDaGlsZCEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMubWVyZ2VJbmxpbmVFbGVtZW50cyhjaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSAnLi9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudSc7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB9IGZyb20gJy4vc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvcic7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9idXR0b24tZ3JvdXAvQnV0dG9uR3JvdXAnO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tICdAL2NvbW1vbi9DdXN0b21FdmVudHMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tICdAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHMnO1xyXG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tICdAL2NvbW1vbi9aSW5kZXgnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25zOiBEcm9wZG93bk1lbnVbXTtcclxuICAgIHNlcGFyYXRvcnM6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcltdO1xyXG4gICAgY3VycmVudFNlbGVjdGlvblJhbmdlOiBSYW5nZSB8IG51bGw7XHJcbiAgICBodG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51OiBIVE1MRWxlbWVudCB8IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3ducyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9ycyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImZsb2F0aW5nLXRvb2xiYXJcIiwgXCJzZWxlY3Qtd3JhcHBlclwiLCBcInNvZnQtYm94LXNoYWRvd1wiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93KCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5mb2N1c2FibGVcIik7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZWxlY3Rpb24gZm91bmQnKTtcclxuICAgIC8vICAgICAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAvLyAgICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAvLyAgICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcblxyXG4gICAgLy8gICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuZmxvYXRpbmdUb29sYmFyRGlzcGxheWVkLCB7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgLy8gICAgICAgICAvLyAgICAgY2FuY2VsYWJsZTogdHJ1ZVxyXG4gICAgLy8gICAgICAgICAvLyB9KSk7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZERyb3Bkb3duKGRyb3Bkb3duOiBEcm9wZG93bk1lbnUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5wdXNoKGRyb3Bkb3duKVxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZEJ1dHRvbkdyb3VwKGJ1dHRvbkdyb3VwOiBCdXR0b25Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXAuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFNlcGFyYXRvcihzZXBhcmF0b3I6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9ycy5wdXNoKHNlcGFyYXRvcik7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChzZXBhcmF0b3IuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFRleHRUb29sYmFyKGJ1dHRvbjogQnV0dG9uR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbi5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYW55RHJvcGRvd25WaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgZHJvcGRvd24gb2YgdGhpcy5kcm9wZG93bnMpIHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Bkb3duIG9mIHRoaXMuZHJvcGRvd25zKSB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5kcm9wZG93bkxpc3QuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd24uZHJvcGRvd25MaXN0LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuXHJcbiAgICAgICAgLy8gUHJldmVudCBmb2N1cyBjaGFuZ2Ugd2hlbiBjbGlja2luZyBvbiB0aGlzIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUHJldmVudCBmb2N1cyBjaGFuZ2Ugd2hlbiBjbGlja2luZyBvbiB0aGlzIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveEZpbmlzaGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jYW5IaWRlICYmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9IGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uRW1wdHkoKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKChldmVudC5rZXkgPT09ICdFc2NhcGUnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApICYmICF0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgfSBcclxuICAgICAgICAvLyAgICAgLy8gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApICYmICF0aGlzLmlucHV0TGlua0JveFdyYXBwZXIuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICB0aGlzLnJlc3RvcmVSYW5nZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrRGVsZXRlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuYmxvY2tUeXBlQ2hhbmdlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpc1NlbGVjdGlvbkVtcHR5KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIHJldHVybiAhc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwIHx8IHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0oKSA9PT0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdG9yZVJhbmdlU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UodGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UhKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsImltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFuZ2VDb2xvciB7XHJcblxyXG4gICAgY29sb3I6IENvbG9ycztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb2xvcjogQ29sb3JzKSB7XHJcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNob3dIaWRlQWN0aXZlQnV0dG9uIHtcclxuXHJcbiAgICBjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCI7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgaW50ZW50aW9uOiBcInNob3dcIiB8IFwiaGlkZVwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWU6IHN0cmluZywgaW50ZW50aW9uOiBcInNob3dcIiB8IFwiaGlkZVwiKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0tleSA9IGNsYXNzS2V5O1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmludGVudGlvbiA9IGludGVudGlvbjtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBSZXNldEFjdGl2ZUJ1dHRvbnMge1xyXG5cclxuICAgIGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCIpIHtcclxuICAgICAgICB0aGlzLmNsYXNzS2V5ID0gY2xhc3NLZXk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJVUlBY3Rpb24gfSBmcm9tIFwiLi9JVUlBY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDbG9zZUVsZW1lbnQgaW1wbGVtZW50cyBJVUlBY3Rpb24ge1xyXG5cclxufSIsImltcG9ydCB7IElVSUFjdGlvbiB9IGZyb20gXCIuL0lVSUFjdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNob3dFbGVtZW50IGltcGxlbWVudHMgSVVJQWN0aW9uIHtcclxuXHJcbn0iLCJpbXBvcnQgeyBJVUlBY3Rpb24gfSBmcm9tIFwiLi9JVUlBY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSBpbXBsZW1lbnRzIElVSUFjdGlvbiB7XHJcblxyXG4gICAgbGFuZ3VhZ2U6IHN0cmluZztcclxuICAgIGJsb2NrSWQ6IHN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKGJsb2NrSWQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYmxvY2tJZCA9IGJsb2NrSWQ7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCIuL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIi4vSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ2hhbmdlQ29sb3IgfSBmcm9tIFwiLi9VSUFjdGlvbnMvQ2hhbmdlQ29sb3JcIjtcclxuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiLi9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgUmVzZXRBY3RpdmVCdXR0b25zIH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Jlc2V0QWN0aXZlQnV0dG9uc1wiO1xyXG5pbXBvcnQgeyBDbG9zZUVsZW1lbnQgfSBmcm9tIFwiLi9VSUFjdGlvbnMvQ2xvc2VFbGVtZW50XCI7XHJcbmltcG9ydCB7IFNob3dFbGVtZW50IH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Nob3dFbGVtZW50XCI7XHJcbmltcG9ydCB7IENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlIH0gZnJvbSBcIi4vVUlBY3Rpb25zL0NoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuXHJcblxyXG4gICAgc3RhdGljIGVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudCh0YXJnZXRDbGFzczogc3RyaW5nLCBibG9ja0lkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UoYmxvY2tJZCwgbGFuZ3VhZ2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRTaG93RWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLlNob3dFbGVtZW50LCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0VsZW1lbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENsb3NlRWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IENsb3NlRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZDogc3RyaW5nLCBjb2xvcjogQ29sb3JzKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb246IG5ldyBDaGFuZ2VDb2xvcihjb2xvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KHRhcmdldENsYXNzOiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWU6IHN0cmluZywgaW50ZW5zaW9uOiBcInNob3dcIiB8IFwiaGlkZVwiKSB7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImhpbGl0ZUNvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSkge1xyXG4gICAgICAgICAgICBpbnRlbnNpb24gPSBcImhpZGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImZvcmVDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5Gb3JlQ29sb3JJbml0aWFsKSB7XHJcbiAgICAgICAgICAgIGludGVuc2lvbiA9IFwiaGlkZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldENsYXNzID09IFwiYmFja2dyb3VuZENvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkJhY2tncm91bmRDb2xvck5vbmUpIHtcclxuICAgICAgICAgICAgaW50ZW5zaW9uID0gXCJoaWRlXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuU2hvd0hpZGVBY3RpdmVCdXR0b24sIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0hpZGVBY3RpdmVCdXR0b24odGFyZ2V0Q2xhc3MsIHZhbHVlLCBpbnRlbnNpb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQodGFyZ2V0Q2xhc3M6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5SZXNldEFjdGl2ZUJ1dHRvbnMsIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgUmVzZXRBY3RpdmVCdXR0b25zKHRhcmdldENsYXNzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogcmV3cml0ZSB0aGlzIGRvY1xyXG4gICAgLyoqXHJcbiAgICAqIEVtaXRzIGEgY3VzdG9tIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBzdGF0ZXMgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHRleHQgc2VsZWN0aW9uLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNydWNpYWwgaW4gYSB0ZXh0IGVkaXRpbmcgZW52aXJvbm1lbnQgd2hlcmUgbXVsdGlwbGUgY29tcG9uZW50cyBtaWdodCBuZWVkIHRvXHJcbiAgICAqIHVwZGF0ZSB0aGVpciBzdGF0ZSBiYXNlZCBvbiBjaGFuZ2VzIGluIHRleHQgZm9ybWF0dGluZy4gVGhlIGVtaXR0ZWQgZXZlbnQgKGBDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWRgKVxyXG4gICAgKiBjYXJyaWVzIGZvcm1hdHRpbmcgc3RhdGUgZGF0YSwgd2hpY2ggY29tcG9uZW50cyBjYW4gdXNlIHRvIHN5bmNocm9uaXplIHRoZWlyIFVJIGVsZW1lbnRzIHdpdGggdGhlXHJcbiAgICAqIGN1cnJlbnQgdGV4dCBmb3JtYXR0aW5nIChlLmcuLCB1cGRhdGluZyBidXR0b24gc3RhdGVzLCBkaXNwbGF5aW5nIGFjdGl2ZSBmb3JtYXR0aW5nIG9wdGlvbnMpLlxyXG4gICAgKlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiBleGl0cyBlYXJseSB0byBhdm9pZCBwcm9jZXNzaW5nIHVubmVjZXNzYXJ5IGV2ZW50cyxcclxuICAgICogZXNwZWNpYWxseSB0byBtaXRpZ2F0ZSBpc3N1ZXMgaW4gYnJvd3NlcnMgbGlrZSBGaXJlZm94IHdoZXJlIGBzZWxlY3Rpb25jaGFuZ2VgIG1pZ2h0IGZpcmUgZHVyaW5nIHR5cGluZ1xyXG4gICAgKiB3aXRob3V0IGFuIGFjdHVhbCBjaGFuZ2UgaW4gc2VsZWN0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlIGFzIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gZW1pdCBldmVudHMgYmFzZWQgb24gdGhlIGZvcm1hdHRpbmcgc3RhdGUuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIGludm9rZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiBhIGNsYXNzIHRoYXQgaGFuZGxlcyB0ZXh0IGZvcm1hdHRpbmc6XHJcbiAgICAqIHRoaXMuZW1pdEZvcm1hdENoYW5nZUV2ZW50cygpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogSGVyZSdzIGhvdyB0aGUgZnVuY3Rpb24gd29ya3M6XHJcbiAgICAqIDEuIENoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uIElmIGVtcHR5LCByZXR1cm5zIGVhcmx5LlxyXG4gICAgKiAyLiBHYXRoZXJzIGN1cnJlbnQgc3RhdGUgb2YgdGV4dCBmb3JtYXR0aW5nIGNvbW1hbmRzIHN1Y2ggYXMgJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsIGFuZCAnc3RyaWtlVGhyb3VnaCcsXHJcbiAgICAqICAgIGFuZCBkeW5hbWljYWxseSBjb2xsZWN0cyB0aGUgc3RhdGUgb2YgdmFyaW91cyBoaWdobGlnaHQgY29sb3JzIHVzaW5nIGEgc2VydmljZS5cclxuICAgICogMy4gRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCAoYEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZGApIHdpdGggdGhlc2UgZm9ybWF0dGluZyBzdGF0ZXMuXHJcbiAgICAqICAgIENvbXBvbmVudHMgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24gbGlzdGVuIHRvIHRoaXMgZXZlbnQgYW5kIHVwZGF0ZSB0aGVpciBzdGF0ZXMgYWNjb3JkaW5nbHksXHJcbiAgICAqICAgIGVuc3VyaW5nIHRoYXQgVUkgY29udHJvbHMgbGlrZSB0b29sYmFyIGJ1dHRvbnMgcmVmbGVjdCB0aGUgY3VycmVudCBmb3JtYXR0aW5nIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKi9cclxuICAgIC8vIHN0YXRpYyBlbWl0Rm9ybWF0Q2hhbmdlRXZlbnQgPSAoXHJcblxyXG4gICAgLy8gICAgIGJvbGQ6IGJvb2xlYW4sXHJcbiAgICAvLyAgICAgaXRhbGljOiBib29sZWFuLFxyXG4gICAgLy8gICAgIHVuZGVybGluZTogYm9vbGVhbixcclxuICAgIC8vICAgICBzdHJpa2VUaHJvdWdoOiBib29sZWFuLFxyXG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ10gOiBib29sZWFuIH0sIFxyXG4gICAgLy8gICAgIGZvcmVDb2xvcjogeyBba2V5OiBzdHJpbmddIDogYm9vbGVhbn0pOiB2b2lkID0+IHtcclxuXHJcbiAgICAvLyAgICAgLy8gVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAvLyAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgIC8vICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgIC8vICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgLy8gICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbj8udG9TdHJpbmcoKS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbW1hbmRTdGF0ZXM6IElGb3JtYXRDb21tYW5kID0ge1xyXG4gICAgLy8gICAgICAgICBib2xkOiBib2xkLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGl0YWxpYyxcclxuICAgIC8vICAgICAgICAgdW5kZXJsaW5lOiB1bmRlcmxpbmUsXHJcbiAgICAvLyAgICAgICAgIHN0cmlrZVRocm91Z2g6IHN0cmlrZVRocm91Z2gsXHJcbiAgICAvLyAgICAgICAgIGhpbGl0ZUNvbG9yOiBoaWxpdGVDb2xvcixcclxuICAgIC8vICAgICAgICAgZm9yZUNvbG9yOiBmb3JlQ29sb3IsXHJcbiAgICAvLyAgICAgICAgIGNlbGxIaWxpdGVDb2xvcjoge31cclxuICAgIC8vICAgICB9O1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD4oQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCB7XHJcbiAgICAvLyAgICAgICAgIGRldGFpbDogY29tbWFuZFN0YXRlc1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudChzY29wZTogVGFibGVTY29wZXMsIGNvbG9yOiBDb2xvcnMpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuY2hhbmdlVGFibGVCb3JkZXJDb2xvcixcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb2xvcixcclxuICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgZW1pdENlbGxDaGFuZ2VFdmVudCA9IChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQgPT4ge1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjZWxsSGlsaXRlQ29sb3I6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcblxyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW5dID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JleV0gPSBUYWJsZVV0aWxzLmlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY29tbWFuZFN0YXRlczogSUZvcm1hdENvbW1hbmQgPSB7XHJcbiAgICAvLyAgICAgICAgIGJvbGQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICB1bmRlcmxpbmU6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBzdHJpa2VUaHJvdWdoOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgaGlsaXRlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBmb3JlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBjZWxsSGlsaXRlQ29sb3I6IGNlbGxIaWxpdGVDb2xvclxyXG4gICAgLy8gICAgIH07XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPihDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWQsIHtcclxuICAgIC8vICAgICAgICAgZGV0YWlsOiBjb21tYW5kU3RhdGVzXHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgLy8gfVxyXG5cclxufSIsImltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuL0Zsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tIFwiQC9jb21tb24vWkluZGV4XCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XHJcbmltcG9ydCB7IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcclxuaW1wb3J0IHsgS2V5Ym9hcmRLZXlzIH0gZnJvbSBcIkAvY29tbW9uL0tleWJvYXJkS2V5c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIGV4dGVuZHMgRmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgaW5pdGlhbFJlY3Q6IERPTVJlY3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGxvY2tlZEhpZGUgPSBmYWxzZTtcclxuICAgIGRlYm91bmNlVGltZXI6IGFueSA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgaWYgKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4LlZlcnlJbXBvcnRhbnQ7XHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UgPSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUZXh0T3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRleHRPcGVyYXRpb25zU2VydmljZVwiKTs7XHJcblxyXG4gICAgICAgIGlmICghVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2UgPSBuZXcgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIodGV4dE9wZXJhdGlvbnNTZXJ2aWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpIHtcclxuXHJcbiAgICAgICAgLy9UaGlzIGJsb2NrIGNoZWNrcyBmb3IgYW4gYWN0aXZlIHNlbGVjdGlvbiBhbmQgd2hldGhlciBpdCBjb250YWlucyBhbnkgY29udGVudC5cclxuICAgICAgICAvLyBJbiBGaXJlZm94LCB0aGUgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnQgbWF5IGJlIGZpcmVkIGV2ZW4gd2hpbGUgdHlwaW5nLFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIG5vdCB0aGUgaW50ZW5kZWQgdHJpZ2dlciBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gcmVhY3QgdG8gYWN0dWFsIGNoYW5nZXMgaW4gc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgb3IgbnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWFybHksIGVmZmVjdGl2ZWx5IGlnbm9yaW5nXHJcbiAgICAgICAgLy8gdGhlc2UgdW53YW50ZWQgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnRzIGR1cmluZyB0eXBpbmcuXHJcbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLmlzQ29sbGFwc2VkIHx8IHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0ubGVuZ3RoID09IDApIHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBjb25zdCB0eHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0eHQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIik7XHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaXNMaW5rOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ2NyZWF0ZUxpbmsnKTtcclxuICAgICAgICAgICAgY29uc3QgaXNCb2xkOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ2JvbGQnKTtcclxuICAgICAgICAgICAgY29uc3QgaXNJdGFsaWM6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSgnaXRhbGljJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVW5kZXJsaW5lOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ3VuZGVybGluZScpO1xyXG4gICAgICAgICAgICBjb25zdCBpc0lubGluZUNvZGU6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZShcImlubGluZUNvZGVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaWtlVGhyb3VnaDogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdHJpa2VUaHJvdWdoJyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoaWxpdGVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW5dID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbik7XHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSk7XHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yR3JleV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9yZUNvbG9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yUmVkXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JSZWQpO1xyXG4gICAgICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JHcmVlbl0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yWWVsbG93XSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JHcmV5XSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGhpbGl0ZUNvbG9ycykuZm9yRWFjaCgoW2NvbG9yLCBhY3RpdmVdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIGNvbG9yLCBcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZm9yZUNvbG9ycykuZm9yRWFjaCgoW2NvbG9yLCBhY3RpdmVdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImZvcmVDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNMaW5rLCBCdXR0b25JRHMuTGluayk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNCb2xkLCBCdXR0b25JRHMuQm9sZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNJdGFsaWMsIEJ1dHRvbklEcy5JdGFsaWMpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzSW5saW5lQ29kZSwgQnV0dG9uSURzLklubGluZUNvZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzVW5kZXJsaW5lLCBCdXR0b25JRHMuVW5kZXJsaW5lKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1N0cmlrZVRocm91Z2gsIEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoKTtcclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChhY3RpdmU6IGJvb2xlYW4sIHRhcmdldElkOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZCwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQodGFyZ2V0SWQsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc0FmdGVyQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBkZWJvdW5jZVRpbWVyOiBhbnk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2V1cCwgKGV2ZW50KSA9PiB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZXVwLCB0aGlzLnByb2Nlc3NBZnRlckNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CYmxDbGljaywgdGhpcy5wcm9jZXNzQWZ0ZXJDaGFuZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuU2VsZWN0aW9uQ2hhbmdlLCB0aGlzLnByb2Nlc3NBZnRlckNoYW5nZS5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLlNoaWZ0KSB7XHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93SGlkZShldmVudCwgaXNTZWxlY3RpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZG93biwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlKGV2ZW50LCBpc1NlbGVjdGluZyk7XHJcblxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcik7XHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIaWRlKGV2ZW50LCBpc1NlbGVjdGluZyk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLlNlbGVjdGlvbkNoYW5nZSwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGUoZXZlbnQsIGlzU2VsZWN0aW5nKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkVzY2FwZSkgJiYgIXRoaXMubG9ja2VkSGlkZSkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHN1cGVyLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZFVwZGF0ZVBvc2l0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50UmVjdCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsUmVjdCkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uQ2hhbmdlZCA9IE1hdGguYWJzKGN1cnJlbnRSZWN0LmxlZnQgLSB0aGlzLmluaXRpYWxSZWN0LmxlZnQpID4gMTAgfHwgTWF0aC5hYnMoY3VycmVudFJlY3QudG9wIC0gdGhpcy5pbml0aWFsUmVjdC50b3ApID4gMTA7XHJcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uQ2hhbmdlZDtcclxuICAgIH1cclxuXHJcbiAgICBzaG93SGlkZShldmVudDogRXZlbnQsIGlzU2VsZWN0aW5nOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIC8vVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG5cclxuICAgICAgICBjb25zdCBoYXNDb250ZW50ID0gdGhpcy5oYXNTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sb2NrZWRIaWRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxSZWN0ID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29udGVudCAmJiAhaXNTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlnbm9yZUZsb2F0aW5nVG9vbGJhciA9IERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLmlnbm9yZS10ZXh0LWZsb2F0aW5nLXRvb2xiYXJcIikgfHwgRE9NVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIuZ2lzdFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZ25vcmVGbG9hdGluZ1Rvb2xiYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZFVwZGF0ZVBvc2l0aW9uKCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZ25vcmVGbG9hdGluZ1Rvb2xiYXIgPSBET01VdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi5naXN0XCIpIHx8IERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLmdpc3RcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWdub3JlRmxvYXRpbmdUb29sYmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHJlY3RzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZWN0cyBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaXJzdFJlY3QgPSByZWN0c1swXTtcclxuXHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RMZWZ0ID0gZmlyc3RSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RUb3AgPSBmaXJzdFJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0Qm90dG9tID0gZmlyc3RSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSBjX2ZpcnN0UmVjdExlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdFRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gY19maXJzdFJlY3RCb3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoRE9NVXRpbHMuZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoXCJ0aXRsZVwiKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG9TZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLmhpZGVUdXJuSW50b0Ryb3Bkb3duSWZJbkNlbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzQ2VsbCA9IERPTVV0aWxzLmlzU2VsZWN0aW9uSW5UYWJsZUNlbGwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMuZm9yRWFjaChkcm9wZG93biA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5pZCA9PSBcInR1cm5JbnRvTWVudVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5kaXNwbGF5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9ycy5mb3JFYWNoKHNlcGFyYXRvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZXBhcmF0b3IuaWQgPT0gXCJ0dXJuSW50b1NlcGFyYXRvclwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJlY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRQb3NpdGlvbihyZWN0OiBET01SZWN0KSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcclxuXHJcbiAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2NrSGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2tlZEhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja0hpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2NrZWRIaWRlID0gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJbnB1dExpbmtCb3hXcmFwcGVyIH0gZnJvbSBcIi4vSW5wdXRMaW5rQm94V3JhcHBlclwiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwYXJlbnRXcmFwcGVyPzogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcih7fSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hJbnB1dFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnR5cGUgPSBcInVybFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBsYWNlaG9sZGVyID0gXCJQYXN0ZSBvciB0eXBlIGEgbGluay4uLlwiO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudFdyYXBwZXIocGFyZW50V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50V3JhcHBlciA9IHBhcmVudFdyYXBwZXI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveCB9IGZyb20gXCIuL0lucHV0TGlua0JveFwiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94V3JhcHBlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW5wdXRMaW5rQm94OiBJbnB1dExpbmtCb3g7XHJcbiAgICBoaWdobGlnaHRzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XHJcbiAgICBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cclxuICAgIHRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBjb25zdCBpbnB1dExpbmtCb3ggPSBuZXcgSW5wdXRMaW5rQm94KCk7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3g6IGlucHV0TGlua0JveCxcclxuICAgICAgICAgICAgYnV0dG9uOiBidXR0b25cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IFwibGlua0JveFwiO1xyXG4gICAgICAgIHRoaXMuaW5wdXRMaW5rQm94ID0gaW5wdXRMaW5rQm94O1xyXG4gICAgICAgIHRoaXMuYnV0dG9uID0gYnV0dG9uO1xyXG4gICAgICAgIGlucHV0TGlua0JveC5zZXRQYXJlbnRXcmFwcGVyKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyID0gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRlcGVuZGVudC1ib3hcIiwgXCJzb2Z0LWJveC1zaGFkb3dcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC5hZGQoXCJoZWFkZXJcIik7XHJcbiAgICAgICAgaGVhZGVyLmlubmVyVGV4dCA9IFwiTGlua1wiO1xyXG5cclxuICAgICAgICBjb25zdCBzaGVsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2hlbGwuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIHNoZWxsLmNsYXNzTGlzdC5hZGQoXCJsaW5rLWJveC1zaGVsbFwiKVxyXG5cclxuICAgICAgICAvLyBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnByb3BzLmJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5idXR0b24uaW5uZXJIVE1MID0gXCJJbnNlcnRcIjtcclxuXHJcbiAgICAgICAgc2hlbGwuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5idXR0b24pO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNoZWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuRXNjYXBlKSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIGN1cnNvciB3aGVuIHRoZSBDb250cm9sIGtleSBpcyBwcmVzc2VkIGFuZCB0aGUgbW91c2UgaG92ZXJzIG92ZXIgYSBsaW5rLlxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdjdHJsLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBjaGFuZ2UgdGhlIGN1cnNvciB3aGVuIHRoZSBDb250cm9sIGtleSBpcyBub3QgcHJlc3NlZCBhbmQgdGhlIG1vdXNlIGhvdmVycyBvdmVyIGEgbGluay5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXl1cCwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2N0cmwtYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNob3dJbnB1dExpbmtCb3hSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAvLyAgICAgLy8gdGhpcy5oaWdobGlnaHRTZWxlY3RlZFRleHQoKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pbnB1dExpbmtCb3guZm9jdXMoKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmsoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnQScgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHJlZiA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGhyZWYsICdfYmxhbmsnKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCcjbGlua0JveCcpICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIiN0ZXh0RmxvYXRpbmdUb29sYmFyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaW5zZXJ0TGluay5iaW5kKHRoaXMpLCB0cnVlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaGFuZGxlU2hvd0VsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPjtcclxuICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBpZiAoZGV0YWlscy50YXJnZXRJZCA9PSB0aGlzLmlkICYmICF0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZXRhaWxzLnRhcmdldElkID09IHRoaXMuaWQgJiYgdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbnNlcnRMaW5rKGV2ZW50OiBFdmVudCkge1xyXG5cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICBjb25zdCB1cmwgPSAodGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICAgICAgY29uc3QgdXJsV2l0aFByb3RvY29sID0gdXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSA/IHVybCA6IGBodHRwczovLyR7dXJsfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBVdGlscy5pc1ZhbGlkVXJsKHVybFdpdGhQcm90b2NvbCk7XHJcblxyXG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5saW5rUmVhZHlUb0luc2VydCxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdXJsV2l0aFByb3RvY29sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYigyNTMsIDIyMiwgMjIyKVwiO1xyXG4gICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2hha2UtYW5pbWF0aW9uXCIpO1xyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QucmVtb3ZlKFwic2hha2UtYW5pbWF0aW9uXCIpO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5sb2NrSGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBpZiAoIXJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9zaXRpb25MaW5rQ29tcG9uZW50QmVsb3dTZWxlY3Rpb24ocmFuZ2UpO1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0U2VsZWN0ZWRUZXh0KHJhbmdlKTtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zaXRpb25MaW5rQ29tcG9uZW50QmVsb3dTZWxlY3Rpb24ocmFuZ2U6IFJhbmdlKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZWN0cyBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaXJzdFJlY3QgPSByZWN0c1swXTtcclxuXHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RMZWZ0ID0gZmlyc3RSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RUb3AgPSBmaXJzdFJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0Qm90dG9tID0gZmlyc3RSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSBjX2ZpcnN0UmVjdExlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdFRvcCArIHdpbmRvdy5zY3JvbGxZICsgNDA7XHJcblxyXG4gICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdEJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLnVubG9ja0hpZGUoKTtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRzKCk7XHJcbiAgICAgICAgKHRoaXMuaW5wdXRMaW5rQm94Lmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gXCJcIjtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmN1cnJlbnRTZWxlY3Rpb25SYW5nZTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRTZWxlY3RlZFRleHQocmFuZ2U6IFJhbmdlKSB7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IGAke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNjMmMyYzInO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUub3BhY2l0eSA9ICcwLjMnO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodHMucHVzaChoaWdobGlnaHQpO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMCwgMTIwLCAyMTUsIDAuMyknO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuXHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWX1weGA7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIaWdobGlnaHRzKCkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5mb3JFYWNoKGhpZ2hsaWdodCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaGlnaGxpZ2h0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodHMgPSBbXTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSBcIi4uL2NvbnRlbnQvQ29udGVudFwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCIuLi90aXRsZS9UaXRsZVwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWRkQmxvY2tXcmFwcGVyIH0gZnJvbSBcIi4uL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiLi4vbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlclwiO1xyXG5pbXBvcnQgeyBJbnB1dExpbmtCb3hXcmFwcGVyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94V3JhcHBlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRvciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBlZGl0b3JJZDogc3RyaW5nID0gXCJqb2hhbm5lc0VkaXRvclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVkaXRvcjtcclxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XHJcblxyXG4gICAgcHJpdmF0ZSB0aXRsZT86IFRpdGxlO1xyXG4gICAgcHJpdmF0ZSBjb250ZW50PzogQ29udGVudDtcclxuICAgIHByaXZhdGUgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcjtcclxuICAgIHByaXZhdGUgdGV4dEZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHF1aWNrTWVudTogUXVpY2tNZW51O1xyXG4gICAgcHJpdmF0ZSB0YWJsZUNvbnRleHRUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXI7XHJcbiAgICBwcml2YXRlIGlucHV0TGlua0JveFdyYXBwZXI6IElucHV0TGlua0JveFdyYXBwZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgbWVtZW50bzogSU1lbWVudG8sXHJcbiAgICAgICAgdGl0bGU6IFRpdGxlLFxyXG4gICAgICAgIGNvbnRlbnQ6IENvbnRlbnQsXHJcbiAgICAgICAgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcixcclxuICAgICAgICBmbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51LFxyXG4gICAgICAgIHRhYmxlVG9vbGJhcjogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXIsXHJcbiAgICAgICAgaW5wdXRMaW5rQm94V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlclxyXG4gICAgKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBlbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgICAgIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcclxuICAgICAgICAgICAgYWRkQmxvY2s6IGFkZEJsb2NrLFxyXG4gICAgICAgICAgICBmbG9hdGluZ1Rvb2xiYXI6IGZsb2F0aW5nVG9vbGJhcixcclxuICAgICAgICAgICAgcXVpY2tNZW51OiBxdWlja01lbnUsXHJcbiAgICAgICAgICAgIHRhYmxlVG9vbGJhcjogdGFibGVUb29sYmFyLFxyXG4gICAgICAgICAgICBtZWRpYUlucHV0dGVyOiBtZWRpYUlucHV0dGVyLFxyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBpbnB1dExpbmtCb3hXcmFwcGVyXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChFZGl0b3IuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dExpbmtCb3hXcmFwcGVyID0gaW5wdXRMaW5rQm94V3JhcHBlcjtcclxuICAgICAgICB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZSA9IGVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xyXG4gICAgICAgIHRoaXMuYWRkQmxvY2sgPSBhZGRCbG9jaztcclxuICAgICAgICB0aGlzLnRleHRGbG9hdGluZ1Rvb2xiYXIgPSBmbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICAgICAgdGhpcy5xdWlja01lbnUgPSBxdWlja01lbnU7XHJcbiAgICAgICAgdGhpcy50YWJsZUNvbnRleHRUb29sYmFyID0gdGFibGVUb29sYmFyO1xyXG4gICAgICAgIHRoaXMubWVkaWFJbnB1dHRlciA9IG1lZGlhSW5wdXR0ZXI7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1lZGl0b3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBjb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY29udGVudC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uZW5hYmxlVGl0bGUgfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb250ZW50V3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENvbnRlbnQgaXMgcmVxdWlyZWRcclxuICAgICAgICBjb250ZW50V3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmNvbnRlbnQuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50V3JhcHBlcik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVBZGRCbG9jayB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYWRkQmxvY2suaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUZsb2F0aW5nVG9vbGJhciB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuZmxvYXRpbmdUb29sYmFyLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVRdWlja01lbnUgfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnF1aWNrTWVudS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRhYmxlVG9vbGJhci5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5tZWRpYUlucHV0dGVyLmh0bWxFbGVtZW50KTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmlucHV0TGlua0JveFdyYXBwZXIuaHRtbEVsZW1lbnQpXHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoXHJcbiAgICAgICAgdGl0bGU6IFRpdGxlLFxyXG4gICAgICAgIGNvbnRlbnQ6IENvbnRlbnQsXHJcbiAgICAgICAgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcixcclxuICAgICAgICB0ZXh0RmxvYXRpbmdUb29sYmFyOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcixcclxuICAgICAgICBxdWlja01lbnU6IFF1aWNrTWVudSxcclxuICAgICAgICB0YWJsZUZsb2F0aW5nVG9vbGJhcjogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXIpIHtcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElFbGVtZW50RmFjdG9yeVNlcnZpY2U+KFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiKTtcclxuICAgICAgICBjb25zdCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlPihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IG1lbWVudG8gPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SU1lbWVudG8+KFwiSU1lbWVudG9cIik7XHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94V3JhcHBlciA9IG5ldyBJbnB1dExpbmtCb3hXcmFwcGVyKCk7XHJcblxyXG4gICAgICAgIGlmICghRWRpdG9yLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IG5ldyBFZGl0b3IoZWxlbWVudEZhY3RvcnlTZXJ2aWNlLCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBtZW1lbnRvLCB0aXRsZSwgY29udGVudCwgYWRkQmxvY2ssIHRleHRGbG9hdGluZ1Rvb2xiYXIsIHF1aWNrTWVudSwgdGFibGVGbG9hdGluZ1Rvb2xiYXIsIG1lZGlhSW5wdXR0ZXIsIGlucHV0TGlua0JveFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEVkaXRvci5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVkaXRvci5lZGl0b3JJZCk7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lcj8uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0YXJnZXQgYXMgTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmREcmFnSGFuZGxlcihibG9ja0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnQgdGFyZ2V0IGlzIG5vdCBhbiBIVE1MRWxlbWVudCBhbmQgY2Fubm90IGhhbmRsZSBIVE1MRWxlbWVudCBzcGVjaWZpYyBtZXRob2RzOicsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnQgdGFyZ2V0IGlzIG5vdCBhIE5vZGU6JywgdGFyZ2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvL0ZvY3VzIG9uIHRoZSBmaXJzdCBwYXJhZ3JhcGhcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgPiAuY29udGVudCAuYmxvY2sgcFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdFBhcmFncmFwaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0UGFyYWdyYXBoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFyYWdyYXBoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciA+IC5jb250ZW50IC5ibG9jayBwXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0UGFyYWdyYXBoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZnVuY3Rpb24gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsaXBib2FyZERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEVkaXRvci5pbnNlcnRUZXh0QXRDdXJzb3IodGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0cnVlKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRHJhZ0hhbmRsZXIoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGluc2VydFRleHRBdEN1cnNvcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgaWYgKHNlbC5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGV4dE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIodGV4dE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmREcmFnSGFuZGxlcihlbGVtZW50OiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGFuIEhUTUxFbGVtZW50OicsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG4gICAgICAgIGxldCBkcmFnSGFuZGxlciA9IHBhcmVudD8ucXVlcnlTZWxlY3RvcihcIi5kcmFnLWhhbmRsZXJcIik7XHJcblxyXG4gICAgICAgIGlmICghZHJhZ0hhbmRsZXIgJiYgcGFyZW50KSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVyID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkRSQUdfSEFORExFX0JVVFRPTik7XHJcbiAgICAgICAgICAgIHBhcmVudC5wcmVwZW5kKGRyYWdIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRHJhZ0hhbmRsZXIoZWxlbWVudDogTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm92aWRlZCBlbGVtZW50IGlzIG5vdCBhbiBIVE1MRWxlbWVudDonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyYWdIYW5kbGVyID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZHJhZy1oYW5kbGVyXCIpO1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RDb250ZW50KCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCBFeGNlcHRpb25cIik7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBhdHRhY2hEcmFnSGFuZGxlcigpIHtcclxuICAgICAgICBsZXQgZHJhZ2dlZEl0ZW06IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBkcm9wTGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyb3BMaW5lLmNsYXNzTGlzdC5hZGQoJ2Ryb3AtbGluZScpO1xyXG4gICAgICAgIGRyb3BMaW5lLnN0eWxlLmhlaWdodCA9ICcycHgnO1xyXG4gICAgICAgIGRyb3BMaW5lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkcmFnLWhhbmRsZXInKSkge1xyXG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0gPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnN0eWxlLm9wYWNpdHkgPSAnMC41JztcclxuICAgICAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zdHlsZS5vcGFjaXR5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkcm9wTGluZS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IChldmVudC50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGRyYWdnZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYm91bmRpbmcgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gYm91bmRpbmcueSArIGJvdW5kaW5nLmhlaWdodCAvIDI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChldmVudCBhcyBNb3VzZUV2ZW50KS5jbGllbnRZID4gb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcgIT09IGRyb3BMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZHJvcExpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICE9PSBkcm9wTGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGRyb3BMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRyb3BMaW5lLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgaWYgKGRyYWdnZWRJdGVtICYmIGRyb3BMaW5lICYmIGRyb3BMaW5lLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGRyb3BMaW5lLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGRyYWdnZWRJdGVtLCBkcm9wTGluZSk7XHJcbiAgICAgICAgICAgICAgICBkcm9wTGluZS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkZEJsb2NrQnV0dG9uIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uOiBTVkdJY29uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBpY29uOiBTVkdJY29uKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWNvbjogaWNvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRpdGxlID0gXCJBZGQgYSBuZXcgYmxvY2tcIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImFkZC1ibG9ja1wiLCBcImJsb2NrLW9wZXJhdGlvblwiLCBcInBvaW50ZXJcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaWNvbi5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETzogVXNlIGNvbW1hbmQgZGlzcGF0Y2hlclxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrLCBmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNyZWF0ZShpY29uOiBTVkdJY29uKTogQWRkQmxvY2tCdXR0b24ge1xyXG5cclxuICAgICAgICBjb25zdCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlPihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEFkZEJsb2NrQnV0dG9uKGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsIGljb24pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiLi9BZGRCbG9ja0J1dHRvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkZEJsb2NrV3JhcHBlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBidXR0b246IEFkZEJsb2NrQnV0dG9uO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoYnV0dG9uOiBBZGRCbG9ja0J1dHRvbikge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGJ1dHRvbjogYnV0dG9uXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYnV0dG9uID0gYnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhZGQtYmxvY2std3JhcHBlclwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5idXR0b24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNyZWF0ZShidXR0b246IEFkZEJsb2NrQnV0dG9uKTogQWRkQmxvY2tXcmFwcGVyIHtcclxuICAgICAgICByZXR1cm4gbmV3IEFkZEJsb2NrV3JhcHBlcihidXR0b24pO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNpemVzIHtcclxuICAgIFxyXG4gICAgc3RhdGljIG1lZGl1bTogc3RyaW5nID0gXCIxcmVtXCI7XHJcbiAgICBzdGF0aWMgbGFyZ2U6IHN0cmluZyA9IFwiMS4yNXJlbVwiO1xyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU1ZHSWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgdXNlRWxlbWVudDogU1ZHVXNlRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpY29uSWQ6IHN0cmluZywgc2l6ZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWQsXHJcbiAgICAgICAgICAgIHNpemU6IHNpemVcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLnVzZUVsZW1lbnQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VzZScpIGFzIFNWR1VzZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWQgIWltcG9ydGFudFwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaWNvbklkfWApO1xyXG5cclxuICAgICAgICB1c2Uuc3R5bGUuY29sb3IgPSBcInJlZCAhaW1wb3J0YW50XCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHVzZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMucHJvcHMuc2l6ZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLnByb3BzLnNpemUpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogU1ZHSWNvbiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCB0aGlzLnByb3BzLnNpemVzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VUbyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3ZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbihpY29uSWQsIHNpemUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvblwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuXHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWRkQmxvY2tCdWlsZGVyIHtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBidWlsZCgpOiBBZGRCbG9ja1dyYXBwZXIge1xyXG4gICAgICAgIHJldHVybiBBZGRCbG9ja1dyYXBwZXIuY3JlYXRlKEFkZEJsb2NrQnV0dG9uLmNyZWF0ZShTVkdJY29uLmNyZWF0ZShJY29ucy5QbHVzLCBTaXplcy5tZWRpdW0pKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICBkcm9wZG93bkJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uO1xyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uLCBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3QpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuXHJcblxyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRUbyh0aGlzKTtcclxuICAgICAgICBkcm9wZG93bkxpc3QuYXBwZW5kVG8odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNlbGVjdC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUocHJlZml4SWQ6IHN0cmluZywgYnV0dG9uOiBEcm9wZG93bk1lbnVCdXR0b24sIGxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnUge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyb3Bkb3duTWVudShwcmVmaXhJZCArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgYnV0dG9uLCBsaXN0KTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3RJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSWNvbj86IFNWR0ljb247XHJcbiAgICBwcml2YXRlIGxlZnRJY29uPzogU1ZHRWxlbWVudCB8IEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzRnVuY3Rpb25MaXN0OiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBvbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdDogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuXHJcbiAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdCxcclxuICAgICAgICBjb21tYW5kOiBzdHJpbmcsXHJcbiAgICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgbGVmdEljb246IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCB8IG51bGwsXHJcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICBzaG9ydGN1dDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gW1wibGlzdC1pdGVtXCIsIFwib3B0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIsIFwiYmxvY2stb3BlcmF0aW9uXCIsIFwibm8tbGlzdC1zdHlsZVwiLCBcIm5vLXNlbGVjdGlvblwiXTtcclxuXHJcbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1zbWFsbC1jaGVja1wiLCBTaXplcy5tZWRpdW0pO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiBsZWZ0SWNvbikge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxyXG4gICAgICAgICAgICBsZWZ0SWNvbjogbGVmdEljb24sXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgc2hvcnRjdXQ6IHNob3J0Y3V0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IGNsYXNzTGlzdDtcclxuICAgICAgICB0aGlzLmxlZnRJY29uID0gbGVmdEljb247XHJcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJY29uID0gaWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaChmdW5jKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBhZGRDbGFzcyhjbGFzc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QucHVzaChjbGFzc0tleSk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkZvY3VzPFQgZXh0ZW5kcyBhbnlbXT4oZnVuYzogKC4uLmFyZ3M6IFQpID0+IHZvaWQsIC4uLmFyZ3M6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaCgoKSA9PiBmdW5jKC4uLmFyZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkxvc2VGb2N1czxUIGV4dGVuZHMgYW55W10+KGZ1bmM6ICguLi5hcmdzOiBUKSA9PiB2b2lkLCAuLi5hcmdzOiBUKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKCgpID0+IGZ1bmMoLi4uYXJncykpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICAgICAgdGhpcy5vbkZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMucHJvcHMuY2xhc3NMaXN0IGFzIHN0cmluZ1tdO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJwb2ludGVyXCIsIC4uLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5sZWZ0SWNvbikge1xyXG4gICAgICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHNwYW4pO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0T3B0aW9uKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmljb24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG9ydGN1dCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG9ydEN1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5pbm5lclRleHQgPSB0aGlzLnByb3BzLnNob3J0Y3V0O1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjUpXCJcclxuXHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNob3J0Q3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAoIERPTVV0aWxzLmdldFBhcmVudEZyb21TZWxlY3Rpb24oXCIuYmxvY2tcIikgfHwgRE9NVXRpbHMuZ2V0UGFyZW50VGFyZ2V0QnlTZWxlY3RvcihldmVudCBhcyBNb3VzZUV2ZW50LCBcIi5ibG9ja1wiKSApIGFzIEhUTUxIdG1sRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAvLyAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmIChjb250YWluZXI/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGZvY3VzYWJsZVBhcmVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGZvY3VzYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIGFzeW5jICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiA9IHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5kcm9wZG93bkl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93bk1lbnVMaXN0LnN3aXRjaFZpc3VhbEZvY3VzKG5vZGUhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdoaWxpdGVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgYmFja2dyb3VuZCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5oaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmZvcmVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmNlbGxIaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy50YWJsZUNlbGxDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb2xvciB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgJ2NvcmVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgY29sb3IuXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmIChzdGF0ZXMuY2VsbEhpbGl0ZUNvbG9yW3RoaXMudmFsdWVdKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB7IGNvbW1hbmQsIHNob3dVSSwgdmFsdWUsIHRhcmdldEJsb2NrVHlwZSB9ID0gZXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUNoZWNrSWNvblZpc2liaWxpdHkoKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29sb3JDaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiB8fFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwgdGhpcy5oYW5kbGVDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZUV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0Q2xhc3MgJiYgZGV0YWlscy50YXJnZXRDbGFzcy5pbmNsdWRlcyhcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiKSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRWYWx1ZXMgPSAoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoYCMke2V2ZW50VmFsdWVzLmJsb2NrSWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSA9PSBldmVudFZhbHVlcy5sYW5ndWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGxldCBjaGlsZCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGNoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2hpbGQubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChuZXh0U2libGluZyAmJiB0aGlzLnNob3VsZE1lcmdlKGNoaWxkLCBuZXh0U2libGluZykpIHtcclxuICAgIC8vICAgICAgICAgICAgIChjaGlsZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MICs9IChuZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0O1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgZWxlbWVudC5ub3JtYWxpemUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzaG91bGRNZXJnZShub2RlMTogQ2hpbGROb2RlLCBub2RlMjogQ2hpbGROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUxPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZTI/Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IGVsZW0xID0gbm9kZTEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgY29uc3QgZWxlbTIgPSBub2RlMiBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICByZXR1cm4gZWxlbTEudGFnTmFtZSA9PT0gZWxlbTIudGFnTmFtZSAmJlxyXG4gICAgLy8gICAgICAgICBlbGVtMS5zdHlsZS5jc3NUZXh0ID09PSBlbGVtMi5zdHlsZS5jc3NUZXh0ICYmXHJcbiAgICAvLyAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0xKS5jb2xvciA9PT0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbTIpLmNvbG9yO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBhc3luYyBjaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYXdhaXQgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcXVlcnkgY29tbWFuZCBzdGF0ZTpcIiwgZXJyb3IpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93SGlkZUFjdGl2ZUJ1dHRvbiwgdGhpcy5oYW5kbGVTaG93SGlkZUFjdGl2ZUJ1dHRvbkV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB0aGlzLmhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0Py5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzISkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKCEoZGV0YWlscy5hY3Rpb24gaW5zdGFuY2VvZiBTaG93SGlkZUFjdGl2ZUJ1dHRvbikpe1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudFZhbHVlcyA9IChkZXRhaWxzLmFjdGlvbiBhcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29sb3IgPSBldmVudFZhbHVlcy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09IGV2ZW50Q29sb3IudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VmFsdWVzLmludGVudGlvbiA9PSBcInNob3dcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50KGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdD8uaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcyEpKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZighKGRldGFpbHMuYWN0aW9uIGluc3RhbmNlb2YgUmVzZXRBY3RpdmVCdXR0b25zKSl7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRMZWZ0SWNvbkNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgIC8vIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3QgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/OiBEcm9wZG93bk1lbnVCdXR0b247XHJcblxyXG4gICAgZHJvcGRvd25JdGVtczogQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PElEcm9wZG93bk1lbnVJdGVtPjtcclxuICAgIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcbiAgICBmaWx0ZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gbmV3IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxEcm9wZG93bk1lbnVMaXN0SXRlbT4oKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQ6IEhUTUxVTGlzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnYmxvY2stdHlwZScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc29mdC1ib3gtc2hhZG93JywgJ2RlcGVuZGVudC1ib3gnLCAnY2hlY2thYmxlLWl0ZW1zJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gXCIyNXZtYXhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguRXh0cmVtZWx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLy8gU2V0IGB0cnVlYCB0byBjYXB0dXJlIHRoZSBldmVudCBkdXJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBwaGFzZSwgZ2l2aW5nIHRoaXMgZnVuY3Rpb24gcHJpb3JpdHkgb3ZlciBvdGhlcnMuXHJcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgZXZlbnQgZnJvbSBiZWluZyBoYW5kbGVkIGJ5IGVhcmxpZXIgYENvbnRlbnRgIGNvbXBvbmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmVtaXRDb21tYW5kRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd0Rvd25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBGbG9hdGluZ1Rvb2xiYXIgd2l0aCBhIERyb3Bkb3duTGlzdCwgdGhpcyBoYW5kbGVyIHNob3VsZCBiZSBpZ25vcmVkIGZvciBzbW9vdGhlciBVSSBjb250cm9sLiBcclxuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBjb21wb25lbnRzIGxpa2UgQmxvY2tUb29sYm94LCB3aGVyZSB0aGVyZSdzIG5vIHJpc2sgb2YgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmluZyBhZnRlciBwcmVzc2luZyBFc2NhcGUgKGlmIHRoZSBjdXJzb3IgaXMgd2l0aGluIHRoZSBibG9jayksXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXIgaXMgdXNlZCB0byBjbG9zZSB0aGUgZHJvcGRvd24gbGlzdCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgRXNjYXBlLlxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRXNjYXBlICYmICF0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoXCIuZmxvYXRpbmctdG9vbGJhclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVyS2V5RG93bkV2ZW50LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja0Nsb25lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZXJLZXlEb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgL15bYS16QS1aXSQvLnRlc3QoZXZlbnQua2V5KSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciArPSBldmVudC5rZXk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkJhY2tzcGFjZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcigpIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJcIiB8fCBpdGVtLnZhbHVlPy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHx8IGl0ZW0udGl0bGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXIudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlciA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IFwiMFwiO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcImF1dG9cIjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbikge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcImF1dG9cIjtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5yaWdodCA9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLXVwXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi1kb3duXCIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbT8udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hWaXN1YWxGb2N1cyhpdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnJlbW92ZUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBpdGVtO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBuZXh0VmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldE5leHRTYXRpc2Z5aW5nKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSAmJiBpdGVtLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xyXG4gICAgICAgIG5leHRWaXNpYmxlSXRlbT8udmFsdWUuZW5zdXJlVmlzaWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtICYmIGl0ZW0uaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtPy52YWx1ZS5lbnN1cmVWaXNpYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgICAgICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uaHRtbEVsZW1lbnQuaWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgLy8mJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/Lmh0bWxFbGVtZW50LmlkfWApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHByZWZpeElkOiBzdHJpbmcsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnVMaXN0IHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KHByZWZpeElkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpKTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtpZDogaWR9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiMjRweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSaWdodCA9IFwiMXB4IHNvbGlkICNkMGQwZDBcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW4gPSBcImF1dG8gNnB4XCI7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXAgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaXRlbVwiKTtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gXCIxMHB4XCI7XHJcbiAgICAgICAgLy8gaHRtbEVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjEwcHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL1NWR0ljb25cIjtcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXBJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd1VJOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgaWNvbjogU1ZHSWNvbikge1xuXG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5zaG93VUkgPSBjb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUxpbms7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG5cbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImVudHJ5XCIsIFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLW9wZXJhdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiKTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlO1xuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIGFzeW5jIChldmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBzaG93VUk6IHRoaXMuc2hvd1VJLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+O1xuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZiAoc3RhdGVzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pZCA9PSBkZXRhaWxzLnRhcmdldElkKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoKGRldGFpbHMuYWN0aW9uIGFzIENoYW5nZUNvbG9yKS5jb2xvcilcblxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXRhaWxzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgIC8vICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZih0aGlzLmlkID09IGRldGFpbHMudGFyZ2V0SWQpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcigoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQ29sb3IpLmNvbG9yKVxuXG4gICAgICAgIC8vICAgICAgICAgLy8gaWYgKGRldGFpbHNbdGhpcy5jb21tYW5kIGFzIGtleW9mIElGb3JtYXRDb21tYW5kXSkge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGljb246IFNWR0ljb24pOiBCdXR0b25Hcm91cEl0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwSXRlbShjb21tYW5kLCB0aXRsZSwgaWNvbik7XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9ySWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjUwJVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMucHJvcHMuY29sb3I7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBJRHJvcGRvd25NZW51SXRlbSB9IGZyb20gXCIuL0lEcm9wZG93bk1lbnVJdGVtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcblxyXG4gICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LCB0aXRsZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBhY3RpdmVJY29uPzogU1ZHSWNvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IFwiXCI7XHJcbiAgICBcclxuICAgIGNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZ2V0TGVmdEljb25CYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRBY3RpdmVJY29uKCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXR0YWNoT25Mb3NlRm9jdXMoZnVuYzogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm5vLWxpc3Qtc3R5bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcclxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIHRpdGxlLmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMsIENvbG9yc05hbWVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvQmxvY2tUb29sYm94XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW0gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUJ1dHRvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0SXRlbSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSXRlbUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25JdGVtSURzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQmxvY2tUb29sYm94QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGFsaWduVG9vbCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5TGVmdCwgXCJMZWZ0XCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkp1c3RpZnlTdGFydCwgU2l6ZXMubGFyZ2UpKS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5Q2VudGVyLCBcIkNlbnRlclwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5Q2VudGVyLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLkp1c3RpZnlSaWdodCwgXCJSaWdodFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5RW5kLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvclRvb2woKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcImNvbG9ySW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JJbnRlcmFjdGl2ZUJ1dHRvblwiICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBuZXcgQ29sb3JJY29uKFwid2hpdGVcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb2xvckJ1dHRvbi5hZGRDc3NDbGFzcyhcImNvbG9yLWludGVyYWN0aXZlLWJ1dHRvblwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJjb2xvckludGVyYWN0aW9uT3B0aW9uc01lbnVcIiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JCdXR0b24sIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKGNvbG9yRHJvcGRvd25MaXN0LCBcIkJhY2tncm91bmRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JSZWQgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25SZWQgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy5jaGFuZ2VDYWxsb3V0QmFja2dyb3VuZENvbG9yLCBDb2xvcnNOYW1lcy5DYWxsb3V0QmFja2dyb3VuZFJlZCwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JSZWQuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZWVuICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRHcmVlbiwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbikuaHRtbEVsZW1lbnQsIFwiR3JlZW5cIik7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yR3JlZW4uYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uQmx1ZSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvckJsdWUuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JZZWxsb3cgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25ZZWxsb3cgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy5jaGFuZ2VDYWxsb3V0QmFja2dyb3VuZENvbG9yLCBDb2xvcnNOYW1lcy5DYWxsb3V0QmFja2dyb3VuZFllbGxvdywgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JleSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kR3JleSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KS5odG1sRWxlbWVudCwgXCJHcmV5XCIpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvckdyZXkuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uTm9uZSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvck5vbmUuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChiYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGJhY2tncm91bmRDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbGFuZ3VhZ2VTZWxlY3Rpb25Ub29sKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IERyb3Bkb3duTWVudUxpc3QuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZU9wdGlvblNlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZUJ1dHRvblwiLCBcIlBsYWluIFRleHRcIiwgc2VsZWN0LCB0cnVlLCBbXCJjb2RlLWJsb2NrLWxhbmd1YWdlLW1lbnVcIiwgXCJjb2xvci1pbnRlcmFjdGl2ZS1idXR0b25cIl0pO1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBEcm9wZG93bk1lbnUuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGlvbk9wdGlvbnNNZW51XCIsIGJ1dHRvbiwgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgc2VsZWN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShzZWxlY3QsIFwiTGFuZ3VhZ2VcIikpO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhCbG9ja1Rvb2xib3gubGFuZ3VhZ2VNYXApLnNvcnQoKGEsIGIpID0+IGFbMV0ubG9jYWxlQ29tcGFyZShiWzFdKSkuZm9yRWFjaCgoW2NvZGUsIG5hbWVdKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJsYW5ndWFnZVNlbGVjdGlvbkl0ZW0tXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIHNlbGVjdCwgQ29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UsIGNvZGUsIG51bGwsIG5hbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJwbGFpbnRleHRcIikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZChpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGV4dHJhT3B0aW9ucygpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ID0gRHJvcGRvd25NZW51TGlzdC5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiwgW1wibWVkaWEtbW9yZS1vcHRpb24tc2VsZWN0XCJdKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibW9yZUludGVyYWN0aXZlT3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIGxpc3QsIGZhbHNlLCBbXCJtb3JlTWVkaWFPcHRpb25zQnV0dG9uXCJdKTtcclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IERyb3Bkb3duTWVudS5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25zTWVudVwiLCBidXR0b24sIGxpc3QpO1xyXG5cclxuICAgICAgICBsaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShsaXN0LCBcIk1vcmUgb3B0aW9uc1wiKSk7XHJcbiAgICAgICAgbGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZHVwbGljYXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5EdXBsaWNhdGUsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJDbG9uZVwiLCBcIkN0cmwrRFwiKSk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmRlbGV0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5UcmFzaCwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbGlzdC5hcHBlbmQoZGVsZXRlSXRlbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElCbG9ja1Rvb2xib3ggfSBmcm9tIFwiLi9JQmxvY2tUb29sYm94XCI7XG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XG5pbXBvcnQgeyBUb29sYm94T3B0aW9ucyB9IGZyb20gXCIuL1Rvb2xib3hPcHRpb25zXCI7XG5pbXBvcnQgeyBCbG9ja1Rvb2xib3hCdWlsZGVyIH0gZnJvbSBcIkAvYnVpbGRlcnMvQmxvY2tUb29sYm94QnVpbGRlclwiO1xuaW1wb3J0IHsgRE9NRWxlbWVudHMgfSBmcm9tIFwiQC9jb21tb24vRE9NRWxlbWVudHNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja1Rvb2xib3ggaW1wbGVtZW50cyBJQmxvY2tUb29sYm94IHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja1Rvb2xib3g7XG5cbiAgICBzdGF0aWMgbGFuZ3VhZ2VNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIC8vIFwiMWNcIjogXCIxQ1wiLFxuICAgICAgICAvLyBcImFibmZcIjogXCJBQk5GXCIsIFxuICAgICAgICAvLyBcImFjY2Vzc2xvZ1wiOiBcIkFjY2VzcyBMb2dzXCIsIFxuICAgICAgICAvLyBcImFjdGlvbnNjcmlwdFwiOiBcIkFjdGlvblNjcmlwdFwiLCBcbiAgICAgICAgXCJhZGFcIjogXCJBZGFcIixcbiAgICAgICAgLy9cImFuZ2Vsc2NyaXB0XCI6IFwiQW5nZWxTY3JpcHRcIiwgXG4gICAgICAgIFwiYXBhY2hlXCI6IFwiQXBhY2hlIENvbmZpZ1wiLFxuICAgICAgICBcImFwcGxlc2NyaXB0XCI6IFwiQXBwbGVTY3JpcHRcIixcbiAgICAgICAgXCJhcmR1aW5vXCI6IFwiQXJkdWlub1wiLFxuICAgICAgICAvLyBcImFybWFzbVwiOiBcIkFSTSBBc3NlbWJseVwiLCBcbiAgICAgICAgXCJhc2NpaWRvY1wiOiBcIkFzY2lpRG9jXCIsXG4gICAgICAgIC8vIFwiYXNtXCI6IFwiQXNzZW1ibHlcIiwgXG4gICAgICAgIC8vIFwiYXV0b2hvdGtleVwiOiBcIkF1dG9Ib3RrZXlcIiwgXG4gICAgICAgIC8vIFwiYXV0b2l0XCI6IFwiQXV0b0l0XCIsIFxuICAgICAgICBcImJhc2hcIjogXCJCYXNoXCIsXG4gICAgICAgIFwiYmFzaWNcIjogXCJCQVNJQ1wiLFxuICAgICAgICBcImNcIjogXCJDXCIsXG4gICAgICAgIFwiY3NoYXJwXCI6IFwiQyNcIixcbiAgICAgICAgXCJjcHBcIjogXCJDKytcIixcbiAgICAgICAgXCJjc3NcIjogXCJDU1NcIixcbiAgICAgICAgLy8gXCJjbG9qdXJlXCI6IFwiQ2xvanVyZVwiLCBcbiAgICAgICAgXCJjb2ZmZWVzY3JpcHRcIjogXCJDb2ZmZWVTY3JpcHRcIixcbiAgICAgICAgLy8gXCJkXCI6IFwiRFwiLCBcbiAgICAgICAgXCJkYXJ0XCI6IFwiRGFydFwiLFxuICAgICAgICAvLyBcImRlbHBoaVwiOiBcIkRlbHBoaVwiLCBcbiAgICAgICAgLy8gXCJlbGl4aXJcIjogXCJFbGl4aXJcIiwgXG4gICAgICAgIC8vIFwiZWxtXCI6IFwiRWxtXCIsIFxuICAgICAgICAvLyBcImVybGFuZ1wiOiBcIkVybGFuZ1wiLCBcbiAgICAgICAgLy8gXCJmc2hhcnBcIjogXCJGI1wiLCBcbiAgICAgICAgLy8gXCJmb3J0cmFuXCI6IFwiRm9ydHJhblwiLCBcbiAgICAgICAgXCJnb1wiOiBcIkdvXCIsXG4gICAgICAgIC8vIFwiZ3Jvb3Z5XCI6IFwiR3Jvb3Z5XCIsIFxuICAgICAgICAvLyBcImhhc2tlbGxcIjogXCJIYXNrZWxsXCIsIFxuICAgICAgICBcImh0bWxcIjogXCJIVE1MXCIsXG4gICAgICAgIFwiamF2YVwiOiBcIkphdmFcIixcbiAgICAgICAgXCJqYXZhc2NyaXB0XCI6IFwiSmF2YVNjcmlwdFwiLFxuICAgICAgICBcImpzb25cIjogXCJKU09OXCIsXG4gICAgICAgIC8vIFwianVsaWFcIjogXCJKdWxpYVwiLCBcbiAgICAgICAgLy8gXCJrb3RsaW5cIjogXCJLb3RsaW5cIiwgXG4gICAgICAgIC8vIFwibGF0ZXhcIjogXCJMYVRlWFwiLCBcbiAgICAgICAgLy8gXCJsaXNwXCI6IFwiTGlzcFwiLCBcbiAgICAgICAgLy8gXCJsdWFcIjogXCJMdWFcIiwgXG4gICAgICAgIFwibWFya2Rvd25cIjogXCJNYXJrZG93blwiLFxuICAgICAgICAvLyBcIm1hdGxhYlwiOiBcIk1BVExBQlwiLCBcbiAgICAgICAgLy8gXCJvYmplY3RpdmUtY1wiOiBcIk9iamVjdGl2ZS1DXCIsIFxuICAgICAgICBcInBlcmxcIjogXCJQZXJsXCIsXG4gICAgICAgIFwicGhwXCI6IFwiUEhQXCIsXG4gICAgICAgIFwicGxhaW50ZXh0XCI6IFwiUGxhaW4gVGV4dFwiLFxuICAgICAgICBcInB5dGhvblwiOiBcIlB5dGhvblwiLFxuICAgICAgICAvLyBcInJcIjogXCJSXCIsIFxuICAgICAgICBcInJ1YnlcIjogXCJSdWJ5XCIsXG4gICAgICAgIC8vIFwicnVzdFwiOiBcIlJ1c3RcIiwgXG4gICAgICAgIC8vIFwic2NhbGFcIjogXCJTY2FsYVwiLCBcbiAgICAgICAgLy8gXCJzY2hlbWVcIjogXCJTY2hlbWVcIiwgXG4gICAgICAgIFwic2Nzc1wiOiBcIlNDU1NcIixcbiAgICAgICAgXCJzaGVsbFwiOiBcIlNoZWxsXCIsXG4gICAgICAgIFwic3FsXCI6IFwiU1FMXCIsXG4gICAgICAgIC8vIFwic3dpZnRcIjogXCJTd2lmdFwiLCBcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCI6IFwiVHlwZVNjcmlwdFwiLFxuICAgICAgICAvLyBcInZibmV0XCI6IFwiVmlzdWFsIEJhc2ljIC5ORVRcIiwgXG4gICAgICAgIC8vIFwidmhkbFwiOiBcIlZIRExcIiwgXG4gICAgICAgIFwieG1sXCI6IFwiWE1MXCIsXG4gICAgICAgIFwieWFtbFwiOiBcIllBTUxcIlxuICAgIH07XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpZiAoQmxvY2tUb29sYm94Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tUb29sYm94LmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEJsb2NrVG9vbGJveCB7XG4gICAgICAgIGlmICghQmxvY2tUb29sYm94Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICBCbG9ja1Rvb2xib3guaW5zdGFuY2UgPSBuZXcgQmxvY2tUb29sYm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJsb2NrVG9vbGJveC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTGlzdGVuaW5nIGJsb2NrIHRvb2xib3hlcy4uLlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VvdmVyLCB0aGlzLmluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlLmJpbmQodGhpcykpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Gb2N1c2luLCB0aGlzLmhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luLmJpbmQodGhpcykpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Gb2N1c291dCwgdGhpcy5oYW5kbGVUYWJsZUJlaGF2aW9yRm9jdXNPdXQuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrRXZlbnQuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbGJveFZpc2liaWxpdHlDb250cm9sbGVyKHRhcmdldEVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogSGFuZGxlcyBmb2N1cyBpbiBldmVudHMgd2l0aGluIGEgdGFibGUuIElmIHRoZSBmb2N1cyBpcyB3aXRoaW4gYSB0YWJsZSBlbGVtZW50LFxuICAgICogaXQgdHJpZ2dlcnMgdGhlIHRvb2xib3ggdmlzaWJpbGl0eSBjb250cm9sbGVyIHRvIHBvdGVudGlhbGx5IGhpZGUgdGhlIHRvb2xib3guXG4gICAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgdGhlIHRvb2xib3ggZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRhYmxlIGludGVyYWN0aW9ucy5cbiAgICAqXG4gICAgKiBAcGFyYW0ge0ZvY3VzRXZlbnR9IGV2ZW50IC0gVGhlIGZvY3VzIGV2ZW50IHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgd2l0aGluIHRoZSB0YWJsZSBnYWlucyBmb2N1cy5cbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpKSB7XG4gICAgICAgICAgICB0aGlzLnRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcih0YXJnZXRFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZm9jdXMgb3V0IGV2ZW50cyB3aXRoaW4gYSB0YWJsZS4gSWYgdGhlIGZvY3VzIG1vdmVzIG91dCBvZiBhIHRhYmxlIGVsZW1lbnQsXG4gICAgICogaXQgdHJpZ2dlcnMgdGhlIHRvb2xib3ggdmlzaWJpbGl0eSBjb250cm9sbGVyIHRvIHBvdGVudGlhbGx5IHNob3cgdGhlIHRvb2xib3guXG4gICAgICogVGhpcyBoZWxwcyBpbiBlbnN1cmluZyB0aGF0IHRoZSB0b29sYm94IGlzIGF2YWlsYWJsZSBmb3IgdXNlIHdoZW4gdGhlIHRhYmxlIGlzIG5vdCBhY3RpdmVseSBmb2N1c2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGb2N1c0V2ZW50fSBldmVudCAtIFRoZSBmb2N1cyBldmVudCB0cmlnZ2VyZWQgd2hlbiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgdGFibGUgbG9zZXMgZm9jdXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cblxuICAgIHByaXZhdGUgaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzT3V0KGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpKSB7XG4gICAgICAgICAgICB0aGlzLnRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcih0YXJnZXRFbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcihjZWxsOiBIVE1MRWxlbWVudCwgZm9yY2VIaWRlRWxlbWVudDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBibG9jayA9IGNlbGwuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1dyYXBwZXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKCcuYmxvY2stdG9vbGJhcicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlSGlkZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1dyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5zZXJ0VG9vbGJveEludG9CbG9ja09uY2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblxuICAgICAgICBjb25zdCBjb250ZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAuJHtUb29sYm94T3B0aW9ucy5JbmNsdWRlQmxvY2tUb29sYmFyQ2xhc3N9YCk7XG5cbiAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgaWYgKCFibG9jaykgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvcHRpb25zQnV0dG9uRXhpc3RzID0gYmxvY2sucXVlcnlTZWxlY3RvcignLmJsb2NrLXRvb2xiYXItd3JhcHBlcicpICE9PSBudWxsO1xuICAgICAgICBpZiAoIW9wdGlvbnNCdXR0b25FeGlzdHMpIHtcblxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUxhbmd1YWdlU2VsZWN0aW9uVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkxhbmd1YWdlU2VsZWN0aW9uVG9vbENsYXNzKTtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVBbGlnblRvb2wgPSBjb250ZW50LmNsYXNzTGlzdC5jb250YWlucyhUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XG4gICAgICAgICAgICBjb25zdCBpbmNsdWRlQ29sb3JUb29sID0gY29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoVG9vbGJveE9wdGlvbnMuQ29sb3JUb29sQ2xhc3MpO1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUV4dHJhT3B0aW9ucyA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcblxuICAgICAgICAgICAgY29uc3QgdG9vbGJveFdyYXBwZXIgPSBCbG9ja1Rvb2xib3guY3JlYXRlVG9vbGJveChpbmNsdWRlTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sLCBpbmNsdWRlQWxpZ25Ub29sLCBpbmNsdWRlQ29sb3JUb29sLCBpbmNsdWRlRXh0cmFPcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodG9vbGJveFdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIGJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZW50ZXIsIChldmVudCkgPT4gdGhpcy5yZXNldFRvb2xib3goZXZlbnQsIGJsb2NrIGFzIEhUTUxFbGVtZW50KSk7XG5cbiAgICAgICAgICAgICAgICBibG9jay5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29sYmFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2suY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQmxvY2tUb29sYm94KHRvb2xib3hXcmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgYmxvY2suYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VsZWF2ZSwgKCkgPT4gdGhpcy5oaWRlQmxvY2tUb29sYm94KHRvb2xib3hXcmFwcGVyKSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghRE9NVXRpbHMuaXNUYXJnZXREZXNjZW5kYW50T2ZTZWxlY3RvcihldmVudCwgYCMke2Jsb2NrLmlkfWApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZXMgPSBibG9jay5xdWVyeVNlbGVjdG9yQWxsKFwiaWZyYW1lXCIpO1xuICAgICAgICAgICAgICAgIGlmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VlbnRlciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xiYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJDb2xvcihibG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWxlYXZlLCAoKSA9PiB0aGlzLmhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXIpKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG5cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBjaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2s6IEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbiA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuY29sb3ItaW50ZXJhY3RpdmUtYnV0dG9uIGRpdlwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FsbG91dFdyYXBwZXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmNhbGxvdXQtd3JhcHBlclwiKTtcblxuICAgICAgICBpZiAoY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbiAmJiBjYWxsb3V0V3JhcHBlcikge1xuXG4gICAgICAgICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjYWxsb3V0V3JhcHBlcik7XG5cbiAgICAgICAgICAgIGNvbG9ySW50ZXJhY3RpdmVCdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IHN0eWxlLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI2NjY1wiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZUJsb2NrVG9vbGJveCh0b29sYm94V3JhcHBlcjogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xuICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xuICAgICAgICBpZiAodG9vbGJhcikge1xuXG4gICAgICAgICAgICBpZiAoIUJsb2NrVG9vbGJveC5pc0FueURlcGVuZGVudEJveFZpc2libGUodG9vbGJhcikpIHtcbiAgICAgICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0FueURlcGVuZGVudEJveFZpc2libGUoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVudEJveGVzID0gaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5kZXBlbmRlbnQtYm94XCIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYm94IG9mIGRlcGVuZGVudEJveGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJveCk7XG5cbiAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNldFRvb2xib3goZXZlbnQ6IEV2ZW50LCBibG9jazogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYmxvY2tUb29sYmFyID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyXCIpO1xuXG4gICAgICAgIGlmICghYmxvY2tUb29sYmFyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImJsb2NrLXRvb2xiYXIgbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9yZSA9IGJsb2NrVG9vbGJhci5xdWVyeVNlbGVjdG9yKFwiLm1lZGlhLW1vcmUtb3B0aW9uLXNlbGVjdFwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKG1vcmUpIHtcbiAgICAgICAgICAgIG1vcmUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sb3IgPSBibG9ja1Rvb2xiYXIucXVlcnlTZWxlY3RvcihcIi5jb2xvci1pbnRlcmFjdGl2ZS1zZWxlY3RcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgY29sb3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2spO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVUb29sYm94KGluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wgPSBmYWxzZSwgaW5jbHVkZUFsaWduVG9vbCA9IGZhbHNlLCBpbmNsdWRlQ29sb3JUb29sID0gZmFsc2UsIGluY2x1ZGVFeHRyYU9wdGlvbnMgPSBmYWxzZSk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICAgIGh0bWxFbGVtZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiYmxvY2stdG9vbGJhci13cmFwcGVyXCIsIFwiZXhjbHVkZS1mcm9tLWNsb25lXCIsIENvbW1vbkNsYXNzZXMuRWRpdG9yT25seSk7XG4gICAgICAgIGh0bWxFbGVtZW50V3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJibG9jay10b29sYmFyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IGBidGItJHtVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCl9YDtcblxuICAgICAgICBodG1sRWxlbWVudFdyYXBwZXIuYXBwZW5kQ2hpbGQoaHRtbEVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmxhbmd1YWdlU2VsZWN0aW9uVG9vbCgpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlQWxpZ25Ub29sKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmFsaWduVG9vbCgpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlQ29sb3JUb29sKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmNvbG9yVG9vbCgpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlRXh0cmFPcHRpb25zKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmV4dHJhT3B0aW9ucygpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudFdyYXBwZXI7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21VSUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21VSUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcbmltcG9ydCB7IEJsb2NrVG9vbGJveCB9IGZyb20gXCJAL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9CbG9ja1Rvb2xib3hcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVCdXR0b24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuICAgIHN2Z0ljb24/OiBTVkdJY29uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0LCBpbmNsdWRlQ2hldnJvbkljb246IGJvb2xlYW4gPSB0cnVlKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2Z0ljb24gPSBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNoZXZyb24tZG93blwiLCBTaXplcy5tZWRpdW0pO1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBkcm9wZG93bkxpc3Q6IGRyb3Bkb3duTGlzdCxcclxuICAgICAgICAgICAgc3ZnSWNvbjogaW5jbHVkZUNoZXZyb25JY29uID8gc3ZnSWNvbiA6IG51bGxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkxpc3QgPSBkcm9wZG93bkxpc3Q7XHJcbiAgICAgICAgdGhpcy5zdmdJY29uID0gc3ZnSWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuXHJcbiAgICAgICAgZHJvcGRvd25MaXN0LnNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQ6IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIC8vIGh0bWxFbGVtZW50LnRpdGxlID0gdGhpcy5wcm9wcy50aXRsZVxyXG4gICAgICAgIGh0bWxFbGVtZW50LnJvbGUgPSBcImJ1dHRvblwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJidXR0b24tcmVzZXRcIiwgXCJ0ZXh0LWZvcm1hdHRpbmctc2VsZWN0LWJ1dHRvblwiLCBcInRleHQtZm9ybWF0dGluZy1vcGVyYXRpb25cIiwgXCJvcHRpb24taG92ZXJcIiwgXCJwb2ludGVyXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRhYkluZGV4ID0gMTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMucHJvcHMuZHJvcGRvd25MaXN0Lmh0bWxFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRpdGxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZChcIm5vLXNlbGVjdGlvblwiKTtcclxuICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRoaXMucHJvcHMudGl0bGU7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMudGl0bGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc3ZnSWNvbikge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnN2Z0ljb24uaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZHJvcGRvd25MaXN0LmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkxpc3Quc2hvdygpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlLCB0aGlzLmhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VFdmVudChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPjtcclxuICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBpZiAoZGV0YWlscy50YXJnZXRDbGFzcyAmJiB0aGlzLmNsYXNzTGlzdC5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzKSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRWYWx1ZXMgPSAoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoYCMke2V2ZW50VmFsdWVzLmJsb2NrSWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZihibG9jayl7XHJcbiAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGl0bGUoQmxvY2tUb29sYm94Lmxhbmd1YWdlTWFwW2V2ZW50VmFsdWVzLmxhbmd1YWdlXSk7XHJcbiAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2Jsb2NrJztcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUaXRsZSh2YWx1ZTogc3RyaW5nKXtcclxuICAgICAgICBjb25zdCBzcGFuID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic3BhblwiKTtcclxuICAgICAgICBpZihzcGFuKXtcclxuICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHByZWZpeElkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgbGlzdDogRHJvcGRvd25NZW51TGlzdCwgaW5jbHVkZUNoZXZyb25JY29uPzogYm9vbGVhbiwgY2xhc3Nlc0tleTogc3RyaW5nW10gPSBbXSk6IERyb3Bkb3duTWVudUJ1dHRvbiB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKHByZWZpeElkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCB0aXRsZSwgbGlzdCwgaW5jbHVkZUNoZXZyb25JY29uKTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwSXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JdGVtSURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkl0ZW1JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25MaXN0SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkxpc3RJRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bk1lbnVJRHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gXCJcIlxyXG4gICAgICAgIGNvbnN0IGZsb2F0aW5nQmFyID0gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kRHJvcGRvd24oVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnR1cm5JbnRvRHJvcGRvd24oKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kU2VwYXJhdG9yKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoXCJ0dXJuSW50b1NlcGFyYXRvclwiKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kQnV0dG9uR3JvdXAoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLmJ1dHRvbkdyb3VwKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5jb2xvckRyb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGV4dE9wZXJhdGlvbnNTZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5tb3JlT3B0aW9uc0Ryb3Bkb3duKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmxvYXRpbmdCYXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHR1cm5JbnRvRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgdHVybkludG9CYXJMaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJ0dXJuSW50b1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0dXJuSW50b0J1dHRvblwiLCBcIlRleHRcIiwgdHVybkludG9CYXJMaXN0KTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInR1cm5JbnRvTWVudVwiLCB0dXJuSW50b0JhckJ1dHRvbiwgdHVybkludG9CYXJMaXN0KTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiVHVybiBpbnRvXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29ucy5wYXJhZ3JhcGguaHRtbEVsZW1lbnQsIFwiVGV4dFwiLCBcIkN0cmwrU2hpZnQrRW50ZXJcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29ucy50b2RvX2xpc3QuaHRtbEVsZW1lbnQsIFwiVG9kbyBsaXN0XCIsIFwiQ3RybCsxXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uQnVsbGV0ZWRMaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFNWR0ljb25zLmJfbGlzdC5odG1sRWxlbWVudCwgXCJCdWxsZXRlZCBsaXN0XCIsIFwiQ3RybCsuXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uTnVtYmVyZWRMaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFNWR0ljb25zLm5fbGlzdC5odG1sRWxlbWVudCwgXCJOdW1iZXJlZCBsaXN0XCIsIFwiQ3RybCsvXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uQmxvY2tDb2RlXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIFNWR0ljb25zLmNvZGUuaHRtbEVsZW1lbnQsIFwiQmxvY2sgY29kZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblF1b3RlXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlFVT1RFLCBTVkdJY29ucy5xdW90ZS5odG1sRWxlbWVudCwgXCJRdW90ZVwiKSk7XHJcbiAgICAgICAgLy90dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzFcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEsIFNWR0ljb25zLmhlYWQxLmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgMVwiLCBcIkN0cmwrQWx0KzFcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nMlwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgU1ZHSWNvbnMuaGVhZDIuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyAyXCIsIFwiQ3RybCtBbHQrMlwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmczXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBTVkdJY29ucy5oZWFkMy5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDNcIiwgXCJDdHJsK0FsdCszXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFNWR0ljb25zLmhlYWQ0Lmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgNFwiLCBcIkN0cmwrQWx0KzRcIikpO1xyXG4gICAgICAgIC8vdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmc1XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81LCBTVkdJY29ucy5oZWFkNS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDVcIiwgXCJDdHJsK0FsdCs1XCIpKTtcclxuICAgICAgICAvL3R1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nNlwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgU1ZHSWNvbnMuaGVhZDYuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyA2XCIsIFwiQ3RybCtBbHQrNlwiKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0dXJuSW50b0Ryb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXBhcmF0b3IoaWQ6IHN0cmluZyk6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBidXR0b25Hcm91cCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGluayA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlTGluaywgXCJMaW5rXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkxpbmssIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgbGluay5zZXRJZChCdXR0b25JRHMuTGluayk7XHJcbiAgICAgICAgbGluay5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvbGQgPSBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLnRvZ2dsZUJvbGQsIFwiQm9sZFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5Cb2xkLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIGJvbGQuc2V0SWQoQnV0dG9uSURzLkJvbGQpO1xyXG4gICAgICAgIGJvbGQuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGl0YWxpYyA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlSXRhbGljLCBcIkl0YWxpY1wiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5JdGFsaWMsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgaXRhbGljLnNldElkKEJ1dHRvbklEcy5JdGFsaWMpO1xyXG4gICAgICAgIGl0YWxpYy5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdW5kZXJsaW5lID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUsIFwiVW5kZXJsaW5lXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLlVuZGVybGluZSwgU2l6ZXMubGFyZ2UpKTtcclxuICAgICAgICB1bmRlcmxpbmUuc2V0SWQoQnV0dG9uSURzLlVuZGVybGluZSk7XHJcbiAgICAgICAgdW5kZXJsaW5lLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBpbmxpbmVDb2RlID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlLCBcIkNvZGVcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSW5saW5lQ29kZSwgU2l6ZXMubGFyZ2UpKTtcclxuICAgICAgICBpbmxpbmVDb2RlLnNldElkKEJ1dHRvbklEcy5JbmxpbmVDb2RlKTtcclxuICAgICAgICBpbmxpbmVDb2RlLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBzdHJpa2V0aHJvdWdoID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVTdHJpa2VUaHJvdWdoLCBcIlN0cmlrZS10aHJvdWdoXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLlN0cmlrZVRocm91Z2gsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgc3RyaWtldGhyb3VnaC5zZXRJZChCdXR0b25JRHMuU3RyaWtldGhyb3VnaCk7XHJcbiAgICAgICAgc3RyaWtldGhyb3VnaC5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBncm91cEJ1dHRvbjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY29sb3JEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duTGlzdCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KERyb3Bkb3duTGlzdElEcy5Db2xvclRleHRPcHRpb25TZWxlY3QpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcImNvbG9yVGV4dEJ1dHRvblwiLCBuZXcgQ29sb3JJY29uKFwid2hpdGVcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShEcm9wZG93bk1lbnVJRHMuQ29sb3JUZXh0T3B0aW9uc01lbnUsIGNvbG9yQnV0dG9uLCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJIaWdobGlnaHRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblJlZCwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JSZWQuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZWVuLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZWVuLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZWVuKS5odG1sRWxlbWVudCwgXCJHcmVlblwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvckdyZWVuLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yQmx1ZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkJsdWUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yQmx1ZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblllbGxvdywgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JleSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5LCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JHcmV5LmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbk5vbmUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yTm9uZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZWVuKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZXkpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiVGV4dFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JSZWQsIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBmb3JlQ29sb3JSZWQuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9yR3JlZW4sIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckdyZWVuLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JCbHVlLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckJsdWUuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JZZWxsb3csIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBmb3JlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvciwgQ29sb3JzLkZvcmVDb2xvckdyZXksIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgZm9yZUNvbG9yR3JleS5hZGRDbGFzcyhcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBTaXplcy5sYXJnZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBmb3JlQ29sb3JOb25lLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChmb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGZvcmVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9yZU9wdGlvbnNEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwibW9yZVRleHRPcHRpb25zTWVudVwiLCBtb3JlT3B0aW9uc0J1dHRvbiwgbW9yZU9wdGlvbnNMaXN0KTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShtb3JlT3B0aW9uc0xpc3QsIFwiTW9yZSBvcHRpb25zXCIpKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb3B5T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY29weVNlbGVjdGVkLCBudWxsLCBTVkdJY29ucy5jb3B5Lmh0bWxFbGVtZW50LCBcIkNvcHlcIiwgXCJDdHJsK0NcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY3V0T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY3V0U2VsZWN0ZWQsIG51bGwsIFNWR0ljb25zLmN1dC5odG1sRWxlbWVudCwgXCJDdXRcIiwgXCJDdHJsK1hcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicGFzdGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5wYXN0LCBudWxsLCBTVkdJY29ucy5wYXN0ZS5odG1sRWxlbWVudCwgXCJSZXBsYWNlXCIsIFwiQ3RybCtWXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImR1cGxpY2F0ZU9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29ucy5kdXBsaWNhdGUuaHRtbEVsZW1lbnQsIFwiQ2xvbmVcIiwgXCJDdHJsK0RcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicmVzZXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5yZW1vdmVGb3JtYXQsIG51bGwsIFNWR0ljb25zLmVyYXNlci5odG1sRWxlbWVudCwgXCJSZXNldCBTdHlsZVwiLCBcIkN0cmwrXFxcXFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJkZWxldGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5kZWxldGVCbG9jaywgbnVsbCwgU1ZHSWNvbnMuZGVsZXRlLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChkZWxldGVJdGVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHRvZG9fbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBiX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBjb2RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNvZGUtbWFya1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBxdW90ZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1xdW90ZVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMzogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtM1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZGVsZXRlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtdHJhc2hcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZXJhc2VyOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY2xlYXJcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY3V0OiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY3V0XCIsIFNpemVzLmxhcmdlKSxcclxuICAgIHBhc3RlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtcGFzdGVcIiwgU2l6ZXMubGFyZ2UpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIG1hdGNoaW5nIGJsb2NrIHR5cGVzIGZvdW5kLic7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoJ2VtcHR5LWJsb2NrLW9wdGlvbnMnKTtcclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3Iuc3R5bGUucGFkZGluZyA9ICcxMHB4JztcclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3Iuc3R5bGUuY29sb3IgPSAncmdiYSg1NSwgNTMsIDQ3LCAwLjY1KSc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRW1wdHlJbmRpY2F0b3I7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSAnLi9RdWlja01lbnVTZWN0aW9uJztcbmltcG9ydCB7IFF1aWNrTWVudUVtcHR5IH0gZnJvbSAnLi9RdWlja01lbnVFbXB0eSc7XG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSAnLi9RdWlja01lbnVJdGVtJztcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi4vLi4vY29tbW9uL0NpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCc7XG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuLi8uLi9jb21tb24vSk5vZGVcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tICdAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lcic7XG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gJ0AvY29yZS9JRm9jdXNTdGFjayc7XG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSAnLi9JUXVpY2tNZW51JztcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tICdAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWwnO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnQC9jb21tYW5kcy9Db21tYW5kcyc7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gJ0AvdXRpbGl0aWVzL0RPTVV0aWxzJztcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gJ0AvY29tbW9uL1pJbmRleCc7XG5cbmV4cG9ydCBjbGFzcyBRdWlja01lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQgaW1wbGVtZW50cyBJUXVpY2tNZW51IHtcblxuICAgIHN0YXRpYyBpZCA9IFwicXVpY2tNZW51XCI7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcbiAgICBwcml2YXRlIG1lbnVTZWN0aW9uczogQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFF1aWNrTWVudVNlY3Rpb24+O1xuICAgIHByaXZhdGUgcXVpY2tNZW51RW1wdHk6IFF1aWNrTWVudUVtcHR5O1xuICAgIHByaXZhdGUgZmlsdGVySW5wdXQ6IHN0cmluZztcbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFF1aWNrTWVudSB8IG51bGw7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrKSB7XG5cbiAgICAgICAgY29uc3QgcXVpY2tNZW51RW1wdHkgPSBuZXcgUXVpY2tNZW51RW1wdHkoKTtcblxuICAgICAgICBzdXBlcih7IHF1aWNrTWVudUVtcHR5OiBxdWlja01lbnVFbXB0eSB9KTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucyA9IG5ldyBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj4oKTtcbiAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eSA9IHF1aWNrTWVudUVtcHR5O1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuICAgIH1cblxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gUXVpY2tNZW51LmlkO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucy13cmFwcGVyJywgJ3NvZnQtYm94LXNoYWRvdycpO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGNvbnN0IGJsb2NrT3B0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBibG9ja09wdGlvbnMuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucycpO1xuICAgICAgICBibG9ja09wdGlvbnMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuXG4gICAgICAgIGJsb2NrT3B0aW9ucy5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnF1aWNrTWVudUVtcHR5Lmh0bWxFbGVtZW50KTtcblxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChibG9ja09wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcbiAgICB9XG5cbiAgICBhcHBlbmQobWVudUl0ZW06IFF1aWNrTWVudVNlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMuYXBwZW5kKG1lbnVJdGVtKTtcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYmxvY2stb3B0aW9ucycpIS5hcHBlbmRDaGlsZChtZW51SXRlbS5odG1sRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBRdWlja01lbnUge1xuXG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG5cbiAgICAgICAgaWYgKCFRdWlja01lbnUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFF1aWNrTWVudS5pbnN0YW5jZSA9IG5ldyBRdWlja01lbnUoZm9jdXNTdGFjayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUXVpY2tNZW51Lmluc3RhbmNlO1xuICAgIH1cblxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+KTogdm9pZCB7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xuXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgZmlyc3RTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZ2V0Rmlyc3QoKTtcblxuICAgICAgICBsZXQgY3VycmVudFNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSBmaXJzdFNlY3Rpb25Ob2RlO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50U2VjdGlvbk5vZGUpIHtcblxuICAgICAgICAgICAgY29uc3QgaXRlbU5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbCA9IGN1cnJlbnRTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZEZpcnN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAoaXRlbU5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKGl0ZW1Ob2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uTm9kZSA9IGN1cnJlbnRTZWN0aW9uTm9kZS5uZXh0Tm9kZTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWN0aW9uTm9kZSA9PSBmaXJzdFNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVJdGVtOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzVmlzaWJsZUl0ZW0pIHtcblxuICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZCh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUuaW1tZWRpYXRlUGFyZW50KSEuZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSBwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZExhc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFzdFZpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZExhc3Qoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgIGlmICghbGFzdFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSBsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kTGFzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcbiAgICB9XG5cbiAgICBmb2N1c05leHRWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBsZXQgbmV4dFZpc2libGVJdGVtOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldE5leHRTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFuZXh0VmlzaWJsZUl0ZW0pIHtcblxuICAgICAgICAgICAgICAgIGxldCBuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5pbW1lZGlhdGVQYXJlbnQpIS5nZXROZXh0U2F0aXNmeWluZyhzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmV4dFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IG5leHRWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlOiBudWxsIHwgSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kRmlyc3Qoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoIWZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3dpdGNoVmlzdWFsRm9jdXMobmV4dFZpc2libGVJdGVtISk7XG4gICAgfVxuXG4gICAgZmlsdGVySXRlbXMoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHNlY3Rpb24uZmlsdGVyU2VjdGlvbih0aGlzLmZpbHRlcklucHV0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm1lbnVTZWN0aW9ucy5hbnkoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSkpIHtcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkuc2hvdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eS5oaWRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGRpc3BsYXkgdGhlIHF1aWNrTWVudTogbm8gYWN0aXZlIGVsZW1lbnQgZm91bmQuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2goYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYO1xuXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XG5cbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcblxuICAgICAgICAgICAgc3VwZXIuc2hvdygpO1xuXG4gICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5mb2N1cygpO1xuXG4gICAgICAgIH0sIDEwKTtcblxuICAgIH1cblxuICAgIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLnJlc3RvcmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcblxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcblxuICAgICAgICBzdXBlci5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudHMoKSB7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsICgoZXZlbnQ6IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbW1hbmQgfSA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMudHJhbnNmb3JtQmxvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KSBhcyBFdmVudExpc3RlbmVyKTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gRE9NVXRpbHMuZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoXCJibG9ja1wiKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICcvJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiBibG9jaykge1xuXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBzaG93IHF1aWNrTWVudVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KFwiLmlnbm9yZS1xdWljay1tZW51XCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIC9eW2EtejAtOSBdJC9pLnRlc3QoZXZlbnQua2V5KSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2F0RmlsdGVySW5wdXQoZXZlbnQua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcklucHV0ID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXN0RmlsdGVySW5wdXRDaGFyYWN0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0/LnZhbHVlLmJsb2NrVHlwZTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1R5cGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXG4gICAgICAgICAgICAgICAgdmFsdWU6IGJsb2NrVHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1IdG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51KGJsb2NrVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChibG9ja1R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25jYXRGaWx0ZXJJbnB1dChzdGc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ICs9IHN0Zy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gdGhpcy5maWx0ZXJJbnB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuL0Jhc2VEb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tICcuL0pOb2RlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBub2RlO1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5zZXROZXh0KG5vZGUpO1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vUXVpY2tNZW51JztcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuL1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51U2VjdGlvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnU7XHJcblxyXG4gICAgbWVudUl0ZW1zID0gbmV3IERvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51SXRlbT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBRdWlja01lbnVTZWN0aW9uT3B0aW9ucykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICAgICAgICBjbGFzc0xpc3Q6IG9wdGlvbnMuY2xhc3NMaXN0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW1tZWRpYXRlUGFyZW50ID0gb3B0aW9ucy5xdWlja01lbnVJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLnByb3BzLmNsYXNzTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xyXG4gICAgICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZChcIm5vLXNlbGVjdGlvblwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9ibG9ja1R5cGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pbW1lZGlhdGVQYXJlbnQ6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpY29uSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmxvY2tUeXBlID0gYmxvY2tUeXBlO1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50ID0gaW1tZWRpYXRlUGFyZW50O1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJywgXCJwb2ludGVyXCIsIFwibm8tc2VsZWN0aW9uXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmxvY2stb3BlcmF0aW9uJywgJ2FwcGx5LXNlbGVjdGVkLWJsb2NrLXR5cGUnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnb3B0aW9uJyk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG9wdGlvbkltYWdlLmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1pbWFnZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmcgPSBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLmljb25JZCwgJzEwMCUnKTtcclxuXHJcbiAgICAgICAgb3B0aW9uSW1hZ2UuYXBwZW5kQ2hpbGQoc3ZnLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uSW1hZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgb3B0aW9uVGV4dC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tdGV4dCcpO1xyXG5cclxuICAgICAgICBjb25zdCBibG9ja1RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuY2xhc3NMaXN0LmFkZCgnYmxvY2stdGl0bGUnKTtcclxuICAgICAgICBibG9ja1RpdGxlLmlubmVyVGV4dCA9IHRoaXMucHJvcHMudGl0bGU7XHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tUaXRsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrRGVzY3JpcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5jbGFzc0xpc3QuYWRkKCdibG9jay1kZXNjcmlwdGlvbicpO1xyXG4gICAgICAgIGJsb2NrRGVzY3JpcHRpb24uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5kZXNjcmlwdGlvbjtcclxuXHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tEZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvblRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW1tZWRpYXRlUGFyZW50ICgpOiBRdWlja01lbnVTZWN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW1tZWRpYXRlUGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBibG9ja1R5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmxvY2tUeXBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+ID0gdGhpcy5faW1tZWRpYXRlUGFyZW50Lm1lbnVJdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ltbWVkaWF0ZVBhcmVudC5pbW1lZGlhdGVQYXJlbnQuc3dpdGNoVmlzdWFsRm9jdXMobm9kZSEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51U2VjdGlvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvblwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVJdGVtXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFF1aWNrTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHF1aWNrTWVudTogUXVpY2tNZW51ID0gUXVpY2tNZW51LmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJhc2ljQmxvY2tzU2VjdGlvbjogUXVpY2tNZW51U2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdCYXNpYycsIGNsYXNzTGlzdDogJ2Jhc2ljLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBiYXNpY0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdUZXh0JywgJ1N0YXJ0IHdyaXRpbmcgaW4gcGxhaW4gdGV4dC4nLCAnaWNvbi1tYXRlcmlhbC1mb3JtYXQnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFwicGFyYWdyYXBoIHRleHQgcFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBcImJ1bGxldGVkIGxpc3QgdW5vcmRlcmVkIGxpc3QgdWxcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ051bWJlcmVkIGxpc3QnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnVGFibGUnLCAnT3JnYW5pemUgZGF0YSBpbiByb3dzIGFuZCBjb2x1bW5zLicsICdpY29uLW1hdGVyaWFsLXRhYmxlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwidGFibGUgdHIgdGhcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0NhbGxvdXQnLCAnRW1waGFzaXplIGtleSBwb2ludHMgd2l0aCBhIGNhbGxvdXQgYm94LicsIEljb25zLkNhbGxvdXQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIFwiY2FsbG91dCBub3RlIHNwb3RsaWdodFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQ29kZScsICdJbmNsdWRlIGEgY29kZSBzbmlwcGV0LicsICdpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmsnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBcImNvZGUgc2NyaXB0IHNvdXJjZSBtYXJrdXBcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1F1b3RlJywgJ0hpZ2hsaWdodCB0ZXh0IGFzIGEgcXVvdGUuJywgJ2ljb24td29yZHByZXNzLXF1b3RlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUsIFwicXVvdGUgYmxvY2txdW90ZSBjaXRhdGlvbiBxdW90YXRpb24gY2l0ZVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAyJywgJ01lZGl1bSBoZWFkZXIgZm9yIHNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBcImhlYWRlciAyIGhlYWRpbmcgMiBoMlwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAzJywgJ1NtYWxsIGhlYWRlciBmb3Igc3Vic2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzMsIFwiaGVhZGVyIDMgaGVhZGluZyAzIGgzXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdTZXBhcmF0b3InLCAnVmlzdWFsbHkgZGl2aWRlIGJsb2Nrcy4nLCAnaWNvbi13b3JkcHJlc3Mtc2VwYXJhdG9yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU0VQQVJBVE9SLCBcInNlcGFyYXRvciBkaXZpZGVyIHJ1bGUgbGluZSBoclwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGJhc2ljQmxvY2tzU2VjdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdNZWRpYScsIGNsYXNzTGlzdDogJ21lZGlhLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBtZWRpYUJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2UuJywgSWNvbnMuSW1hZ2UyLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgXCJpbWFnZSBmaWd1cmUgcGhvdG8gaWxsdXN0cmF0aW9uIHBpY3R1cmUgbWVkaWEgdXBsb2FkXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdZb3VUdWJlJywgJ0VtYmVkIGEgWW91VHViZSB2aWRlby4nLCBJY29ucy5Zb3VUdWJlLCAndmlkZW8nLCBcInZpZGVvIGVtYmVkIHlvdXR1YmUgY2xpcCBmaWxtIG1vdmllIHRhcGVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChtZWRpYUJsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgXCJ0b2RvIGxpc3QgdGFzayBsaXN0IGNoZWNrbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdCdWxsZXRlZCBsaXN0JywgJ09yZ2FuaXplIGl0ZW1zIHdpdGggYnVsbGV0IHBvaW50cy4nLCAnaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChsaXN0QmxvY2tzU2VjdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZW1iZWRTZWN0aW9uID0gbmV3IFF1aWNrTWVudVNlY3Rpb24oeyBxdWlja01lbnVJbnN0YW5jZTogcXVpY2tNZW51LCB0aXRsZTogJ0VtYmVkJywgY2xhc3NMaXN0OiAnZW1iZWQtc2VjdGlvbicgfSk7XHJcblxyXG4gICAgICAgIGVtYmVkU2VjdGlvbi5hcHBlbmRRdWlja01lbnVJdGVtcyhbXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdEh1YiBHaXN0JywgJ0VtYmVkIGEgR2l0SHViIEdpc3QuJywgSWNvbnMuR2l0SHViLCAnZ2l0aHViLWdpc3QnLCBcImNvZGUgZ2lzdCBnaXRodWIgc25pcHBldCBnaXRcIiksXHJcbiAgICAgICAgICAgIC8vIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdExhYiBTbmlwcGV0ICcsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsIEljb25zLkdpdExhYiwgJ2dpdGxhYi1zbmlwcGV0JywgXCJjb2RlIGdpdCBnaXRsYWIgc25pcHBldCBnaXN0XCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHaXRMYWIgU25pcHBldCAnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdDb2RlUGVuJywgJ0VtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtby4nLCBJY29ucy5Db2RlUGVuLCAnY29kZXBlbicsIFwiY29kZSBjb2RlcGVuXCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHb29nbGUgTWFwcycsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ1Nwb3RpZnknLCAnRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrLicsIEljb25zLlNwb3RpZnksICdzcG90aWZ5JywgXCJtcDMgc291bmQgYXVkaW8gbXVzaWMgc3BvdGlmeSB0cmFja1wiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChlbWJlZFNlY3Rpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gcXVpY2tNZW51O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidGl0bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgxXCIpO1xyXG4gICAgICAgIGgxLnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcInRydWVcIik7XHJcbiAgICAgICAgaDEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlVudGl0bGVkXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xyXG4gICAgICAgICAgICBoMS50ZXh0Q29udGVudCA9IHRoaXMucHJvcHMudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoMSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSh2YWx1ZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvdGl0bGUvVGl0bGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaXRsZUJ1aWxkZXIge1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRpdGxlIHtcclxuICAgICAgICByZXR1cm4gVGl0bGUuY3JlYXRlKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIGtleWJvYXJkIGFycm93IGRpcmVjdGlvbnMuXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBEaXJlY3Rpb25zIHtcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dVcCcga2V5LCB1c2VkIHRvIG5hdmlnYXRlIHVwd2FyZHMgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93VXAgPSBcIkFycm93VXBcIixcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dEb3duJyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgZG93bndhcmRzIGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0Rvd24gPSBcIkFycm93RG93blwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd0xlZnQnIGtleSwgdXNlZCB0byBuYXZpZ2F0ZSBsZWZ0IGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0xlZnQgPSBcIkFycm93TGVmdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd1JpZ2h0JyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgcmlnaHQgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93UmlnaHQgPSBcIkFycm93UmlnaHRcIixcclxufVxyXG4iLCJleHBvcnQgZW51bSBUYWJsZVNjb3BlcyB7XHJcbiAgICBDb2x1bW4gPSBcIkNvbHVtblwiLFxyXG4gICAgUm93ID0gXCJSb3dcIixcclxuICAgIENlbGwgPSBcIkNlbGxcIixcclxuICAgIFNlbGVjdGVkQ2VsbHMgPSBcIlNlbGVjdGVkQ2VsbHNcIlxyXG59IiwiZXhwb3J0IGVudW0gU2VsZWN0aW9uTW9kZXMge1xyXG4gICAgVGV4dCA9IFwiVGV4dFwiLFxyXG4gICAgQ2VsbCA9IFwiQ2VsbFwiLFxyXG4gICAgQmxvY2sgPSBcIkJsb2NrXCJcclxufSIsImltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xyXG5pbXBvcnQgeyBUb29sYm94T3B0aW9ucyB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbWJlZFRvb2wge1xyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEltYWdlKHVybE9iajogc3RyaW5nLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxPYmopO1xyXG5cclxuICAgICAgICBpZiAoIWF3YWl0IEVtYmVkVG9vbC52YWxpZGF0ZUltYWdlKHVybC50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGltYWdlXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHJcbiAgICAgICAgaW1hZ2Uuc3JjID0gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaW1hZ2UuYWx0ID0gJ0VtYmVkZGVkIEltYWdlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS53aWR0aCA9ICdhdXRvJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7XHJcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoVG9vbGJveE9wdGlvbnMuQWxpZ25Ub29sQ2xhc3MpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1Rvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzLCBcImZpdC1jb250ZW50XCIsIFwieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbGlkYXRlSW1hZ2UodXJsVG9DaGVjazogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmxUb0NoZWNrO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZEdvb2dsZVNoZWV0KHVybE9iajogVVJMLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRJZCA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpWzNdO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlU2hlZXRJZCA9IGVuY29kZVVSSUNvbXBvbmVudChzaGVldElkKTtcclxuXHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLyR7c2FmZVNoZWV0SWR9L3B1Ymh0bWw/d2lkZ2V0PXRydWUmYW1wO2hlYWRlcnM9ZmFsc2VgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzQ1MHB4JztcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSAnMCc7XHJcbiAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1wieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkWW91VHViZVZpZGVvQXNJZnJhbWUodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmxPYmouc2VhcmNoUGFyYW1zLmdldCgndicpO1xyXG4gICAgICAgIGlmICh2aWRlb0lkKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVWaWRlb0lkID0gZW5jb2RlVVJJQ29tcG9uZW50KHZpZGVvSWQpO1xyXG5cclxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3NhZmVWaWRlb0lkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xyXG4gICAgICAgICAgICBpZnJhbWUuYWxsb3cgPSBcImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcIngtcmVzaXphYmxlXCIsIFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzXSwgZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBZb3VUdWJlIHZpZGVvIFVSTCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKTtcclxuICAgICAgICBjb25zdCBzaG9ydElkID0gcGF0aFNlZ21lbnRzW3BhdGhTZWdtZW50cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgaWYgKHNob3J0SWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVTaG9ydElkSWQgPSBlbmNvZGVVUklDb21wb25lbnQoc2hvcnRJZCk7XHJcblxyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7c2FmZVNob3J0SWRJZH1gO1xyXG4gICAgICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93ID0gXCJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCI7XHJcbiAgICAgICAgICAgIGlmcmFtZS5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBTaG9ydHMgVVJMJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZFlvdVR1YmVQbGF5bGlzdEFzSWZyYW1lKHVybE9iajogVVJMLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3RJZCA9IHVybE9iai5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XHJcbiAgICAgICAgaWYgKGxpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBFbWJlZFRvb2wuY3JlYXRlRW1iZWRDb250YWluZXIoW1wiZW1iZWQtY29udGFpbmVyXCJdKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVMaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQobGlzdElkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3ZpZGVvc2VyaWVzP2xpc3Q9JHtzYWZlTGlzdElkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBwbGF5bGlzdCBVUkwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkU3BvdGlmeUNvbnRlbnQodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0eXBlOiBFbWJlZFR5cGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudElkID0gdXJsT2JqLnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3BvdGlmeS1lbWJlZFwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcblxyXG5cclxuICAgICAgICBpZiAoIWNvbnRlbnRJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udGVudElkIGlzIGVtcHR5XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzYWZlQ29udGVudElkID0gZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRlbnRJZCk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZChcInNwb3RpZnktZW1iZWRcIik7XHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vZW1iZWQvJHt0eXBlfS8ke3NhZmVDb250ZW50SWR9YDtcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic2Nyb2xsaW5nXCIsIFwibm9cIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVRyYWNrOlxyXG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiODBweFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q6XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5U2hvdzpcclxuICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlFcGlzb2RlOlxyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUFydGlzdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjM4MHB4XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEdpc3RBc1NjcmlwdCh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBnaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBpZiAoIWdpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBHaXN0IElEXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaGFkb3dFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzaGFkb3ctZWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImdpc3QtZW1iZWQtY29udGFpbmVyXCIsIFwiZmlndXJlLWVtYmVkLWNvbnRhaW5lclwiLCBcImlnbm9yZS10ZXh0LWZsb2F0aW5nLXRvb2xiYXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjEwMHB4XCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xyXG5cclxuXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNoYWRvd0VsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gc2hhZG93RWxlbWVudC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhZmVHaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQoZ2lzdElkKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NyaXB0U3JjID0gYGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLyR7c2FmZUdpc3RJZH0uanNgO1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgc2NyaXB0LnNyYyA9IHNjcmlwdFNyYztcclxuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFdyaXRlID0gZG9jdW1lbnQud3JpdGU7XHJcbiAgICAgICAgbGV0IHNjcmlwdE91dHB1dCA9ICcnO1xyXG4gICAgICAgIGRvY3VtZW50LndyaXRlID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzY3JpcHRPdXRwdXQgKz0gY29udGVudDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gc2NyaXB0T3V0cHV0O1xyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbSh0ZW1wRGl2LmNoaWxkTm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2lzdCBsb2FkZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aGUgR2lzdFwiKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcblxyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZENvZGVwZW5Bc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCA0IHx8IHBhcnRzWzFdID09PSAnJyB8fCBwYXJ0c1szXSA9PT0gJycpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkw6IEV4cGVjdGVkIGZvcm1hdCAvdXNlci97dXNlcm5hbWV9L3Blbi97cGVuSWR9Jyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHBhcnRzWzFdO1xyXG4gICAgICAgIGNvbnN0IHBlbiA9IHBhcnRzWzNdO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlVXNlciA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VyKTtcclxuICAgICAgICBjb25zdCBzYWZlUGVuID0gZW5jb2RlVVJJQ29tcG9uZW50KHBlbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly9jb2RlcGVuLmlvLyR7c2FmZVVzZXJ9L2VtYmVkLyR7c2FmZVBlbn0/aGVpZ2h0PTI2NSZ0aGVtZS1pZD1saWdodCZkZWZhdWx0LXRhYj1qcyxyZXN1bHRgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLm92ZXJmbG93ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LXNhbWUtb3JpZ2luJywpO1xyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICBFbWJlZFRvb2wuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcInktcmVzaXphYmxlXCJdLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBlbnRyeS5jb250ZW50UmVjdDtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGNvbnRhaW5lci5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwib3ZlcmZsb3ctaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUVtYmVkQ29udGFpbmVyKGNsYXNzZXM6IHN0cmluZ1tdID0gW10pOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZmlndXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlndXJlJyk7XHJcbiAgICAgICAgZmlndXJlLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGZpZ3VyZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbGl6ZUVtYmVkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGNvbnRlbnRFbGVtZW50Q2xhc3Nlczogc3RyaW5nW10gPSBbXSwgbGFzdEZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gbGFzdEZvY3VzZWRFbGVtZW50LmNsb3Nlc3QoYC4ke0NvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnR9YCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKC4uLmNvbnRlbnRFbGVtZW50Q2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldyYXBwZXIgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyLXdyYXBwZXJcIik7XHJcbiAgICAgICAgICAgIHRvb2xiYXJXcmFwcGVyPy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBkZXRlcm1pbmVFbWJlZFR5cGUodXJsOiBzdHJpbmcpOiBFbWJlZFR5cGVzIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybE9iai5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmxPYmoucGF0aG5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKC9eKD86LipcXC4pP3Nwb3RpZnlcXC5jb20kLy50ZXN0KGRvbWFpbikpIHtcclxuICAgICAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoXCIvdHJhY2tcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlUcmFjaztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9hcnRpc3RcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlBcnRpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9lcGlzb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5RXBpc29kZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3Nob3dcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlTaG93O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICgvXig/Oi4qXFwuKT8oeW91dHViZVxcLmNvbXx5b3V0dVxcLmJlKSQvLnRlc3QoZG9tYWluKSkge1xyXG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi93YXRjaFwiKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybE9iai5zZWFyY2hQYXJhbXMuaGFzKFwibGlzdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVQbGF5bGlzdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVWaWRlbztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Zb3VUdWJlUGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9zaG9ydHNcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVTaG9ydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcInZpbWVvLmNvbVwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlZpbWVvVmlkZW87XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiZG9jcy5nb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9zcHJlYWRzaGVldHNcIikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEVtYmVkVHlwZXMuR29vZ2xlU2hlZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwidHdpdHRlci5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Ud2VldDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9tYXBzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdvb2dsZU1hcDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnaXN0LmdpdGh1Yi5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5HaXRIdWJHaXN0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcImdpdGxhYi5jb21cIiAmJiBwYXRoLmluY2x1ZGVzKFwiL3NuaXBwZXRzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdpdExhYlNuaXBwZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiY29kZXBlbi5pb1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkNvZGVQZW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGVudW0gRW1iZWRUeXBlcyB7XHJcbiAgICBTcG90aWZ5VHJhY2sgPSBcInRyYWNrXCIsXHJcbiAgICBTcG90aWZ5UGxheWxpc3QgPSBcInBsYXlsaXN0XCIsXHJcbiAgICBTcG90aWZ5QXJ0aXN0ID0gXCJhcnRpc3RcIixcclxuICAgIFNwb3RpZnlFcGlzb2RlID0gXCJlcGlzb2RlXCIsXHJcbiAgICBTcG90aWZ5U2hvdyA9IFwic2hvd1wiLFxyXG4gICAgWW91VHViZVZpZGVvID0gXCJ2aWRlb1wiLFxyXG4gICAgWW91VHViZVBsYXlsaXN0ID0gXCJwbGF5bGlzdFwiLFxyXG4gICAgWW91VHViZVNob3J0ID0gXCJzaG9ydFwiLFxyXG4gICAgVmltZW9WaWRlbyA9IFwidmlkZW9cIixcclxuICAgIEdvb2dsZVNoZWV0ID0gXCJzaGVldFwiLFxyXG4gICAgVHdlZXQgPSBcInR3ZWV0XCIsXHJcbiAgICBHb29nbGVNYXAgPSBcIm1hcFwiLFxyXG4gICAgR2l0SHViR2lzdCA9IFwiZ2lzdFwiLFxyXG4gICAgR2l0TGFiU25pcHBldCA9IFwic25pcHBldFwiLFxyXG4gICAgQ29kZVBlbiA9IFwicGVuXCJcclxufSIsImV4cG9ydCBlbnVtIFRvb2xiYXJJRHMge1xyXG4gICAgVGFibGVUb29sYmFyID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiLFxyXG4gICAgVGV4dFRvb2xiYXIgPSBcInRleHRGbG9hdGluZ1Rvb2xiYXJcIlxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIHNwZWNpZnlpbmcgYm91bmRhcmllcyB3aXRoaW4gYW4gZWxlbWVudC5cclxuICogQGVudW0ge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBlbnVtIEJvdW5kYXJpZXMge1xyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGZpcnN0IGxpbmUgb2YgYW4gZWxlbWVudCwgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydGluZyBib3VuZGFyeS4gKi9cclxuICAgIEZpcnN0ID0gXCJGaXJzdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGxhc3QgbGluZSBvZiBhbiBlbGVtZW50LCBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZGluZyBib3VuZGFyeS4gKi9cclxuICAgIExhc3QgPSBcIkxhc3RcIlxyXG59IiwiaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBhZGRSb3codGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydFBvc2l0aW9uID0gKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPD0gdGFibGUucm93cy5sZW5ndGgpID8gcG9zaXRpb24gOiB0YWJsZS5yb3dzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuZXdSb3cgPSB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBudW1Db2x1bW5zID0gQXJyYXkuZnJvbSh0YWJsZS5yb3dzKS5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5jZWxscy5sZW5ndGgpLCAwKTtcclxuICAgICAgICBsZXQgYWZmZWN0ZWRDZWxscyA9IFtdOyAgLy8gQXJyYXkgdG8gaG9sZCByZWZlcmVuY2VzIHRvIG5ldyBjZWxsc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3Um93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiRW50ZXIgdGV4dFwiKTtcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKFwiZWRpdGFibGVcIik7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMucHVzaChjZWxsKTsgIC8vIEFkZCBjZWxsIHJlZmVyZW5jZSB0byBhcnJheVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuY2xhc3NMaXN0LnJlbW92ZShcInRlbXBvcmFyeS1zaGFkb3dcIikpO1xyXG4gICAgICAgIH0sIDcwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFkZENvbHVtbih0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0UG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gbnVsbCA/IHBvc2l0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBhZmZlY3RlZENlbGxzID0gW107ICAvLyBBcnJheSB0byBob2xkIHJlZmVyZW5jZXMgdG8gbmV3IGNlbGxzXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGFibGUucm93c1tpXS5pbnNlcnRDZWxsKGluc2VydFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiY2VsbFwiKTtcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKFwiZWRpdGFibGVcIik7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMucHVzaChjZWxsKTsgIC8vIEFkZCBjZWxsIHJlZmVyZW5jZSB0byBhcnJheVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuY2xhc3NMaXN0LnJlbW92ZShcInRlbXBvcmFyeS1zaGFkb3dcIikpO1xyXG4gICAgICAgIH0sIDcwMCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBpc0xhc3RDb2x1bW4odGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0YWJsZS5jb250YWlucyhjZWxsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjZWxsUm93ID0gY2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgbGFzdENlbGxJblJvdyA9IGNlbGxSb3cuY2VsbHNbY2VsbFJvdy5jZWxscy5sZW5ndGggLSAxXTtcclxuICAgICAgICByZXR1cm4gY2VsbCA9PT0gbGFzdENlbGxJblJvdztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNMYXN0Um93KHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGFibGUuY29udGFpbnMoY2VsbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxhc3RSb3dJblRhYmxlID0gdGFibGUucm93c1t0YWJsZS5yb3dzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIHJldHVybiBjZWxsUm93ID09PSBsYXN0Um93SW5UYWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ29sdW1uQnlDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRkXCIgJiYgY2VsbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwidGhcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYSB0YWJsZSBjZWxsLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gcm93LnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IGNlbGwuY2VsbEluZGV4O1xyXG5cclxuICAgICAgICAvLyBBZGQgZmFkZS1vdXQgY2xhc3MgdG8gYWxsIGNlbGxzIGluIHRoZSBjb2x1bW5cclxuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRhYmxlLnJvd3NbaV0uY2VsbHNbY29sdW1uSW5kZXhdLmNsYXNzTGlzdC5hZGQoXCJmYWRlLW91dFwiKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gRGVsYXkgdGhlIGNvbHVtbiByZW1vdmFsIGZvciAzMDAgbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPCB0YWJsZS5yb3dzW2ldLmNlbGxzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNvbHVtbkluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0YWJsZS5yb3dzW2ldLmRlbGV0ZUNlbGwoY29sdW1uSW5kZXgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSwgOTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlUm93QnlDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRkXCIgJiYgY2VsbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwidGhcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYSB0YWJsZSBjZWxsLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gcm93LnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gQWRkIGZhZGUtb3V0IGNsYXNzIHRvIGFsbCBjZWxscyBpbiB0aGUgcm93XHJcbiAgICAgICAgLy8gQXJyYXkuZnJvbShyb3cuY2VsbHMpLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImZhZGUtb3V0XCIpO1xyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBEZWxheSB0aGUgcm93IHJlbW92YWwgZm9yIDMwMCBtaWxsaXNlY29uZHNcclxuXHJcbiAgICAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0YWJsZS5kZWxldGVSb3cocm93LnJvd0luZGV4KTtcclxuICAgICAgICAvLyB9LCA5MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRBY3RpdmVUYWJsZUNlbGwoKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50Py5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50IHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHN0YXRpYyBpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGFyZ2V0SGV4Q29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgIC8vICAgICBpZiAoIWFjdGl2ZUNlbGwgfHwgYWN0aXZlQ2VsbC50YWdOYW1lICE9PSAnVEQnIHx8ICFhY3RpdmVDZWxsLmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVDZWxsKTtcclxuICAgIC8vICAgICBjb25zdCBjdXJyZW50QmFja2dyb3VuZENvbG9yID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGhleEJhY2tncm91bmRDb2xvciA9IFV0aWxzLnJnYlRvSGV4KGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IpO1xyXG5cclxuICAgIC8vICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHRhcmdldEhleENvbG9yLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXRMYXN0VGFibGVDZWxsKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gdGFibGUucm93cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5yb3dzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gcm93LmNlbGxzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzW2pdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiBjZWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRGaXJzdFRhYmxlQ2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlLnJvd3NbaV07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzW2pdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiBjZWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZWlnaGJvckNlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwge1xyXG5cclxuICAgICAgICBpZiAoIWNlbGwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gKGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50KS5yb3dJbmRleDtcclxuICAgICAgICBjb25zdCBjZWxsSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93UmlnaHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50KS5jZWxsc1tjZWxsSW5kZXggKyAxXSA/PyBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbnMuQXJyb3dMZWZ0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkuY2VsbHNbY2VsbEluZGV4IC0gMV0gPz8gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93VXA6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUucm93c1tyb3dJbmRleCAtIDFdPy5jZWxsc1tjZWxsSW5kZXhdID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd0Rvd246XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUucm93c1tyb3dJbmRleCArIDFdPy5jZWxsc1tjZWxsSW5kZXhdID8/IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGNoYW5nZUNlbGxCb3JkZXJDb2xvcihcclxuICAgICAgICB0YWJsZTogSFRNTFRhYmxlRWxlbWVudCxcclxuICAgICAgICBzY29wZTogVGFibGVTY29wZXMsXHJcbiAgICAgICAgY29sb3I6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IGNlbGxzVG9DaGFuZ2U6IE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+IHwgSFRNTENvbGxlY3Rpb25PZjxIVE1MVGFibGVDZWxsRWxlbWVudD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChzY29wZSkge1xyXG4gICAgICAgICAgICBjYXNlIFRhYmxlU2NvcGVzLkNvbHVtbjpcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gKHRhYmxlLnF1ZXJ5U2VsZWN0b3IoXCJ0ZC5zZWxlY3RlZFwiKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCk/LmNlbGxJbmRleDtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoYHRkOm50aC1jaGlsZCgke2NvbHVtbkluZGV4ICsgMX0pYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5Sb3c6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGwgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKFwidGQuc2VsZWN0ZWRcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gc2VsZWN0ZWRDZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsc1RvQ2hhbmdlID0gcm93LmNlbGxzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuQ2VsbDpcclxuICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQuc2VsZWN0ZWRcIikgYXMgTm9kZUxpc3RPZjxIVE1MVGFibGVDZWxsRWxlbWVudD47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5TZWxlY3RlZENlbGxzOlxyXG4gICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZC5zZWxlY3RlZFwiKSBhcyBOb2RlTGlzdE9mPEhUTUxUYWJsZUNlbGxFbGVtZW50PjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzY29wZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2VsbHNUb0NoYW5nZSkge1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgICBBcnJheS5mcm9tKGNlbGxzVG9DaGFuZ2UpLmZvckVhY2goKGNlbGwpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlciA9IGAxcHggZG91YmxlICR7Y29sb3J9YDtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9IGAxcHggZG91YmxlICR7Y29sb3J9YDtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm94U2hhZG93ID0gYDAgMCAwIDFweCAke2NvbG9yfSBpbnNldGA7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgYm94U2hhZG93ID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaGFkb3cnKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJvcmRlciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJiYlwiKTtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm9yZGVyID0gYm9yZGVyO1xyXG4gICAgICAgICAgICAgICAgLy8gY2VsbC5zdHlsZS5ib3hTaGFkb3cgPSBib3hTaGFkb3c7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0JveCBTaGFkb3c6JywgYm94U2hhZG93KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3JkZXI6JywgYm9yZGVyKTtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBtb3ZlRm9jdXNUb0JlbG93Q2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBuZXh0Um93ID0gY2VsbC5wYXJlbnRFbGVtZW50Py5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTFRhYmxlUm93RWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgaWYgKCFuZXh0Um93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gY2VsbCBiZWxvd1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcbiAgICAgICAgY29uc3QgYmVsb3dDZWxsID0gbmV4dFJvdy5jZWxsc1tjZWxsSW5kZXhdO1xyXG4gICAgICAgIGlmICghYmVsb3dDZWxsIHx8ICFiZWxvd0NlbGwuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBlZGl0YWJsZSBjZWxsIGJlbG93XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBiZWxvd0NlbGwuZm9jdXMoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElRdWlja01lbnUgfSBmcm9tIFwiLi4vcXVpY2stbWVudS9JUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IElTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gXCJAL2NvcmUvSVNob3J0Y3V0TGlzdGVuZXJzXCI7XHJcbmltcG9ydCB7IElUYWJsZUxpc3RlbmVycyB9IGZyb20gXCJAL2NvcmUvbGlzdGVuZXJzL0lUYWJsZUxpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udGVudCBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe30pO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiY29udGVudFwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gXCIxLjNyZW1cIjtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmluY2x1ZGVGaXJzdFBhcmFncmFwaCB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZChFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGgoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENsZWFycyB0ZXh0IHNlbGVjdGlvbiB3aGVuIGluaXRpYXRpbmcgYSBkcmFnIGZyb20gZWxlbWVudHMgd2l0aCB0aGUgYC5kcmFnLWhhbmRsZXJgIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIGEgYG1vdXNlZG93bmAgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVudGlyZSBkb2N1bWVudC4gV2hlbiBhIG1vdXNlZG93blxyXG4gICAgKiBldmVudCBvY2N1cnMgb24gYW4gZWxlbWVudCB0aGF0IGlzIGEgY2hpbGQgb2YgYSBgLmRyYWctaGFuZGxlcmAgb3Igb24gdGhlIGAuZHJhZy1oYW5kbGVyYCBpdHNlbGYsXHJcbiAgICAqIGl0IGNoZWNrcyBpZiB0aGUgdGFyZ2V0IG9yIGl0cyBwYXJlbnQgaXMgYSBkZXNpZ25hdGVkIGRyYWcgaGFuZGxlci4gSWYgdHJ1ZSwgaXQgY2xlYXJzIGFueSBjdXJyZW50IHRleHQgc2VsZWN0aW9ucy5cclxuICAgICogVGhpcyBwcmV2ZW50cyB0ZXh0IGZyb20gYmVpbmcgYWNjaWRlbnRhbGx5IHNlbGVjdGVkIGR1cmluZyBkcmFnLWFuZC1kcm9wIGludGVyYWN0aW9ucywgZW5oYW5jaW5nIFVYIGluIGRyYWdnYWJsZSBpbnRlcmZhY2VzLlxyXG4gICAgKiBcclxuICAgICogQGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uT25EcmFnXHJcbiAgICAqL1xyXG4gICAgY2xlYXJTZWxlY3Rpb25PbkRyYWcoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgbGV0IHBhcmVudDogRWxlbWVudCB8IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuY2xvc2VzdChcIi5kcmFnLWhhbmRsZXJcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uT25EcmFnKCk7XHJcbiAgICAgICAgdGhpcy5yZVJlbmRlclBsYWNlaG9sZGVyKCk7XHJcblxyXG5cclxuICAgICAgICAvLyBFdmVudCBzZWxlY3RvclxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGEgY2xhc3NlICdibG9jay1zZWxlY3RlZCcgZGUgcXVhbHF1ZXIgYmxvY28gcHJldmlhbWVudGUgc2VsZWNpb25hZG9cclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWQuZm9yRWFjaChzZWxlY3RlZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTsgLy8gUmVtb3ZlIHRhYmluZGV4IHF1YW5kbyBuw6NvIGVzdMOhIG1haXMgc2VsZWNpb25hZG9cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBWZXJpZmljYSBzZSBvIGVsZW1lbnRvIGNsaWNhZG8gw6kgdW0gZmlsaG8gZGUgdW0gJ3NlcGFyYXRvcidcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50OyAvLyBDYXN0IGRvIHRhcmdldCBwYXJhIEhUTUxFbGVtZW50XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQuY2xvc2VzdChcIi5zZXBhcmF0b3Itd3JhcHBlclwiKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50QmxvY2sgPSBjdXJyZW50RWxlbWVudC5jbG9zZXN0KCcuc2VwYXJhdG9yLXdyYXBwZXInKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCBwYXJhIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jay5jbGFzc0xpc3QuYWRkKCdzZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jay5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7IC8vIEFkaWNpb25hIHRhYmluZGV4IHBhcmEgcGVybWl0aXIgZm9jb1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2suZm9jdXMoKTsgLy8gQ29sb2NhIG8gZm9jbyBubyBibG9jbyBzZWxlY2lvbmFkb1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQmx1ciwgKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbG9zZXN0KCcuc2VwYXJhdG9yLXNlbGVjdGVkJykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHRhcmdldC5jbG9zZXN0KCcuc2VwYXJhdG9yLXNlbGVjdGVkJykhO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlcGFyYXRvci5jbGFzc0xpc3QucmVtb3ZlKCdzZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgIHNlcGFyYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7IC8vIExpbXBhIG8gYXRyaWJ1dG8gcGFyYSBuw6NvIGludGVyZmVyaXIgY29tIGEgbmF2ZWdhw6fDo28gbm9ybWFsXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVhcGxpY2FyIGF0cmlidXRvcyBxdWUgZ2FyYW50ZW0gbyBmb2NvXHJcbiAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICBzZXBhcmF0b3Iuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xyXG4gICAgICAgICAgICAgICAgLy8gfSwgNTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcbiAgICAgICAgLy9lbmQgZXZlbnQgc2VsZWN0b3JcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb3BpZWRUZXh0XCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29weUVsZW1lbnRJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjb3B5T3B0aW9uIC50ZXh0LW9wdGlvbiBzcGFuXCIpIGFzIEhUTUxTcGFuRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGNvcHlFbGVtZW50SXRlbSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29waWVkIVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29weVwiO1xyXG4gICAgICAgICAgICAgICAgfSwgMTUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9Gb2N1cyBvbiBQIHdoZW4gbG9hZFxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1lZGl0b3InKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIGxldCBibG9ja3MgPSBlZGl0b3IucXVlcnlTZWxlY3RvckFsbCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gYmxvY2tzWzBdLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocC5pbm5lclRleHQgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50LXdyYXBwZXIgLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLnByZXNzZWRFbnRlck9uVGl0bGUsIHt9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgYXN5bmMgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoRE9NVXRpbHMuaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZihldmVudCwgXCIuaWdub3JlLWV2ZW50c1wiKSAmJiBldmVudC5rZXkgIT09ICdUYWInKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9vbGJhciA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyPihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5FbnRlciAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIXF1aWNrTWVudS5pc1Zpc2libGUgJiYgIXRhYmxlVG9vbGJhci5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZihET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5qb2hhbm5lcy1jb2RlXCIpKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoXCIudGFibGUtY29udHJvbGxlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5jbG9zZXN0KFwidGQsIHRoXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVDb250cm9sbGVyLnF1ZXJ5U2VsZWN0b3IoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkQmVsb3cgPSBUYWJsZVV0aWxzLm1vdmVGb2N1c1RvQmVsb3dDZWxsKHRhYmxlLCBhY3RpdmVDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2N1c2VkQmVsb3cpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZm9jdXNPbk5leHRCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCkuY2xvc2VzdChcIi5qb2hhbm5lcy1jb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgYmxvY2sgd2hlbiBwcmVzcyBFbnRlclxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnROZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5CYWNrc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2VwYXJhdG9yLXdyYXBwZXInKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0U3RhcnQgJiYgc2VsZWN0ZWRDb250ZW50Py5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLm1lcmdlV2l0aFByZXZpb3VzQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZXBhcmF0b3Itd3JhcHBlcicpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uTmV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0RW5kICYmIHNlbGVjdGVkQ29udGVudD8ubGVuZ3RoID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5tZXJnZVdpdGhOZXh0QmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgJiYgQ29udGVudC5pc0N1cnNvckF0RW5kKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgQ29udGVudC5pc0N1cnNvckF0U3RhcnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgQ29udGVudC5pc0N1cnNvck9uTGFzdExpbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgQ29udGVudC5pc0N1cnNvck9uRmlyc3RMaW5lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fUFJFVklPVVMsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiLmpvaGFubmVzLWNvZGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYkNoYXJhY3RlciA9ICdcXHUwMGEwXFx1MDBhMFxcdTAwYTBcXHUwMGEwJztcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCB0YWJDaGFyYWN0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CbHVyLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLnNhbml0aXplRWxlbWVudEV2ZW50SGFuZGxlcihldmVudCksIHRydWUpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHNhbml0aXplRWxlbWVudEV2ZW50SGFuZGxlcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY29udGVudEVkaXRhYmxlID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBET01VdGlscy5zYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZSh0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZHMgYW4gaW5wdXQgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVudGlyZSBkb2N1bWVudCB0byBoYW5kbGUgcGxhY2Vob2xkZXIgYmVoYXZpb3IgZm9yIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50cy5cclxuICAgICogVGhpcyB3b3JrYXJvdW5kIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBhZGRyZXNzIGEga25vd24gaXNzdWUgaW4gRmlyZWZveCB3aGVyZSBjb250ZW50RWRpdGFibGUgZWxlbWVudHNcclxuICAgICogZG8gbm90IHByb3Blcmx5IHJlc2V0IHRoZWlyIHBsYWNlaG9sZGVycyBhZnRlciB0aGUgY29udGVudCBpcyBkZWxldGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgKiBcclxuICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGNoZWNrcyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBpbnB1dCBldmVudCBpcyBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50IGFuZCB3aGV0aGVyIGl0IGhhcyBhXHJcbiAgICAqIGN1c3RvbSAnZGF0YS1wbGFjZWhvbGRlcicgYXR0cmlidXRlLiBJZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgZW1wdHkgKGlnbm9yaW5nIHdoaXRlIHNwYWNlcyksIHRoZSBmdW5jdGlvblxyXG4gICAgKiByZXNldHMgdGhlICdkYXRhLXBsYWNlaG9sZGVyJyB0byBlbnN1cmUgaXQgZGlzcGxheXMgY29ycmVjdGx5LCBhbmQgY2xlYXJzIGFueSByZXNpZHVhbCB0ZXh0IGNvbnRlbnQgdGhhdCBtaWdodFxyXG4gICAgKiBpbnRlcmZlcmUgd2l0aCB0aGUgcGxhY2Vob2xkZXIgZGlzcGxheS5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIHV0aWxpemUgdGhpcyB3b3JrYXJvdW5kLCBlbnN1cmUgeW91ciBjb250ZW50RWRpdGFibGUgZWxlbWVudHMgaGF2ZSBhICdkYXRhLXBsYWNlaG9sZGVyJyBhdHRyaWJ1dGUuXHJcbiAgICAqIC8vIDxkaXYgY29udGVudEVkaXRhYmxlPVwidHJ1ZVwiIGRhdGEtcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0IGhlcmUuLi5cIj48L2Rpdj5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGlucHV0IGV2ZW50IHRyaWdnZXJlZCBieSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIGRvY3VtZW50J3MgaW5wdXQtY2FwYWJsZSBlbGVtZW50cy5cclxuICAgICovXHJcbiAgICByZVJlbmRlclBsYWNlaG9sZGVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLklucHV0LCBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVBsYWNlaG9sZGVyID0gZWRpdGFibGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGN1c3RvbVBsYWNlaG9sZGVyIHx8ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRFbmQodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IHRhcmdldC5jbG9zZXN0KCcuZm9jdXNhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb2N1c2FibGVQYXJlbnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIGVuZE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5lbmRPZmZzZXQgPT09IChyYW5nZS5lbmRDb250YWluZXIudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JBdFN0YXJ0KHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIHN0YXJ0Tm9kZSA9PT0gZm9jdXNhYmxlUGFyZW50ICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0Rmlyc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGVsZW1lbnQsIDApO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlVG9wID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlVG9wID09PSBlbGVtZW50VG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0TGFzdFZpc2libGVMaW5lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgIHJhbmdlLnNldEVuZChlbGVtZW50LCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCByYW5nZUJvdHRvbSA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgICAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZUJvdHRvbSA9PT0gZWxlbWVudEJvdHRvbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGRpZEN1cnNvck1vdmUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdCA9IG9yaWdpbmFsUmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSBuZXdSYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRNb3ZlID0gIShvcmlnaW5hbFJlY3QudG9wID09PSBuZXdSZWN0LnRvcCAmJiBvcmlnaW5hbFJlY3QubGVmdCA9PT0gbmV3UmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgICAgIGlmICghZGlkTW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRpZE1vdmUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbnRlbnQge1xyXG5cclxuICAgICAgICBjb25zdCBzaG9ydGN1dExpc3RlbmVyID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElTaG9ydGN1dExpc3RlbmVycz4oXCJJU2hvcnRjdXRMaXN0ZW5lcnNcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVMaXN0ZW5lcnMgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlTGlzdGVuZXJzPihcIklUYWJsZUxpc3RlbmVyc1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnRCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBDb250ZW50IHtcclxuICAgICAgICByZXR1cm4gQ29udGVudC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9JVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9jb21tb24vRGlyZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCIuLi8uLi9jb21tb24vRE9NRWxlbWVudHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlcyB9IGZyb20gXCIuL1NlbGVjdGlvbk1vZGVcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBGbG9hdGluZ1Rvb2xiYXIgaW1wbGVtZW50cyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuICAgIHNlbGVjdGVkQ2VsbHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10gPSBbXTtcclxuICAgIGFjdHVhbEZvY3VzZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xyXG5cclxuXHJcbiAgICAvLyBUaGUgc2VsZWN0aW9uIG1vZGUgYW5kIHNlbGVjdGlvbkFjdGl2ZUZsYWcgd29yayB0b2dldGhlciB3aGVuIHdlIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluc2lkZSBhIGNlbGwgb3IgcHJlc3Mgc2hpZnQgdG8gYWN0aXZhdGUgdGhlIHNlbGVjdGlvbkFjdGl2ZUZsYWcuXHJcbiAgICAvLyBBZnRlciBhY3RpdmF0aW5nIHRoZSBmbGFnLCB3ZSBjYW4gc2VsZWN0IHRleHQgaW5zaWRlIGEgY2VsbC4gSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgdGV4dCBpbnNpZGUgdGhlIGNlbGwgdXNpbmcgc2hpZnQgKyBkaXJlY3Rpb25hbCBrZXlzIG9yIHBsYWNlIHRoZSBjdXJzb3Igb3V0c2lkZVxyXG4gICAgLy8gdGhlIGFjdGl2ZSBjZWxsLCBpdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGVudGVyIGNlbGwgc2VsZWN0aW9uIG1vZGUuIFdlIGNoYW5nZSB0aGUgc2VsZWN0aW9uIG1vZGUgaW4gdGhlc2UgY2FzZXMuXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlcyA9IFNlbGVjdGlvbk1vZGVzLlRleHQ7IC8vIFRoZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlXHJcbiAgICBzZWxlY3Rpb25GbGFnOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgdG8gdHJhY2sgd2hldGhlciB0ZXh0IHNlbGVjdGlvbiBpcyBhY3RpdmVcclxuICAgIHNlbGVjdGVkVGV4dDogc3RyaW5nID0gXCJcIjsgLy8gU3RvcmFnZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaywgdGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUgPSB0aGlzLmNsZWFyQW5kSGlkZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4Lk1vZGVyYXRlbHlJbXBvcnRhbnQ7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCB0aGlzLmhhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIHRoaXMuaGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVTdGFydFNlbGVjdGlvbkluQ2VsbEtleURvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXl1cCwgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hVSUV2ZW50KCk7XHJcblxyXG4gICAgICAgIHN1cGVyLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjZWxsICYmICFjZWxsLm1hdGNoZXMoJy5maWd1cmUtZW1iZWQtY29udGFpbmVyIHRkJykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJNb3VzZURvd24gZXZlbnQgb246IFwiLCBldmVudC50YXJnZXQpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsICE9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGNlbGwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2Rlcy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBTZWxlY3Rpb25Nb2Rlcy5DZWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uU3RhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50Q2VsbCAmJiAhY3VycmVudENlbGwubWF0Y2hlcygnLmdpc3QgdGQnKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRW50ZXIgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWxlcnQoXCJqdW1wIHRvIG5leHQgbGluZVwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVzY2FwZSAmJiB0aGlzLmNhbkhpZGUgJiYgIVRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkuaXNWaXNpYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVTdGFydFNlbGVjdGlvbkluQ2VsbEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudENlbGwgJiYgIWN1cnJlbnRDZWxsLm1hdGNoZXMoJy5naXN0IHRkJykpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5yZXBlYXQgJiYgZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRmxhZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2Rlcy5UZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENlbGwoY3VycmVudENlbGwpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUNlbGxTZWxlY3Rpb25Db250aW51YXRpb25PbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudENlbGwgJiYgIWN1cnJlbnRDZWxsLm1hdGNoZXMoJy5naXN0IHRkJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gU2VsZWN0aW9uTW9kZXMuQ2VsbCAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkuc3RhcnRzV2l0aCgnQXJyb3cnKSAmJiAhZXZlbnQucmVwZWF0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY3VycmVudENlbGwuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDZWxsID0gVGFibGVVdGlscy5nZXROZWlnaGJvckNlbGwodGFibGUsIGN1cnJlbnRDZWxsLCBldmVudC5rZXkgYXMgRGlyZWN0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGN1cnJlbnRDZWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKG5leHRDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplVGV4dCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dFxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXHJcbiAgICAgICAgICAgIC50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbiBmcm9tIHRoZSBkb2N1bWVudFxyXG4gICAgKiB3aXRoIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dC4gSWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1hdGNoZXMgdGhlIHByZXZpb3VzbHkgc3RvcmVkXHJcbiAgICAqIHNlbGVjdGlvbiwgaXQgc3dpdGNoZXMgdGhlIHNlbGVjdGlvbiBtb2RlIHRvIGNlbGwgc2VsZWN0aW9uIGFuZCByZXNldHMgdGhlIHNlbGVjdGVkIHRleHQuXHJcbiAgICAqIElmIHRoZXJlIGlzIGEgbmV3IHNlbGVjdGlvbiAoYWN0dWFsU2VsZWN0aW9uIGlzIG5vdCBlbXB0eSksIGl0IHVwZGF0ZXMgdGhlIHN0b3JlZCBzZWxlY3RlZCB0ZXh0XHJcbiAgICAqIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxyXG4gICAgKlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVUZXh0KHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENlbGwubWF0Y2hlcygnLmdpc3QgdGQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRleHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQoKGN1cnJlbnRDZWxsLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8oY3VycmVudENlbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJhY3Rpb24ga2VlcHMgdGhlIG1lbnUgdmlzaWJsZSBhZnRlciBhbGwgdGV4dCBpcyBzZWxlY3RlZCwgZW5oYW5jaW5nIHVzZXIgZW5nYWdlbWVudC4gXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBwcmVzc2VzIGEgZGlyZWN0aW9uYWwga2V5IGFnYWluIGJleW9uZCB0aGlzIHBvaW50LCB0aGUgbWVudSBpcyBoaWRkZW4gYW5kIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgaW5pdGlhdGVkLCBcclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbWxpbmluZyB0aGUgaW50ZXJmYWNlIGFuZCBmb2N1c2luZyBvbiBzdWJzZXF1ZW50IHRhc2tzLlxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgKGF0U3RhcnQgfHwgYXRFbmQpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGFjdHVhbFNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3Rpb24gZmxhZyBpcyBzZXQsIGluZGljYXRpbmcgdGhhdCBzZWxlY3Rpb24gdXBkYXRlcyBzaG91bGQgYmUgbW9uaXRvcmVkXHJcbiAgICAvLyAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgLy8gICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIGRvY3VtZW50XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKS50cmltKCkgfHwgXCJcIik7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgY3VycmVudENlbGxUZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KChjdXJyZW50Q2VsbC50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IGlzVGhlRW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uPy5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25SYW5nZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0T2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxUZXh0TGVuZ3RoID0gY3VycmVudENlbGxUZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0IHx8IGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNlbGwgdGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpc1RoZUVuZCA9IHNlbGVjdGlvbkVuZE9mZnNldCA+PSBjZWxsVGV4dExlbmd0aDtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgfHwgZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93VXApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgY2VsbCB0ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzVGhlRW5kID0gc2VsZWN0aW9uU3RhcnRPZmZzZXQgPT09IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gbWF0Y2hlcyB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHRcclxuICAgIC8vICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgaXNUaGVFbmQpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSB0aGUgc2FtZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgY2hhbmdlZCxcclxuICAgIC8vICAgICAgICAgICAgIC8vIHNvIHN3aXRjaCB0byBjZWxsIHNlbGVjdGlvbiBtb2RlIGFuZCByZXNldCB0aGUgc3RvcmVkIHRleHRcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24sIHVwZGF0ZSB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQgdG8gdGhlIG5ldyB2YWx1ZVxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBhY3R1YWxTZWxlY3Rpb247XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBmb2N1c2VkIGNlbGwsIGFuZCBpZiBzbywgc3dpdGNoZXMgdGhlXHJcbiAgICAqIHNlbGVjdGlvbiBtb2RlIHRvIGNlbGwgc2VsZWN0aW9uIG1vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIG1vdXNlIGV2ZW50IHRoYXQgdHJpZ2dlcnMgdGhpcyBmdW5jdGlvbiwgdHlwaWNhbGx5IGludm9sdmluZyBtb3VzZSBtb3ZlbWVudC5cclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZyAmJiB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjZWxsUmVjdCA9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVggPSBldmVudC5jbGllbnRYO1xyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVkgPSBldmVudC5jbGllbnRZO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEobW91c2VYID49IGNlbGxSZWN0LmxlZnQgJiYgbW91c2VYIDw9IGNlbGxSZWN0LnJpZ2h0ICYmIG1vdXNlWSA+PSBjZWxsUmVjdC50b3AgJiYgbW91c2VZIDw9IGNlbGxSZWN0LmJvdHRvbSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50Q2VsbCkge1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb25TdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkU2VsZWN0ZWRDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2hhbmdlIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsIG9ubHkgaWYgYXQgc2FtZSB0YWJsZVxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgY2VsbC5mb2N1cygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkQ2VsbCA9IHRoaXMuc2VsZWN0ZWRDZWxsc1t0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTZWxlY3RlZENlbGxUYWJsZSA9IGxhc3RTZWxlY3RlZENlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGxUYWJsZSA9IGNlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRDZWxsVGFibGUgPT09IGN1cnJlbnRDZWxsVGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZENlbGxzLmluZGV4T2YoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSB0aGUgYWN0dWFsIGZvY3VzZWQgY2VsbCBvbmx5IGlmIGF0IHNhbWUgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQ2VsdWxhIGrDoSBmYXogcGFydGUgZGEgbGlzdGEgYXBlbmFzIGZvY2EgZSBjb250aW51YVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHRoaXMuaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmIChUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaWQgPT0gZGV0YWlscy50YXJnZXRJZCEpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGZvY3VzZWQgY2VsbCBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0QWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2godGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8odGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpO1xyXG5cclxuICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICBsZXQgYmxvY2tUb29sYmFyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgYmxvY2tUb29sYmFyID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIuY2xhc3NMaXN0LmFkZChcImQtbm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLnNob3coKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CbHVyLCAoKSA9PiB0aGlzLmNsZWFyQW5kSGlkZShibG9ja1Rvb2xiYXIpLCB7IHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIGV4ZWNDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG5cclxuICAgIC8vICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XHJcblxyXG4gICAgLy8gICAgIGlmIChhY3RpdmVDZWxsKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHRhYmxlID0gYWN0aXZlQ2VsbC5jbG9zZXN0KCd0YWJsZScpITtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCd0ZC5zZWxlY3RlZCcpO1xyXG5cclxuICAgIC8vICAgICAgICAgc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgKGNlbGwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHZhbHVlO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcclxuXHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcImNlbGwgbm90IGZvdW5kXCIpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpIHtcclxuXHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJhY2tncm91bmRDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yUmVkXSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JSZWQpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZWVuXSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmVlbik7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yQmx1ZV0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yQmx1ZSk7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yWWVsbG93XSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZXldID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZXkpO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhiYWNrZ3JvdW5kQ29sb3JzKS5mb3JFYWNoKChbY29sb3IsIGFjdGl2ZV0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHJlc2V0Q2hlY2tlZENvbG9yKCkge1xyXG5cclxuICAgIC8vICAgICBjb25zdCBkcm9wZG93bkNvbG9yID0gdGhpcy5kcm9wZG93bnMuZmluZChlID0+IGUuaWQgPT0gXCJ0YWJsZUNvbG9yT3B0aW9uc01lbnVcIikhO1xyXG5cclxuICAgIC8vICAgICBkcm9wZG93bkNvbG9yLmRyb3Bkb3duTGlzdC5kcm9wZG93bkl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICBpdGVtLnJlc2V0QWN0aXZlSWNvbigpO1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkcm9wZG93bkNvbG9yLmRyb3Bkb3duTGlzdC5kcm9wZG93bkl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBjb2xvciA9IGl0ZW0uZ2V0TGVmdEljb25CYWNrZ3JvdW5kQ29sb3IoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChjb2xvciAmJiB0aGlzLmFyZUFsbFNlbGVjdGVkQ2VsbHNTYW1lQmdDb2xvcihjb2xvcikgJiYgY29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpdGVtLmNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUoKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgMDtcclxuXHJcbiAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcclxuXHJcbiAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRTZWxlY3Rpb25TdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2Rlcy5UZXh0O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRmxhZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBhbGxUYWJsZUNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQnKTtcclxuICAgICAgICBhbGxUYWJsZUNlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQW5kSGlkZShibG9ja1Rvb2xiYXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKGJsb2NrVG9vbGJhcikge1xyXG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIuY2xhc3NMaXN0LnJlbW92ZShcImQtbm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0QWJvcnRDb250cm9sbGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBjb25zdCB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlPihcIklUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyKGZvY3VzU3RhY2ssIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IENvbG9ySWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51QnV0dG9uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVPcGVyYXRpb25zU2VydmljZT4oXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVUb29sYmFyID0gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmREcm9wZG93bihUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRhYmxlT3B0aW9ucyh0YWJsZU9wZXJhdGlvblNlcnZpY2UpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGFibGVPcGVyYXRpb25zU2VwYXJhdG9yXCIpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kRHJvcGRvd24oVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50YWJsZUNvbG9yRHJvcGRvd24oKSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVUb29sYmFyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0YWJsZU9wdGlvbnModGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCB0dXJuSW50b0Jhckxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcInRhYmxlT3B0aW9uc1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0YWJsZU9wdGlvbnNcIiwgXCJPcHRpb25zXCIsIHR1cm5JbnRvQmFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9Ecm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0YWJsZU9wdGlvbnNNZW51XCIsIHR1cm5JbnRvQmFyQnV0dG9uLCB0dXJuSW50b0Jhckxpc3QpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgQ29sdW1uXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbkxlZnQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uTGVmdCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJMZWZ0XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uUmlnaHQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uUmlnaHQsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUmlnaHRcIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgUm93XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5Sb3dBYm92ZSwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJBYm92ZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuUm93QmVsb3csIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiQmVsb3dcIikpO1xyXG5cclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiUmVtb3ZlXCIpKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVsZXRlQ29sdW1uSXRlbSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZUNvbHVtbiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5kZWxldGVTd2VlcCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJDb2x1bW5cIik7XHJcbiAgICAgICAgZGVsZXRlQ29sdW1uSXRlbS5hZGRDc3NDbGFzcyhcImRhbmdlci1vcHRpb25cIik7XHJcbiAgICAgICAgLy8gZGVsZXRlQ29sdW1uSXRlbS5hdHRhY2hPbkZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuVG9tYXRvKTtcclxuICAgICAgICAvLyBkZWxldGVDb2x1bW5JdGVtLmF0dGFjaE9uTG9zZUZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuT3JpZ2luYWxUYWJsZUNvbG9yKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChkZWxldGVDb2x1bW5JdGVtKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBkZWxldGVSb3dJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZVJvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuZGVsZXRlU3dlZXAsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUm93XCIpO1xyXG4gICAgICAgIGRlbGV0ZVJvd0l0ZW0uYWRkQ3NzQ2xhc3MoXCJkYW5nZXItb3B0aW9uXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGRlbGV0ZVJvd0l0ZW0uYXR0YWNoT25Gb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLlRvbWF0byk7XHJcbiAgICAgICAgLy8gZGVsZXRlUm93SXRlbS5hdHRhY2hPbkxvc2VGb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLk9yaWdpbmFsVGFibGVDb2xvcik7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQoZGVsZXRlUm93SXRlbSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdHVybkludG9Ecm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGFibGVDb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJjb2xvclRhYmxlT3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcImNvbG9yVGFibGVCdXR0b25cIiwgbmV3IENvbG9ySWNvbihcIndoaXRlXCIpLmh0bWxFbGVtZW50LCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0YWJsZUNvbG9yT3B0aW9uc01lbnVcIiwgY29sb3JCdXR0b24sIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKGNvbG9yRHJvcGRvd25MaXN0LCBcIkJhY2tncm91bmRcIikpO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbEJhY2tncm91bmRDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25SZWRcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclJlZC5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uR3JlZW5cIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxHcmVlbiwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbikuaHRtbEVsZW1lbnQsIFwiR3JlZW5cIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvckdyZWVuLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkJsdWVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxCbHVlLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpLmh0bWxFbGVtZW50LCBcIkJsdWVcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvckJsdWUuYWRkQ2xhc3MoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25ZZWxsb3dcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclllbGxvdy5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JleSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25HcmV5XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JDZWxsR3JleSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KS5odG1sRWxlbWVudCwgXCJHcmV5XCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5LmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbk5vbmVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclJlZCk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbik7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VwYXJhdG9yKGlkOiBzdHJpbmcpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKGlkKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBFbWJlZFRvb2wsIEVtYmVkVHlwZXMgfSBmcm9tIFwiQC9jb3JlL0VtYmVkVG9vbFwiO1xuaW1wb3J0IHsgQ29tbW9uQ2xhc3NlcyB9IGZyb20gXCJAL2NvbW1vbi9Db21tb25DbGFzc2VzXCI7XG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcblxuZXhwb3J0IGNsYXNzIE1lZGlhSW5wdXR0ZXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xuXG4gICAgaWQ6IHN0cmluZztcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBpZCA9IFwibWVkaWFJbnB1dHRlclwiO1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG5cbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGFpbmVyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLnpJbmRleCA9IFpJbmRleC5FeHRyZW1lbHlJbXBvcnRhbnQ7XG5cbiAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiKTtcbiAgICAgICAgaGVhZC5jbGFzc0xpc3QuYWRkKFwibmF2XCIsIFwibmF2LXVuZGVybGluZVwiKTtcblxuICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmNyZWF0ZU5hdkl0ZW0oXCJ1cGxvYWRUYWJcIiwgXCJVcGxvYWRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgZW1iZWRUYWIgPSB0aGlzLmNyZWF0ZU5hdkl0ZW0oXCJlbWJlZFRhYlwiLCBcIkVtYmVkXCIpO1xuXG4gICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQodXBsb2FkVGFiKTtcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbWJlZFRhYik7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcInRhYi1jb250ZW50XCIpO1xuXG4gICAgICAgIGNvbnN0IHVwbG9hZENvbnRlbnQgPSB0aGlzLmNyZWF0ZVVwbG9hZENvbnRlbnQoKTtcbiAgICAgICAgY29uc3QgZW1iZWRDb250ZW50ID0gdGhpcy5jcmVhdGVFbWJlZENvbnRlbnQoKTtcblxuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKHVwbG9hZENvbnRlbnQpO1xuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVtYmVkQ29udGVudCk7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZCk7XG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcbiAgICB9XG5cbiAgICBjcmVhdGVOYXZJdGVtKGlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xuICAgICAgICBsaS5jbGFzc0xpc3QuYWRkKFwibmF2LWl0ZW1cIik7XG4gICAgICAgIGxpLmlkID0gaWQ7XG5cbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICBhLmNsYXNzTGlzdC5hZGQoXCJuYXYtbGlua1wiKTtcbiAgICAgICAgYS5pbm5lclRleHQgPSB0ZXh0O1xuICAgICAgICBsaS5hcHBlbmRDaGlsZChhKTtcblxuICAgICAgICByZXR1cm4gbGk7XG4gICAgfVxuXG4gICAgY3JlYXRlVXBsb2FkQ29udGVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdi5pZCA9IFwidXBsb2FkQ29udGVudFwiO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcInVwbG9hZC1jb250ZW50XCIsIFwiY29udGVudC1kYXRhXCIpO1xuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XG4gICAgICAgIGxhYmVsLmlubmVyVGV4dCA9IFwiVXBsb2FkIGZpbGVcIjtcblxuICAgICAgICBjb25zdCB0ZXh0SW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRleHRJbmZvLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0LWluZm9cIik7XG4gICAgICAgIHRleHRJbmZvLmlubmVyVGV4dCA9IFwiTWF4aW11bSBmaWxlIHNpemU6IDVNQlwiO1xuXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0SW5mbyk7XG5cbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9XG5cbiAgICBjcmVhdGVFbWJlZENvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuaWQgPSBcImVtYmVkQ29udGVudFwiO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImNvbnRlbnQtZGF0YVwiLCBcImVtYmVkLWNvbnRlbnRcIik7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGlucHV0LnR5cGUgPSBcInRleHRcIjtcblxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImJsdWUtYnV0dG9uXCIpO1xuICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gXCJFbWJlZFwiO1xuXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKCkgPT4gdGhpcy5lbWJlZEdlbmVyaWMoaW5wdXQpKTtcblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmVtYmVkR2VuZXJpYyhpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkZvY3VzaW4sICgpID0+IHRoaXMucmVzZXRJbnB1dEJnQ29sb3IoaW5wdXQpKTtcblxuICAgICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIHJlc2V0SW5wdXRCZ0NvbG9yKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiXCI7XG4gICAgfVxuXG4gICAgYXN5bmMgZW1iZWRHZW5lcmljKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICAgICAgY29uc3Qgc3RyaW5nVVJMID0gaW5wdXQudmFsdWU7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBmb2N1c2VkRWxlbWVudD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKT8uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoc3RyaW5nVVJMKTtcblxuICAgICAgICAgICAgaWYgKCFVdGlscy5pc1ZhbGlkVXJsKHVybC50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgVVJMXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5vdCBlbGVtZW50IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENvbnRlbnRUeXBlcy5JbWFnZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IEVtYmVkVG9vbC5lbWJlZEltYWdlKHN0cmluZ1VSTCwgZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuSWZyYW1lKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZFR5cGUgPSBFbWJlZFRvb2wuZGV0ZXJtaW5lRW1iZWRUeXBlKHN0cmluZ1VSTCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGVtYmVkVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlVmlkZW86XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlVmlkZW9Bc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlUGxheWxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlUGxheWxpc3RBc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlU2hvcnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5VHJhY2s6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlQbGF5bGlzdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUFydGlzdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUVwaXNvZGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlTaG93OlxuICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRUb29sLmVtYmVkU3BvdGlmeUNvbnRlbnQodXJsLCBmb2N1c2VkRWxlbWVudCwgZW1iZWRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLkdpdEh1Ykdpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRHaXN0QXNTY3JpcHQodXJsLCBmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuQ29kZVBlbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZENvZGVwZW5Bc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZW1iZWRDb250ZW50IGlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYigyNTMsIDIyMiwgMjIyKVwiO1xuICAgICAgICAgICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzaGFrZS1hbmltYXRpb25cIik7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZShcInNoYWtlLWFuaW1hdGlvblwiKTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgc2V0IGlucHV0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpbnB1dFRleHQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKTtcbiAgICAgICAgaWYgKGlucHV0VGV4dCkge1xuICAgICAgICAgICAgaW5wdXRUZXh0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJmbGV4XCI7XG4gICAgfVxuXG5cbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgdXBsb2FkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3VwbG9hZFRhYlwiKTtcbiAgICAgICAgdXBsb2FkVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoJ3VwbG9hZFRhYicsICd1cGxvYWRDb250ZW50Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpO1xuICAgICAgICBlbWJlZFRhYj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKCdlbWJlZFRhYicsICdlbWJlZENvbnRlbnQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVyS2V5ZG93bkV2ZW50cy5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaGFuZGxlckNsaWNrRXZlbnRzLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHN1cGVyLmF0dGFjaFVJRXZlbnQoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVyS2V5ZG93bkV2ZW50cyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZXJDbGlja0V2ZW50cyhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zdCBlbWJlZEltYWdlID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQoZXZlbnQsIFwiZW1iZWRJbWFnZVwiKTtcbiAgICAgICAgLy8gaWYgKGVtYmVkSW1hZ2UpIHtcbiAgICAgICAgLy8gICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuZW1iZWRJbWFnZShlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuaGlkZU1lZGlhSW5wdXR0ZXJPbkV4dGVybmFsQ2xpY2soZXZlbnQpXG4gICAgICAgIHRoaXMuc2hvd01lZGlhSW5wdXR0ZXJPbk1lZGlhSW5wdXR0ZXJFbGVtZW50Q2xpY2soZXZlbnQpO1xuICAgIH1cblxuXG4gICAgaGlkZU1lZGlhSW5wdXR0ZXJPbkV4dGVybmFsQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVkaWFJbnB1dHRlciA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkKGV2ZW50LCB0aGlzLmlkKTtcbiAgICAgICAgY29uc3QgY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRPbkNsaWNrKTtcbiAgICAgICAgaWYgKCFtZWRpYUlucHV0dGVyICYmICFjbGlja2VkT25FbGVtZW50V2l0aFNob3dNZWRpYUlucHV0Q2xhc3MgJiYgdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93TWVkaWFJbnB1dHRlck9uTWVkaWFJbnB1dHRlckVsZW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRPbkVsZW1lbnRXaXRoU2hvd01lZGlhSW5wdXRDbGFzcyA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0T25DbGljayk7XG4gICAgICAgIGlmIChjbGlja2VkT25FbGVtZW50V2l0aFNob3dNZWRpYUlucHV0Q2xhc3MpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2goY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGZpbmRDbGFzc1dpdGhTdWZmaXgoZWxlbWVudDogRWxlbWVudCwgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAuKiR7c3VmZml4fSRgKTtcblxuICAgICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cbiAgICBnZXRUYWIodGFiSWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJJZCk7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250ZW50SWQpO1xuICAgIH1cblxuICAgIHNldEFjdGl2ZVRhYih0YWJJZDogc3RyaW5nLCBjb250ZW50SWQ6IHN0cmluZykge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2LWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb250ZW50LWRhdGEnKS5mb3JFYWNoKGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdldFRhYih0YWJJZCk/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gdGhpcy5nZXRDb250ZW50KGNvbnRlbnRJZCk7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIik7XG5cbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93KCk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGxhc3RGb2N1c2VkID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcblxuICAgICAgICBjb25zdCBzaG93SW5wdXRNZWRpYSA9IGxhc3RGb2N1c2VkPy5xdWVyeVNlbGVjdG9yKGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0T25DbGlja31gKSB8fCBsYXN0Rm9jdXNlZD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2t9YCk7XG5cbiAgICAgICAgaWYgKHNob3dJbnB1dE1lZGlhKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0UGxhY2Vob2xkZXIgPSB0aGlzLmZpbmRDbGFzc1dpdGhTdWZmaXgoc2hvd0lucHV0TWVkaWEsIFwiLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIik7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0UGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0UGxhY2Vob2xkZXIodGV4dFBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xuXG4gICAgICAgICAgICBjb25zdCBhY3RpdmF0ZU1lZGlhVXBsb2FkID0gbGFzdEZvY3VzZWQucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dFVwbG9hZH1gKSB8fCBsYXN0Rm9jdXNlZC5jbG9zZXN0KGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0VXBsb2FkfWApO1xuICAgICAgICAgICAgY29uc3QgdXBsb2FkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3VwbG9hZFRhYlwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRDb250ZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3VwbG9hZENvbnRlbnRcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbWJlZENvbnRlbnQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZW1iZWRDb250ZW50XCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBJZiBtZWRpYSB1cGxvYWQgaXMgYWN0aXZlLCB0aGUgbWVkaWFJbnB1dHRlciB1c2VzIG1lZGlhIHVwbG9hZCBhcyB0aGUgZGVmYXVsdC5cbiAgICAgICAgICAgIGlmIChhY3RpdmF0ZU1lZGlhVXBsb2FkICYmIHVwbG9hZFRhYiAmJiB1cGxvYWRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuXG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgZW1iZWRDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGxvYWRUYWIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgZW1iZWRDb250ZW50LmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8obGFzdEZvY3VzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIuc2hvdygpO1xuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZENvbnRlbnQgaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICAgIGlmIChpbnB1dCAmJiB0aGlzLmlzRWxlbWVudFZpc2libGUoaW5wdXQpKSB7XG5cbiAgICAgICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0SW5wdXRQbGFjZWhvbGRlcihlbWJlZDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkQ29udGVudCBpbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgICAgIGlmIChlbWJlZCA9PSBcImltYWdlLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIikge1xuICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL2ltYWdlLmpwZ1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWJlZCA9PSBcInlvdXR1YmUtZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tLy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWJlZCA9PSBcInNwb3RpZnktZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCBcImh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS8uLi5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1iZWQgPT0gXCJnaXRodWItZ2lzdC1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtYmVkID09IFwiY29kZXBlbi1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9jb2RlcGVuLmlvLy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiUGFzdGUgVVJMIGhlcmUuLi5cIik7XG4gICAgfVxuXG4gICAgaXNFbGVtZW50VmlzaWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBcIlwiO1xuICAgICAgICBzdXBlci5oaWRlKCk7XG4gICAgfVxuXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldE1pZHBvaW50ID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpO1xuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gdGFyZ2V0TWlkcG9pbnQgLSAodGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aCAvIDIpO1xuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XG5cbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XG4gICAgfVxufSIsImltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZWRpYUlucHV0dGVyQnVpbGRlciB7XHJcbiAgICBzdGF0aWMgYnVpbGQoKTogTWVkaWFJbnB1dHRlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhSW5wdXR0ZXIgPSBuZXcgTWVkaWFJbnB1dHRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWVkaWFJbnB1dHRlcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvclwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja0J1aWxkZXIgfSBmcm9tIFwiLi9BZGRCbG9ja0J1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIH0gZnJvbSBcIi4vVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWlja01lbnVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRpdGxlQnVpbGRlciB9IGZyb20gXCIuL1RpdGxlQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBDb250ZW50QnVpbGRlciB9IGZyb20gXCIuL0NvbnRlbnRCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXJCdWlsZGVyIH0gZnJvbSBcIi4vTWVkaWFJbnB1dHRlckJ1aWxkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0b3JCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogRWRpdG9yIHtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gRWRpdG9yLmdldEluc3RhbmNlKFxyXG4gICAgICAgICAgICBUaXRsZUJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQ29udGVudEJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQWRkQmxvY2tCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBRdWlja01lbnVCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgTWVkaWFJbnB1dHRlckJ1aWxkZXIuYnVpbGQoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiBlZGl0b3I7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9lZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCBpY29ucyBmcm9tIFwiLi4vYXNzZXRzL2ltZy9pY29ucy5zdmdcIjtcclxuaW1wb3J0IHsgRWRpdG9yQnVpbGRlciB9IGZyb20gXCIuL0VkaXRvckJ1aWxkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBTaW5nbGV0b24gY2xhc3MgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGFuZCBtYW5hZ2luZyB0aGUgdXNlciBpbnRlcmZhY2Ugb2YgdGhlIGVkaXRvci5cclxuICogRW5zdXJlcyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFVJQnVpbGRlciBjYW4gZXhpc3QsIG1hbmFnaW5nIHRoZSBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVJQnVpbGRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVJQnVpbGRlcjtcclxuXHJcbiAgICBwcml2YXRlIGVkaXRvcjogRWRpdG9yO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgVUlCdWlsZGVyIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgVUlCdWlsZGVyIGluc3RhbmNlIHdpdGggYSBnaXZlbiBlZGl0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VkaXRvcn0gZWRpdG9yIFRoZSBlZGl0b3IgaW5zdGFuY2UgdG8gYmUgbWFuYWdlZCBieSBVSUJ1aWxkZXIuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIGFuIGluc3RhbmNlIG9mIFVJQnVpbGRlciBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvcikge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XHJcblxyXG4gICAgICAgIFVJQnVpbGRlci5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGdldCBvciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVUlCdWlsZGVyLlxyXG4gICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgc2luZ2xldG9uIHBhdHRlcm4gYW5kIGVuc3VyZXMgdGhhdCBVSUJ1aWxkZXIgaXMgb25seSBpbnN0YW50aWF0ZWQgb25jZS5cclxuICAgICAqIEByZXR1cm5zIHtVSUJ1aWxkZXJ9IFJldHVybnMgdGhlIGV4aXN0aW5nIG9yIG5ldyBVSUJ1aWxkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBidWlsZCgpOiBVSUJ1aWxkZXIge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBVSUJ1aWxkZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFVJQnVpbGRlcihFZGl0b3JCdWlsZGVyLmJ1aWxkKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVpbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgYnkgaW5zZXJ0aW5nIG5lY2Vzc2FyeSBpY29ucyBhbmQgcmV0dXJuaW5nIHRoZSBlZGl0b3IgaW5zdGFuY2UuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHRvIHN0YXJ0IHRoZSBlZGl0b3IgYW5kIHByZXBhcmUgYWxsIFVJIGNvbXBvbmVudHMuXHJcbiAgICAgKiBAcmV0dXJucyB7RWRpdG9yfSBUaGUgaW5pdGlhbGl6ZWQgZWRpdG9yIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzdGFydCgpOiBFZGl0b3Ige1xyXG5cclxuICAgICAgICB0aGlzLmluc2VydEljb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5zZXJ0cyBhIGNvbnRhaW5lciB3aXRoIFNWRyBpY29ucyBpbnRvIHRoZSBkb2N1bWVudCBib2R5LiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXRcclxuICAgICogdGhlIGljb25zIGFyZSBvbmx5IGluc2VydGVkIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgZW50cmllcy5cclxuICAgICovXHJcbiAgICBpbnNlcnRJY29ucygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdmctaWNvbnMtY29udGFpbmVyJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ZnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgICAgICBzdmdDb250YWluZXIuaW5uZXJIVE1MID0gaWNvbnM7XHJcbiAgICAgICAgICAgIHN2Z0NvbnRhaW5lci5jbGFzc05hbWUgPSAnc3ZnLWljb25zLWNvbnRhaW5lcic7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN2Z0NvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCIuL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXNcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIENlbnRyYWwgY29tbWFuZCBkaXNwYXRjaGVyIGNsYXNzIGZvciBoYW5kbGluZyB2YXJpb3VzIGVkaXRvciBjb21tYW5kcyByZWxhdGVkIHRvIHRleHQgYW5kIGJsb2NrIG1hbmlwdWxhdGlvbi5cclxuICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG5lZWRlZCB0byBleGVjdXRlIGNvbW1hbmRzIHN1Y2ggYXMgYm9sZCwgaXRhbGljLCB1bmRlcmxpbmUsIGNvbG9yIGNoYW5nZXMsIGFuZCBzdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgdG8gY29udGVudCBibG9ja3Mgd2l0aGluIGFuIGVkaXRvci5cclxuICpcclxuICogQGNsYXNzXHJcbiAqIEBzaW5nbGV0b25cclxuICogTWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSB0cmlnZ2VyZWQgYnkgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIGZvciBjdXN0b20gZXZlbnRzIHdoaWNoIGRpY3RhdGUgdGhlIHR5cGUgb2YgY29tbWFuZCB0byBiZSBleGVjdXRlZC5cclxuICpcclxuICogRXhhbXBsZSB1c2FnZTpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjb25zdCBjb21tYW5kRGlzcGF0Y2hlciA9IENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCk7XHJcbiAqIGNvbW1hbmREaXNwYXRjaGVyLmxpc3RlbigpOyAgLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBjb21tYW5kIGFuZCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy5cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpc3BhdGNoZXIge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tYW5kRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgYXR0ZW1wdGVkIHRvIGJlIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdCB0byBpbnN0YW50aWF0ZSBzaW5nbGV0b24gYENvbW1hbmREaXNwYXRjaGVyYCBtb3JlIHRoYW4gb25jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gdGV4dE9wZXJhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgICogQHJldHVybnMge0NvbW1hbmREaXNwYXRjaGVyfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb21tYW5kRGlzcGF0Y2hlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb21tYW5kRGlzcGF0Y2hlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgdGV4dE9wZXJhdGlvblNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRleHRPcGVyYXRpb25zU2VydmljZT4oXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcblxyXG4gICAgICAgIGlmICghQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UgPSBuZXcgQ29tbWFuZERpc3BhdGNoZXIoYmxvY2tPcGVyYXRpb25zU2VydmljZSwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBsaXN0ZW5lcnMgZm9yIHZhcmlvdXMgZWRpdG9yLXJlbGF0ZWQgZXZlbnRzIHN1Y2ggYXMgY29tbWFuZCByZXF1ZXN0cyBhbmQgc2VsZWN0aW9uIGNoYW5nZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHRoaXMuaGFuZGxlQ29tbWFuZEV2ZW50IGFzIEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmZvY3VzT25GaXJzdFJlcXVlc3RlZCwgdGhpcy5oYW5kbGVGb2N1c09uRmlyc3RSZXF1ZXN0ZWRFdmVudCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMucHJlc3NlZEVudGVyT25UaXRsZSwgKCkgPT4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmNyZWF0ZUFOZXdQYXJhZ3JhcGhGcm9tVGl0bGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGNvbW1hbmQgZXZlbnRzIGRpc3BhdGNoZWQgZnJvbSBVSSBjb21wb25lbnRzIG9yIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD59IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgY29tbWFuZCwgc2hvd1VJLCB2YWx1ZSwgdGFyZ2V0QmxvY2tUeXBlLCBibG9jaywgc2NvcGUgfSA9IGV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmxpbmtSZWFkeVRvSW5zZXJ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5saW5rUmVhZHlUb0luc2VydH0gcmVxdWlyZXMgdmFsdWVgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNJbnNlcnRMaW5rKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVMaW5rOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1RvZ2dsZUxpbmsoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVCb2xkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0JvbGQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0lubGluZUNvZGUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJdGFsaWM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjSXRhbGljKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1VuZGVybGluZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVN0cmlrZVRocm91Z2g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjU3RyaWtlVGhyb3VnaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0hpbGl0ZUNvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvcmVDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IGVsZW1lbnQgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIGJsb2NrLmApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRyYW5zZm9ybUJsb2NrKHZhbHVlLCBibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuZHVwbGljYXRlQmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0R1cGxpY2F0ZUJsb2NrKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjRGVsZXRlQmxvY2soYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVBbmRGb2N1c09uTmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmZvY3VzT25OZXh0QmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvY3VzT25OZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlRm9ybWF0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjUmVtb3ZlRm9ybWF0KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkp1c3RpZnlMZWZ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5TGVmdH0gcmVxdWlyZXMgYSBibG9jayB0byBqdXN0aWZ5LmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmp1c3RpZnlMZWZ0KGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5KdXN0aWZ5Q2VudGVyOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5Q2VudGVyfSByZXF1aXJlcyBhIGJsb2NrIHRvIGp1c3RpZnkuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuanVzdGlmeUNlbnRlcihibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuSnVzdGlmeVJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5UmlnaHR9IHJlcXVpcmVzIGEgYmxvY2sgdG8ganVzdGlmeS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5qdXN0aWZ5UmlnaHQoYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZX0gcmVxdWlyZXMgYSBibG9jayB0byBjaGFuZ2UgYSBjb2RlIGJsb2NrIGxhbmd1YWdlLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2V9IHJlcXVpcmVzIGEgdmFsdWUgdG8gY2hhbmdlIGEgY29kZSBibG9jayBsYW5ndWFnZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZShibG9jaywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydE5ldzpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0luc2VydE5ldyhjb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5mb2N1c09uUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0ZvY3VzT25QcmV2aW91c0Jsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLm1lcmdlV2l0aE5leHRCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoTmV4dEJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMubWVyZ2VXaXRoUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoUHJldmlvdXNCbG9jaygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5MZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5SaWdodChibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmluc2VydFJvd0Fib3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dCZWxvdyhibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbGwgYmFja2dyb3VuZCBjb2xvci5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5leGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcjpcclxuICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcn0gcmVxdWlyZXMgYSBibG9jay5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3J9IHJlcXVpcmVzIGEgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ2hhbmdlQ2FsbG91dEJhY2tncm91bmQoYmxvY2ssIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVDb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlQ29sdW1uKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVSb3c6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlUm93OlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnJlbW92ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuY2hhbmdlVGFibGVCb3JkZXJDb2xvcihzY29wZSBhcyBUYWJsZVNjb3BlcywgdmFsdWUgYXMgQ29sb3JzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2spO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlUm93RWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZVJvd0VsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRSb3dFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm8gYWN0aW9uIGRlZmluZWQgZm9yIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBleGVjVHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlKTtcclxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNSZW1vdmVGb3JtYXQoY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5ub3JtYWxpemUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjSW5zZXJ0TmV3KGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRm9jdXNPblByZXZpb3VzQmxvY2soY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIGhhbmRsZUZvY3VzT25GaXJzdFJlcXVlc3RlZEV2ZW50ID0gKGNvbW1hbmQ6IENvbW1hbmRzKTogdm9pZCA9PiB7XHJcbiAgICAvLyAgICAgLy8gYWxlcnQoXCJmb2N1cyBvbiBmaXJzdFwiKTtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG4gICAgLy8gfVxyXG59XHJcbiIsImltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gXCIuL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMga2V5Ym9hcmQgc2hvcnRjdXQgbGlzdGVuaW5nIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbiB0byBlbnN1cmVcclxuICogdGhhdCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBpcyBjZW50cmFsaXplZCBhbmQgdGhhdCBtdWx0aXBsZSBpbnN0YW5jZXMgZG8gbm90IGR1cGxpY2F0ZSBldmVudCBsaXN0ZW5lcnMuXHJcbiAqIEl0IGludGVyY2VwdHMga2V5ZG93biBldmVudHMgYW5kIGRpc3BhdGNoZXMgY29tbWFuZHMgYmFzZWQgb24gc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucywgZW5oYW5jaW5nIHRleHQgZWRpdGluZ1xyXG4gKiBjYXBhYmlsaXRpZXMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi5cclxuICogXHJcbiAqIFRoZSBjbGFzcyBpbml0aWFsaXplcyBpdHNlbGYgdGhlIGZpcnN0IHRpbWUgYGdldEluc3RhbmNlYCBpcyBjYWxsZWQgYW5kIHN1YnNlcXVlbnRseSBtYW5hZ2VzIGFsbCBrZXlib2FyZCBzaG9ydGN1dHNcclxuICogdGhyb3VnaCBhIHNpbmdsZSBpbnN0YW5jZS5cclxuICogXHJcbiAqIFVzYWdlIG9mIHRoaXMgY2xhc3Mgb3V0c2lkZSBvZiBpdHMgc2luZ2xldG9uIHBhdHRlcm4gaXMgcmVzdHJpY3RlZCB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlcywgd2hpY2ggaXMgZW5mb3JjZWRcclxuICogYnkgdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBkaXJlY3RseSBhZnRlciBpbml0aWFsaXphdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaG9ydGN1dExpc3RlbmVycyBpbXBsZW1lbnRzIElTaG9ydGN1dExpc3RlbmVycyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIFNob3J0Y3V0TGlzdGVuZXJzLCBlbnN1cmluZyB0aGUgc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBAdHlwZSB7U2hvcnRjdXRMaXN0ZW5lcnMgfCBudWxsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFNob3J0Y3V0TGlzdGVuZXJzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvdXRzaWRlIG9mIHRoZSBzaW5nbGV0b24gY29udGV4dC4gSW5pdGlhbGl6ZXMgdGhlXHJcbiAgICAgKiBzaG9ydGN1dCBsaXN0ZW5lciBzZXR1cCBieSBjYWxsaW5nIHRoZSBgbGlzdGVuYCBtZXRob2QsIGVuc3VyaW5nIGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRpcmVjdGx5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TGlzdGVuKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibGlzdGVuaW5nIGtleWJvYXJkIHNob3J0Y3V0c1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBTaG9ydGN1dExpc3RlbmVycyBjbGFzcy4gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90XHJcbiAgICAgKiBleGlzdCwgaXQgY3JlYXRlcyBhbmQgcmV0dXJucyBpdCwgZW5zdXJpbmcgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Nob3J0Y3V0TGlzdGVuZXJzfSBUaGUgc2luZ2xlIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgU2hvcnRjdXRMaXN0ZW5lcnMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBTaG9ydGN1dExpc3RlbmVycyB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgU2hvcnRjdXRMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXR0YWNoZXMgYSBnbG9iYWwgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50IHRvIGludGVyY2VwdCBrZXlkb3duIGV2ZW50cyBhbmQgcGVyZm9ybSBzcGVjaWZpYyB0ZXh0IHRyYW5zZm9ybWF0aW9uXHJcbiAgICAqIGNvbW1hbmRzIGJhc2VkIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBrZXlzIHByZXNzZWQuIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZW5oYW5jZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzXHJcbiAgICAqIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiBieSBwcm92aWRpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciB2YXJpb3VzIHRleHQgZm9ybWF0dGluZyBhbmQgZWRpdGluZyBhY3Rpb25zLlxyXG4gICAgKlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gdXNlcyBhIGNvbWJpbmF0aW9uIG9mIEN0cmwsIEFsdCAob3IgQWx0R3JhcGgpLCBTaGlmdCwgYW5kIHNwZWNpZmljIGtleXMgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gdG8gYmVcclxuICAgICogdGFrZW4uIEl0IGhhbmRsZXMgdHJhbnNmb3JtYXRpb24gaW50byBkaWZmZXJlbnQgYmxvY2sgdHlwZXMgbGlrZSBwYXJhZ3JhcGhzLCBjaGVja2xpc3RzLCBudW1iZXJlZCBsaXN0cywgaGVhZGVycywgZXRjLixcclxuICAgICogYXMgd2VsbCBhcyBibG9jayBkdXBsaWNhdGlvbiBhbmQgZGVsZXRpb24uXHJcbiAgICAqXHJcbiAgICAqIFByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb24gYXJlIGNhbGxlZCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGtleSBhY3Rpb25zIGFuZCBidWJibGluZyBvZiBldmVudHMsIGVuc3VyaW5nIHRoYXRcclxuICAgICogb25seSB0aGUgaW50ZW5kZWQgYWN0aW9ucyBhcmUgZXhlY3V0ZWQuXHJcbiAgICAqXHJcbiAgICAqIFN1cHBvcnRlZCBTaG9ydGN1dHM6XHJcbiAgICAqIC0gQ3RybCtTaGlmdCtFbnRlcjogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgcGFyYWdyYXBoLlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrMSBvciBDdHJsK1NoaWZ0K051bXBhZDEgKE51bUxvY2sgb24pOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBjaGVja2xpc3QuXHJcbiAgICAqIC0gQ3RybCtTaGlmdCsuIDogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgYnVsbGV0ZWQgbGlzdC5cclxuICAgICogLSBDdHJsK1NoaWZ0Ky8gOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBudW1iZXJlZCBsaXN0LlxyXG4gICAgKiAtIEN0cmwrQWx0KzEgdGhyb3VnaCBDdHJsK0FsdCs2OiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gaGVhZGVycyAoSDEgdGhyb3VnaCBINikuXHJcbiAgICAqIC0gQ3RybCtEOiBEdXBsaWNhdGVzIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIFNoaWZ0K0RlbGV0ZSBvciBTaGlmdCtCYWNrc3BhY2U6IERlbGV0ZXMgdGhlIGN1cnJlbnQgYmxvY2suXHJcbiAgICAqIC0gQ3RybCtcXCA6IENsZWFycyBmb3JtYXR0aW5nIG9mIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIEN0cmwrQWx0K0RpZ2l0MTogUHJldmVudHMgY2hhcmFjdGVyIGluc2VydGlvbiB3aGVuIHVzaW5nIHRoZSB0b3Agcm93ICcxJywgc3BlY2lmaWMgdG8gbGF5b3V0IGNvbmZpZ3VyYXRpb25zLlxyXG4gICAgKlxyXG4gICAgKiBFYWNoIGFjdGlvbiBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggZGV0YWlscyBhYm91dCB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCwgd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYnlcclxuICAgICogQ29tbWFuZERpc3BhdGNoZXIuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEluaXRpYWxpemUgYW5kIGFjdGl2YXRlIHRoZSBzaG9ydGN1dHMgYWNyb3NzIHRoZSBkb2N1bWVudC5cclxuICAgICogY29uc3Qgc2hvcnRjdXRMaXN0ZW5lciA9IFNob3J0Y3V0TGlzdGVuZXJzLmdldEluc3RhbmNlKCk7XHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW4oKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgS2V5OiAke2V2ZW50LmtleX0sIENvZGU6ICR7ZXZlbnQuY29kZX0sIEN0cmw6ICR7ZXZlbnQuY3RybEtleX0sIEFsdDogJHtldmVudC5hbHRLZXl9LCBBbHRHcjogJHtldmVudC5rZXkgPT09ICdBbHRHcmFwaCd9LCBOdW1Mb2NrOiAke2V2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ051bUxvY2snKX1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTnVtUGFkID0gZXZlbnQuY29kZS5zdGFydHNXaXRoKFwiTnVtcGFkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1Mb2NrT24gPSBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTnVtTG9ja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBwYXJhZ3JhcGggd2hlbiBwcmVzc2luZyBDdHJsK1NoaWZ0K0VudGVyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LmFsdEtleSAmJiAoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIiB8fCBldmVudC5jb2RlID09PSBcIk51bXBhZDFcIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGNoZWNrbGlzdCB3aGVuIHByZXNzaW5nICBDdHJsK1NoaWZ0KzFcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gXCIuXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGJ1bGxldGVkIGxpc3Qgd2hlbiBwcmVzc2luZyAgQ3RybCtTaGlmdCsuXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1RcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIChldmVudC5rZXkgPT09IFwiL1wiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gbnVtYmVyZWQgbGlzdCB3aGVuIHByZXNzaW5nIEN0cmwrU2hpZnQrL1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQxXCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGgxIHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrMVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoMiB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzJcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDNcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDNcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDMgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCszXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQ0XCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQ0XCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGg0IHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrNFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoNSB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzVcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDZcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDZcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDYgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCs2XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5rZXkgPT09IFwiRFwiIHx8IGV2ZW50LmtleSA9PT0gXCJkXCIpICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIC8vIER1cGxpY2F0ZSBibG9jayB3aGVuIHByZXNzaW5nIEN0cmwrRFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kdXBsaWNhdGVCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmtleSA9PT0gXCJEZWxldGVcIiB8fCBldmVudC5rZXkgPT09IFwiQmFja3NwYWNlXCIpICYmIGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGUgYmxvY2sgd2hlbiBwcmVzc2luZyBTaGlmdCtEZWxldGVcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJcXFxcXCIgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGZvcm1hdHRpbmcgd2hlbiBwcmVzc2luZyBDdHJsK1xcXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMucmVtb3ZlRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiBldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNoYXJhY3RlciBpbnNlcnRpb24gd2hlbiB1c2luZyB0b3Agcm93ICcxJ1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgSVRhYmxlTGlzdGVuZXJzIH0gZnJvbSBcIi4vSVRhYmxlTGlzdGVuZXJzXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcclxuaW1wb3J0IHsgRm9jdXNTdGFjayB9IGZyb20gXCIuLi9Gb2N1c1N0YWNrXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIi4uL0lGb2N1c1N0YWNrXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiLi4vRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlTGlzdGVuZXJzIGltcGxlbWVudHMgSVRhYmxlTGlzdGVuZXJzIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGFibGVMaXN0ZW5lcnMgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuXHJcbiAgICBzaG93bkVsZW1lbnRzID0gbmV3IE1hcDxIVE1MVGFibGVDZWxsRWxlbWVudCwgSFRNTEVsZW1lbnQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaykge1xyXG5cclxuICAgICAgICBpZiAoVGFibGVMaXN0ZW5lcnMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRhYmxlRXZlbnRMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcclxuXHJcbiAgICAgICAgdGhpcy5saXN0ZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydExpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImxpc3RlbmluZyB0YWJsZSBjbGlja3NcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRhYmxlTGlzdGVuZXJzIHtcclxuXHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBpZiAoVGFibGVMaXN0ZW5lcnMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFRhYmxlTGlzdGVuZXJzLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUxpc3RlbmVycyhmb2N1c1N0YWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxpc3RlbigpIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50OiBFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBOb2RlKS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gKGV2ZW50LnRhcmdldCBhcyBOb2RlKS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudD8uY2xvc2VzdChcIi5hZGQtdGFibGUtY29sdW1uXCIpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uUmlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiBwYXJlbnQuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50Py5jbG9zZXN0KFwiLmFkZC10YWJsZS1yb3dcIikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0JlbG93LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazogcGFyZW50LmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEVuc3VyZSB0aGUgdGFyZ2V0IGlzIGEgdGFibGUgY2VsbCAodGQpIGFuZCBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAnYmxvY2snXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWNlbGwgfHwgIWNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSkgcmV0dXJuOyBcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCB0YWJsZSAoYXNzdW1pbmcgYSB0YWJsZSBleGlzdHMpXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIikgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgaWYgKCF0YWJsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gSWYgYW4gZWxlbWVudCBpcyBhbHJlYWR5IHNob3duIGZvciB0aGlzIGNlbGwsIGRvIG5vdGhpbmdcclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuc2hvd25FbGVtZW50cy5oYXMoY2VsbCkpIHJldHVybjsgLy8gUHJldmVudCBmbGlja2VyaW5nXHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiBpbiB0aGUgbGFzdCBjb2x1bW4gYW5kIGVtaXQgZXZlbnRcclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Q29sdW1uKHRhYmxlLCBjZWxsKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYmxvY2sgPSBjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudCwgYmxvY2sgfSxcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuc2V0KGNlbGwsIGJsb2NrKTsgLy8gVHJhY2sgdGhlIHNob3duIGVsZW1lbnRcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgaW4gdGhlIGxhc3Qgcm93IGFuZCBlbWl0IGV2ZW50XHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdFJvdyh0YWJsZSwgY2VsbCkpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGJsb2NrID0gY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZVJvd0VsZW1lbnQsIGJsb2NrIH0sXHJcbiAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLnNldChjZWxsLCBibG9jayk7IC8vIFRyYWNrIHRoZSBzaG93biBlbGVtZW50XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgaXMgYSB0YWJsZSBjZWxsICh0ZCkgYW5kIGEgY2hpbGQgb2YgYW4gZWxlbWVudCB3aXRoIGNsYXNzICdibG9jaydcclxuICAgICAgICAvLyAgICAgY29uc3QgY2VsbCA9IHRhcmdldC5jbG9zZXN0KFwidGRcIik7XHJcbiAgICAgICAgLy8gICAgIGlmICghY2VsbCB8fCAhY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBHZXQgdGhlIGFzc29jaWF0ZWQgdGFibGUgKGFzc3VtaW5nIGEgdGFibGUgZXhpc3RzKVxyXG4gICAgICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGFibGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBsYXN0IGNvbHVtbiBjZWxsIGFuZCBub3QgZW50ZXJpbmcgdGhlIGFkZCBjb2x1bW4gYnV0dG9uXHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdENvbHVtbih0YWJsZSwgY2VsbCkgJiYgIXJlbGF0ZWRUYXJnZXQ/LmNsYXNzTGlzdC5jb250YWlucyhcImFkZC10YWJsZS1jb2x1bW5cIikpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IHNob3duRWxlbWVudCA9IHRoaXMuc2hvd25FbGVtZW50cy5nZXQoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc2hvd25FbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50LCBibG9jazogc2hvd25FbGVtZW50IH0sXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLmRlbGV0ZShjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vdXNlIGlzIGxlYXZpbmcgdGhlIGxhc3Qgcm93IGNlbGwgYW5kIG5vdCBlbnRlcmluZyB0aGUgYWRkIHJvdyBidXR0b25cclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Um93KHRhYmxlLCBjZWxsKSAmJiAhcmVsYXRlZFRhcmdldD8uY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWRkLXRhYmxlLXJvd1wiKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3Qgc2hvd25FbGVtZW50ID0gdGhpcy5zaG93bkVsZW1lbnRzLmdldChjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChzaG93bkVsZW1lbnQpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZVJvd0VsZW1lbnQsIGJsb2NrOiBzaG93bkVsZW1lbnQgfSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuZGVsZXRlKGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCIuL0lGb2N1c1N0YWNrXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRm9jdXNTdGFjayBpbXBsZW1lbnRzIElGb2N1c1N0YWNrIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRm9jdXNTdGFjaztcclxuICAgIHByaXZhdGUgc3RhY2s6IEhUTUxFbGVtZW50W107XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcGFjaXR5OiBudW1iZXIgPSAxMDtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZvY3VzU3RhY2sge1xyXG4gICAgICAgIGlmICghRm9jdXNTdGFjay5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBGb2N1c1N0YWNrLmluc3RhbmNlID0gbmV3IEZvY3VzU3RhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEZvY3VzU3RhY2suaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHB1c2goZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPj0gdGhpcy5jYXBhY2l0eSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGVlaygpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IENvbnRlbnRUeXBlcyB9IGZyb20gXCJAL2NvbW1vbi9Db250ZW50VHlwZXNcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgQ29tbW9uQ2xhc3NlcyB9IGZyb20gXCJAL2NvbW1vbi9Db21tb25DbGFzc2VzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgLy8gc3RhdGljIEJMT0NLX09QRVJBVElPTlMgPSB7XG4gICAgLy8gICAgIFRVUk5fSU5UTzogXCJ0dXJuSW50b1wiLFxuICAgIC8vICAgICBDUkVBVEVfREVGQVVMVF9CTE9DSzogXCJDcmVhdGVEZWZhdWx0QmxvY2tcIixcbiAgICAvLyAgICAgREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTOiBcIkRlbGV0ZUFuZEZvY3VzT25QcmV2aW91c1wiLFxuICAgIC8vICAgICBERUxFVEVfRk9DVVNfT05fTkVYVDogXCJEZWxldGVBbmRGb2N1c09uTmV4dFwiLFxuICAgIC8vICAgICBGT0NVU19PTl9GSVJTVDogXCJGb2N1c09uRmlyc3RcIixcbiAgICAvLyAgICAgRk9DVVNfT05fUFJFVklPVVM6IFwiRm9jdXNPblByZXZpb3VzXCIsXG4gICAgLy8gICAgIEZPQ1VTX09OX05FWFQ6IFwiRm9jdXNPbk5leHRcIixcbiAgICAvLyAgICAgREVMRVRFOiBcImRlbGV0ZVwiLFxuICAgIC8vICAgICBEVVBMSUNBVEU6IFwiZHVwbGljYXRlXCIsXG4gICAgLy8gICAgIENPUFk6IFwiY29weVwiLFxuICAgIC8vICAgICBQQVNURTogXCJwYXRlc1wiLFxuICAgIC8vICAgICBDVVQ6IFwiY3V0XCIsXG4gICAgLy8gICAgIFJFTU9WRV9GT1JNQVQ6IFwicmVtb3ZlRm9ybWF0XCIsXG4gICAgLy8gICAgIFRSQU5TRk9STV9CTE9DSzogXCJ0cmFuc2Zvcm1CbG9ja1wiXG4gICAgLy8gfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcbiAgICAgICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2ssXG4gICAgICAgIG1lbWVudG86IElNZW1lbnRvKSB7XG5cbiAgICAgICAgaWYgKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xuXG4gICAgICAgIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VJOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5jb3B5U2VsZWN0ZWQpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvcGllZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjb3BpZWRFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjb3B5IHRleHQnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmN1dFNlbGVjdGVkKSB7XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRTZWxlY3Rpb24gJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWxldGVGcm9tRG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoICdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gY3V0IHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucGFzdCkge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCkge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKS50aGVuKChwYXN0ZWRUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXN0ZWRUZXh0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0VXBkYXRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRleHQgc2VsZWN0ZWQgb3IgY2xpcGJvYXJkIGVtcHR5LicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gcGFzdGluZyB0ZXh0OiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaykge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQmxvY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucmVtb3ZlRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoQ29tbWFuZHMucmVtb3ZlRm9ybWF0LCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5kZWxldGVCbG9jaykge1xuXG4gICAgICAgIC8vICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCB7XG4gICAgICAgIC8vICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmNyZWF0ZURlZmF1bHRCbG9jaykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0QmxvY2soZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmZvY3VzT25GaXJzdEJsb2NrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlRm9jdXNPblByZXZpb3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhlbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRVUk5fSU5UTykge1xuXG4gICAgICAgIC8vICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIC8vICAgICB9XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybWF0QmxvY2soZWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBlbGVtZW50RmFjdG9yeVNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUVsZW1lbnRGYWN0b3J5U2VydmljZT4oXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIpO1xuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKGVsZW1lbnRGYWN0b3J5U2VydmljZSwgZm9jdXNTdGFjaywgbWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RHJhZ2dhYmxlRWxlbWVudEZyb21TZWxlY3Rpb24oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0b3JuYXIgbnVsbCBzZSBuZW5odW1hIHNlbGXDp8OjbyB2w6FsaWRhIGZvciBlbmNvbnRyYWRhIG91IG5lbmh1bSBlbGVtZW50byBjb3JyZXNwb25kZW50ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0VGFnTmFtZUJ5Q29tbWFuZE5hbWUoY29tbWFuZE5hbWU6IHN0cmluZykge1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmROYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9QYXJhZ3JhcGhcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJwXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgxXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgyXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IM1wiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgzXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INFwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg0XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg1XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg2XCI7XG5cbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuXG4gICAgZXhlY01lcmdlV2l0aFByZXZpb3VzQmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNDb250ZW50RWRpdGFibGUgPSBET01VdGlscy5nZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZShjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCA9IHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCArIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5jbG9zZXN0KFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2FyZXRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhckluZGV4OiBjYXJldFBvc2l0aW9uLmNoYXJJbmRleCArIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLnRleHRDb250ZW50IS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3M6IGNhcmV0UG9zaXRpb24uaG9yaXpvbnRhbFBvc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlLCBhZGp1c3RlZENhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNNZXJnZVdpdGhOZXh0QmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dENvbnRlbnRFZGl0YWJsZSA9IERPTVV0aWxzLmdldE5leHRDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIGlmICghbmV4dENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKG5leHRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGN1cnJlbnRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gRE9NVXRpbHMuc2F2ZUNhcmV0UG9zaXRpb24yZChjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5pbm5lckhUTUwgKyBuZXh0Q29udGVudEVkaXRhYmxlLmlubmVySFRNTDtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCJsaVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbSA9IG5leHRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBuZXh0Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKGN1cnJlbnRDb250ZW50RWRpdGFibGUsIGNhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNEdXBsaWNhdGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gKHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IGJsb2NrLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjbHVkZS1mcm9tLWNsb25lJykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBibG9jay5uZXh0U2libGluZztcbiAgICAgICAgYmxvY2sucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGNsb25lLCBuZXh0RWxlbWVudCk7XG5cbiAgICAgICAgY2xvbmUuaWQgPSBgYi0ke1V0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKX1gO1xuXG4gICAgICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tDbG9uZWQsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgYmxvY2sgPSAodGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IERPTVV0aWxzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNPbk5leHQoYmxvY2spO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGJsb2NrKTtcblxuICAgICAgICBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmJsb2NrRGVsZXRlZCwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPblByZXZpb3VzKCk7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyBhcHBseVNlbGVjdGVkQmxvY2tUeXBlKGRyYWdnYWJsZUJsb2NrOiBIVE1MRWxlbWVudCwgbmV3QmxvY2tUeXBlOiBzdHJpbmcpIHtcblxuICAgIC8vICAgICAvLyBjb25zdCBkcmFnZ2FibGVCbG9jayA9IHJlYWxGb2N1c2VkRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcbiAgICAvLyAgICAgLy8gY29uc3QgbmV3QmxvY2tUeXBlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5vcHRpb24nKSA/XG4gICAgLy8gICAgIC8vICAgICBldmVudC50YXJnZXQuY2xvc2VzdCgnLm9wdGlvbicpLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgOlxuICAgIC8vICAgICAvLyAgICAgY3VycmVudEZha2VGb2N1c2VkT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XG5cbiAgICAvLyAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0Lmxhc3RJbmRleE9mKCcvJyk7XG4gICAgLy8gICAgIHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQgPSBsYXN0U2xhc2hJbmRleCAhPT0gLTEgPyByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0LnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KSA6IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQ7XG5cblxuICAgIC8vICAgICB0cmFuc2Zvcm1CbG9jayhkcmFnZ2FibGVCbG9jaywgbmV3QmxvY2tUeXBlKTtcblxuICAgIC8vICAgICBoaWRlQW5kQ2xlYXJCbG9ja09wdGlvbnMoKTtcbiAgICAvLyAgICAgaGlkZUFsbERlcGVuZGVudEJveCgpO1xuICAgIC8vICAgICBoaWRlZmxvYXRpbmdUb29sYmFyKCk7XG4gICAgLy8gfVxuXG4gICAgLy8gZm9ybWF0QmxvY2soZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbnRlbnRUeXBlOiBzdHJpbmcpXG4gICAgdHJhbnNmb3JtQmxvY2sodHlwZTogc3RyaW5nLCBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG5cbiAgICAgICAgbGV0IGJsb2NrRWxlbWVudDogRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmNsb3Nlc3QoXCIuYmxvY2tcIikgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwiLmJsb2NrXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRlbnRFbGVtZW50ID0gYmxvY2tFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCcuc3dpdHRhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcblxuICAgICAgICBET01VdGlscy5yZW1vdmVGaWx0ZXJUZXh0KCk7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW1lbnQ/LmlubmVyVGV4dDtcblxuICAgICAgICBsZXQgZm9jdXNTdGFja1RvQWRkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cbiAgICAgICAgbGV0IG5ld0NvbnRlbnRCbG9jaztcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNvbnRlbnQgPSBET01VdGlscy5xdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZihjb250ZW50RWxlbWVudCwgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJIVE1MID0gZWRpdGFibGVDb250ZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzE6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yKTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMzoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMyk7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQ6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81OiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81KTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNik7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERToge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URToge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1Q6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU0VQQVJBVE9SOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNFUEFSQVRPUik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEU6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwiLCxcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSU1BR0U6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSU1BR0UsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5WSURFTzoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5WSURFTywgY29udGVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFja1RvQWRkID0gbmV3Q29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNQT1RJRlk6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU1BPVElGWSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFja1RvQWRkID0gbmV3Q29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVEhVQl9HSVNUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVEhVQl9HSVNULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUTEFCX1NOSVBQRVQ6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUTEFCX1NOSVBQRVQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFUEVOOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREVQRU4sIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DQUxMT1VUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbG91dCA9IG5ld0NvbnRlbnRCbG9jay5xdWVyeVNlbGVjdG9yKFwiLmNhbGxvdXQtdGV4dFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNvbnRlbnQgPSBET01VdGlscy5xdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZihjb250ZW50RWxlbWVudCwgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxvdXQgJiYgZWRpdGFibGVDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxvdXQuaW5uZXJIVE1MID0gZWRpdGFibGVDb250ZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV3Q29udGVudEJsb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBibG9ja0VsZW1lbnQhLnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3Q29udGVudEJsb2NrLmNsb3Nlc3QoJy5mb2N1c2FibGUnKSB8fCBibG9ja0VsZW1lbnQhLnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChmb2N1c1N0YWNrVG9BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTdGFjay5wdXNoKChmb2N1c1N0YWNrVG9BZGQgYXMgSFRNTEVsZW1lbnQpISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PSBcImltYWdlXCIgfHwgdHlwZSA9PSBcInZpZGVvXCIgfHwgdHlwZSA9PSBcInNwb3RpZnlcIiB8fCB0eXBlID09IFwiZ2l0aHViLWdpc3RcIiB8fCB0eXBlID09IFwiZ2l0bGFiLXNuaXBwZXRcIiB8fCB0eXBlID09IFwiY29kZXBlblwiKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZm9jdXNTdGFja1RvQWRkPy5xdWVyeVNlbGVjdG9yKFwiLmNvbnRlbnQtcGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChwbGFjZWhvbGRlciBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dFbGVtZW50RXZlbnQoXCJtZWRpYUlucHV0dGVyXCIpO1xuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXIgPSBibG9ja0VsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuYmxvY2stdG9vbGJhci13cmFwcGVyXCIpO1xuICAgICAgICBpZiAoYmxvY2tUb29sYmFyKSB7XG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5jcmVhdGVEZWZhdWx0QmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgLy8ncmVxdWVzdEhpZGVGbG9hdGluZ1Rvb2xiYXInXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5ibG9ja1R5cGVDaGFuZ2VkLCB7XG4gICAgICAgIC8vICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAvLyAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNlbGVjdGlvbkV2ZW50KTtcbiAgICB9XG5cbiAgICAvL05PVyBUSEUgZm9ybWF0QmxvY2sgQU5EIHRyYW5zZm9ybUJsb2NrIElTIFRIRSBTQU1FLiBmb3JtYXRCbG9jayBJUyBERVBSRUNFVEVEIFVTRSB0cmFuc2Zvcm1CbG9jayBJTlNURURcbiAgICAvLyBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50LmlubmVyVGV4dDtcblxuICAgIC8vICAgICBsZXQgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKGNvbnRlbnRUeXBlLCBjb250ZW50KTtcblxuICAgIC8vICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgIC8vICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgLy8gICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNhYmxlKTtcbiAgICAvLyB9XG5cblxuXG4gICAgY3JlYXRlTmV3RWxlbWVudChldmVudDogRXZlbnQpIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50ICYmIGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUxpc3RJdGVtKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEJsb2NrKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUxpc3RJdGVtKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBuZXdDb250ZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveC1saXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwiY2hlY2tib3hJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShcImxpc3RJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgcGFyZW50QmxvY2sgPSBudWxsO1xuXG4gICAgICAgIC8vIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuXG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGNvbnRlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGFjdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vICAgICBpZiAodGV4dENvbnRlbnQgPT09ICcnKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gY3JlYXRlTmV3RHJhZ2dhYmxlUGFyYWdyYXBoRWxlbWVudCgpO1xuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdDb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmxpc3QtaXRlbScpO1xuICAgICAgICAvLyAgICAgICAgIGFjdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcGFyZW50QmxvY2sgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIC8vICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50QmxvY2submV4dFNpYmxpbmcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyZW50QmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Q29udGVudEVsZW1lbnQsIHBhcmVudEJsb2NrLm5leHRTaWJsaW5nKTtcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBlbGVtZW50IChwYXJhZ3JhcGggb3IgbGlzdCBpdGVtKSBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGFjY29yZGluZ2x5LlxuICAgICogVGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgcHJlc3NpbmcgJ0VudGVyJyBpbiBhbiBlZGl0YWJsZSBjb250ZW50IGFyZWEsIGZhY2lsaXRhdGluZyBkeW5hbWljIGNvbnRlbnQgY3JlYXRpb24gYW5kIG9yZ2FuaXphdGlvblxuICAgICogd2l0aGluIHRoZSBkb2N1bWVudC4gSXQgc3VwcG9ydHMgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMgaW5jbHVkaW5nIGNoZWNrbGlzdHMsIGJ1bGxldGVkIGxpc3RzLCBudW1iZXJlZCBsaXN0cywgYW5kIGdlbmVyYWwgdGV4dCBibG9ja3MuXG4gICAgKlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBleGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhdGggdGFrZW4uXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFR5cGljYWxseSBjYWxsZWQgd2l0aGluIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGtleXByZXNzIGV2ZW50c1xuICAgICogZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAqICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgKiAgICAgICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTtcbiAgICAqICAgICB9XG4gICAgKiB9KTtcbiAgICAqXG4gICAgKiBAZGVzY3JpcHRpb25cbiAgICAqIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyB1bmRlciBzZXZlcmFsIGNvbmRpdGlvbnMgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZTpcbiAgICAqIC0gRm9yIGxpc3QgaXRlbXMgKGNoZWNrbGlzdCwgYnVsbGV0ZWQsIGFuZCBudW1iZXJlZCk6XG4gICAgKiAgIDEuIEZpbmRzIHRoZSBjbG9zZXN0IGxpc3QgaXRlbSBhbmNlc3RvciBvZiB0aGUgYWN0aXZlIGVsZW1lbnQuXG4gICAgKiAgIDIuIElmIHRoZSBsaXN0IGl0ZW0gY29udGFpbnMgdGV4dCwgaXQgY2xvbmVzIHRoaXMgaXRlbSBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgY2xvbmUuXG4gICAgKiAgIDMuIElmIHRoZSBsaXN0IGl0ZW0gaXMgZW1wdHkgYW5kIGlzIHRoZSBvbmx5IGl0ZW0sIGl0IHJlbW92ZXMgdGhlIGVudGlyZSBibG9jayBhZnRlciBjcmVhdGluZyBhIG5ldyBwYXJhZ3JhcGguXG4gICAgKiAtIEZvciBvdGhlciBibG9ja3MgKGxpa2UgcGFyYWdyYXBocyk6XG4gICAgKiAgIDEuIENsb25lcyB0aGUgY3VycmVudCBibG9jayBhbmQgcmVhcnJhbmdlcyBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgbmV3IGNsb25lLlxuICAgICogICAyLiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgc3RhcnQgb2YgdGhlIG5ldyBlbGVtZW50IHRvIGNvbnRpbnVlIGVkaXRpbmcuXG4gICAgKlxuICAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgcmVtYWlucyBjb2hlcmVudCB3aGlsZSBwcm92aWRpbmcgYSBzZWFtbGVzcyB1c2VyIGV4cGVyaWVuY2UgaW4gdGV4dCBlZGl0aW5nIGVudmlyb25tZW50cy5cbiAgICAqL1xuICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gRE9NVXRpbHMuZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuVGFibGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gSnVtcCB0byB0aGUgbmV4dCBsaW5lIGlmIGV4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkNoZWNrTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkJ1bGxldGVkTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwibGlzdC1pdGVtXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgRE9NVXRpbHMuaGFzVGV4dENvbnRlbnQoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50Q2xvbmUgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5yZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdChjb250ZW50Q3VycmVudCwgY29udGVudENsb25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCbG9jayA9IGN1cnJlbnRJdGVtLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHBhcmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubGlzdC1pdGVtXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCBwYXJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld1BhcmFncmFwaCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcInBcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkQmxvY2sgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENsb25lID0gY2xvbmVkQmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY29udGVudEN1cnJlbnQsIGNvbnRlbnRDbG9uZSk7XG5cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgsIGNsb25lZEJsb2NrKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IChjbG9uZWRCbG9jayBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNhYmxlIGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cbiAgICBjcmVhdGVBTmV3UGFyYWdyYXBoRnJvbVRpdGxlKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLnRpdGxlIGgxXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNsb25lZFRpdGxlID0gRE9NVXRpbHMuY2xvbmVBbmRJbnNlcnRBZnRlcih0aXRsZSk7XG4gICAgICAgIGlmIChjbG9uZWRUaXRsZSkge1xuICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQodGl0bGUgYXMgTm9kZSwgY2xvbmVkVGl0bGUgYXMgTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CTE9DS19QQVJBR1JBUEgsIFwiXCIpO1xuICAgICAgICBjb25zdCBwID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gY2xvbmVkVGl0bGU/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnRcIik7XG5cbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHJlcGVuZChuZXdCbG9jayk7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3QmxvY2sgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXCIuZm9jdXNhYmxlXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmVkVGl0bGU/LnJlbW92ZSgpO1xuICAgIH1cblxuXG5cblxuXG4gICAgLy8gc3BsaXRDb250ZW50QXRDdXJzb3IoKTogdm9pZCB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcblxuICAgIC8vICAgICAvLyBDcmlhbmRvIHJhbmdlIHBhcmEgbyBjb250ZcO6ZG8gYW50ZXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgcmFuZ2VCZWZvcmUuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRhaW5lcik7XG4gICAgLy8gICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xuXG4gICAgLy8gICAgIC8vIENyaWFuZG8gcmFuZ2UgcGFyYSBvIGNvbnRlw7pkbyBkZXBvaXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQWZ0ZXIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhjb250YWluZXIpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcblxuICAgIC8vICAgICAvLyBFeGVtcGxvOiBJc29sYW5kbyBvIHRleHRvIGRlIGNhZGEgcGFydGVcbiAgICAvLyAgICAgY29uc3QgdGV4dEJlZm9yZSA9IHJhbmdlQmVmb3JlLnRvU3RyaW5nKCk7XG4gICAgLy8gICAgIGNvbnN0IHRleHRBZnRlciA9IHJhbmdlQWZ0ZXIudG9TdHJpbmcoKTtcblxuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gYW50ZXMgZG8gY3Vyc29yOicsIHRleHRCZWZvcmUpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gZGVwb2lzIGRvIGN1cnNvcjonLCB0ZXh0QWZ0ZXIpO1xuXG4gICAgLy8gICAgIC8vIEFxdWkgdm9jw6ogcG9kZSBtYW5pcHVsYXIgbyBET00gY29tbyBuZWNlc3PDoXJpbywgcG9yIGV4ZW1wbG86XG4gICAgLy8gICAgIC8vIGluc2VyaXIgbm92b3MgZWxlbWVudG9zLCBtb2RpZmljYXIgbyB0ZXh0bywgZXRjLlxuICAgIC8vIH1cblxuXG4gICAgY3JlYXRlRGVmYXVsdEJsb2NrKGV2ZW50UGFyYWdyYXBoOiBFbGVtZW50IHwgbnVsbCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCwgXCJcIik7XG5cbiAgICAgICAgaWYgKGV2ZW50UGFyYWdyYXBoICYmIGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpKSB7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gZXZlbnRQYXJhZ3JhcGguY2xvc2VzdCgnLmJsb2NrJykhO1xuICAgICAgICAgICAgc2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3QmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudFwiKSEuYXBwZW5kQ2hpbGQobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcignLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2gobmV3QmxvY2spO1xuXG4gICAgICAgIHJldHVybiBuZXdCbG9jaztcblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzYWJsZSk7XG4gICAgfVxuXG4gICAgZXhlY0ZvY3VzT25OZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgfHwgRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE7XG5cbiAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBleGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRBY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uUHJldmlvdXMoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQgPSBhY3R1YWxFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGlmICghcHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgJiYgcHJldmlvdXNFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IHByZXZpb3VzRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhFbmRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzW2ZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoIC0gMV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmV2aW91c0ZvY3VzYWJsZUVsZW1lbnQoYWN0dWFsRWxlbWVudDogRWxlbWVudCk6IEVsZW1lbnQgfCBudWxsIHtcblxuICAgICAgICBsZXQgdGFnID0gYWN0dWFsRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGxldCBmb2N1c2VkRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gJ0xJJykge1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKCFwcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpYmxpbmcgPSBwYXJlbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggLSAxXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uTmV4dChhY3R1YWxFbGVtZW50OiBFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFjdHVhbEVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknIC8qIGZvY3VzYWJsZSBTUEFOIGluc2lkZSBMSSovKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJ2xpJyk/Lm5leHRFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGdldE5leHRGb2N1c2FibGVFbGVtZW50KGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ubmV4dEVsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0RWxlbWVudCAmJiBuZXh0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBuZXh0RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuXG4gICAgLy8gICAgICAgICBsZXQgbGFzdENoaWxkID0gY29udGVudEJsb2NrO1xuXG4gICAgLy8gICAgICAgICB3aGlsZSAobGFzdENoaWxkLmxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAobGFzdENoaWxkLmxhc3RDaGlsZCkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Q2hpbGQsIGxhc3RDaGlsZC50ZXh0Q29udGVudCEubGVuZ3RoKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0sIDEwKTtcbiAgICAvLyB9XG5cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cblxuICAgIGp1c3RpZnlMZWZ0KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICB0aGlzLnJlbW92ZUp1c3RpZnkoYmxvY2spO1xuICAgICAgICBibG9jay5jbGFzc0xpc3QuYWRkKFwianVzdGlmeS1sZWZ0XCIpO1xuICAgIH1cblxuICAgIGp1c3RpZnlDZW50ZXIoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LWNlbnRlclwiKTtcbiAgICB9XG5cbiAgICBqdXN0aWZ5UmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LXJpZ2h0XCIpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlKGJsb2NrOiBIVE1MRWxlbWVudCwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjb2RlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcImNvZGVcIik7XG5cbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIERPTVV0aWxzLnJlbW92ZUNsYXNzZXNXaXRoUHJlZml4KGNvZGUgYXMgRWxlbWVudCwgXCJsYW5ndWFnZS1cIik7XG4gICAgICAgICAgICBjb2RlLmNsYXNzTGlzdC5hZGQoYGxhbmd1YWdlLSR7dmFsdWV9YCk7XG4gICAgICAgICAgICBjb2RlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaGlnaGxpZ2h0ZWRcIik7XG5cbiAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudChcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiLCBibG9jay5pZCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVKdXN0aWZ5KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChcImp1c3RpZnktXCIpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIGV4ZWNDaGFuZ2VDYWxsb3V0QmFja2dyb3VuZChibG9jazogSFRNTEVsZW1lbnQsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBjYWxsb3V0RGl2ID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0ID4gZGl2XCIpO1xuXG4gICAgICAgIGlmIChjYWxsb3V0RGl2KSB7XG4gICAgICAgICAgICBET01VdGlscy5yZW1vdmVDbGFzc2VzV2l0aFByZWZpeChjYWxsb3V0RGl2IGFzIEVsZW1lbnQsIFwiY2FsbG91dC1iYWNrZ3JvdW5kLVwiKTtcbiAgICAgICAgICAgIGNhbGxvdXREaXYuY2xhc3NMaXN0LmFkZChjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XG5pbXBvcnQgeyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBCdXR0b25JRHMgfSBmcm9tIFwiQC9jb3JlL0J1dHRvbklEc1wiO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcblxudHlwZSBUYXJnZXROb2RlID0ge1xuICAgIG5vZGVUeXBlOiBzdHJpbmc7XG4gICAgY2xhc3Nlcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFRleHRPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElUZXh0T3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRleHRPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XG5cbiAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihtZW1lbnRvOiBJTWVtZW50bykge1xuICAgICAgICBpZiAoVGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUZXh0T3BlcmF0aW9uc1NlcnZpY2UobWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBleGVjSW5zZXJ0TGluayh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjcmVhdGVMaW5rXCIsIGZhbHNlLCB1cmwpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5MaW5rLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmNob3JzKCk7XG4gICAgICAgIH0sIDUwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZUFuY2hvcnMoKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50IGFcIik7XG5cbiAgICAgICAgYW5jaG9ycy5mb3JFYWNoKGFuY2hvciA9PiB7XG4gICAgICAgICAgICBpZiAoIWFuY2hvci5oYXNBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcbiAgICAgICAgICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKCd0aXRsZScsIChhbmNob3IgYXMgSFRNTEFuY2hvckVsZW1lbnQpLmhyZWYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbmNob3Iubm9ybWFsaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZXhlY1RvZ2dsZUxpbmsoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dFbGVtZW50RXZlbnQoXCJsaW5rQm94XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3VubGluaycsIGZhbHNlKTtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChcImxpbmtCdXR0b25cIiwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0JvbGQoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImJvbGRcIikpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShcImJvbGRcIikpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkJvbGQsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuQm9sZCwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0lubGluZUNvZGUoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUlubGluZUNvZGUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlKCkpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLklubGluZUNvZGUsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuSW5saW5lQ29kZSwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdG9nZ2xlSW5saW5lQ29kZSgpOiBib29sZWFuIHtcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHJhbmdlLmV4dHJhY3RDb250ZW50cygpO1xuXG4gICAgLy8gICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yTm9kZT8ucGFyZW50RWxlbWVudD8udGFnTmFtZSA9PT0gXCJDT0RFXCIpIHtcbiAgICAvLyAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2VsZWN0ZWRDb250ZW50LnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgY29uc3QgY29kZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29kZVwiKTtcbiAgICAvLyAgICAgICAgIGNvZGVFbGVtZW50LmFwcGVuZENoaWxkKHNlbGVjdGVkQ29udGVudCk7XG4gICAgLy8gICAgICAgICByYW5nZS5pbnNlcnROb2RlKGNvZGVFbGVtZW50KTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAvLyAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG5cbiAgICB0b2dnbGVJbmxpbmVDb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkQ29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IEhUTUxTcGFuRWxlbWVudCA9IHJhbmdlLmV4dHJhY3RDb250ZW50cygpO1xuXG4gICAgICAgIGxldCBpc0NvZGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY29udGFpbnNDb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBjb250YWluc0NvZGUuYXBwZW5kQ2hpbGQoc2VsZWN0ZWRDb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5zQ29kZS5xdWVyeVNlbGVjdG9yKCdjb2RlJykpIHtcbiAgICAgICAgICAgIGlzQ29kZSA9IHRydWU7XG4gICAgICAgICAgICBjb250YWluc0NvZGUucXVlcnlTZWxlY3RvckFsbCgnY29kZScpLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2RlLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgICAgICAgICAgICBjb2RlLnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZCh0ZXh0Tm9kZSwgY29kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudCA9IGNvbnRhaW5zQ29kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJlbnRDb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRDb2RlICYmIHBhcmVudENvZGUubm9kZU5hbWUgIT09IFwiQ09ERVwiICYmIHBhcmVudENvZGUubm9kZU5hbWUgIT09IFwiQk9EWVwiKSB7XG4gICAgICAgICAgICBwYXJlbnRDb2RlID0gcGFyZW50Q29kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudENvZGUgJiYgcGFyZW50Q29kZS5ub2RlTmFtZSA9PT0gXCJDT0RFXCIpIHtcbiAgICAgICAgICAgIGlzQ29kZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmVudENvZGUudGV4dENvbnRlbnQgfHwgJycpO1xuICAgICAgICAgICAgcGFyZW50Q29kZS5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQodGV4dE5vZGUsIHBhcmVudENvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0NvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNvZGVcIik7XG4gICAgICAgICAgICBjb2RlRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RlZENvbnRlbnQpO1xuICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjb2RlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKGNvbnRhaW5zQ29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjb250ZW50Lm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgICAgICBET01VdGlscy5tZXJnZUlubGluZUVsZW1lbnRzKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZXhlY0l0YWxpYygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaXRhbGljXCIpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJpdGFsaWNcIikpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkl0YWxpYywgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5JdGFsaWMsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNTdHJpa2VUaHJvdWdoKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJzdHJpa2VUaHJvdWdoXCIpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJzdHJpa2VUaHJvdWdoXCIpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlN0cmlrZXRocm91Z2gsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNVbmRlcmxpbmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJ1bmRlcmxpbmVcIikpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShcInVuZGVybGluZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlVuZGVybGluZSwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlVuZGVybGluZSwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaGlsaXRlQ29sb3JcIiwgZmFsc2UsIHZhbHVlKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjRm9yZUNvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiZm9yZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVMaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT09IENvbW1hbmRzLnRvZ2dsZVVuZGVybGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlIaWxpdGVDb2xvcih2YWx1ZSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT09IENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlGb3JlQ29sb3IodmFsdWUhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUlubGluZUNvZGVDb21tYW5kU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIHF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgLy8gICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgLy8gICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIC8vIFZlcmlmaWNhIHNlIGFsZ3VtIG7DsyBwYWkgw6kgdW1hIMOibmNvcmFcbiAgICAvLyAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAvLyAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdBJykge1xuICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEEgc2VsZcOnw6NvIGVzdMOhIGRlbnRybyBkZSB1bWEgw6JuY29yYVxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbG9zZXN0KCdhJykpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIHNlbGXDp8OjbyBlc3TDoSBkZW50cm8gZGUgYWxnbyBxdWUgZXN0w6EgZGVudHJvIGRlIHVtYSDDom5jb3JhXG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIC8vIFZlcmlmaWNhIHNlIGEgc2VsZcOnw6NvIGNvbnTDqW0gdW1hIMOibmNvcmEgY29tcGxldGFcbiAgICAvLyAgICAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyID09PSByYW5nZS5lbmRDb250YWluZXIpIHtcbiAgICAvLyAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lci5jaGlsZE5vZGVzKTtcbiAgICAvLyAgICAgICAgIGxldCBzZWxlY3RlZEFuY2hvcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgLy8gICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoY2hpbGQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUgPT09ICdBJykge1xuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUoY2hpbGQpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEFuY2hvciA9IGNoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRBbmNob3IgJiYgcmFuZ2UudG9TdHJpbmcoKSA9PT0gc2VsZWN0ZWRBbmNob3IudGV4dENvbnRlbnQpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEEgc2VsZcOnw6NvIMOpIGV4YXRhbWVudGUgbyB0ZXh0byBkZSB1bWEgw6JuY29yYVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIH1cblxuXG4gICAgLy9PUklHSU5BTFxuICAgIC8vIHByaXZhdGUgcXVlcnlBbmNob3JDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAvLyAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgLy8gICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgIC8vICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ2EnKSkge1xuICAgIC8vICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cbiAgICAvLyBtdWx0aXBsZXMgZWxlbWVudHNcbiAgICBwcml2YXRlIHF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q29udGFpbmVyID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgICAgIGNvbnN0IGVuZENvbnRhaW5lciA9IHJhbmdlLmVuZENvbnRhaW5lcjtcblxuICAgICAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBpZiBhIG5vZGUgb3IgaXRzIHBhcmVudHMgYXJlIGFuIDxhPiBlbGVtZW50XG4gICAgICAgIGNvbnN0IGlzTm9kZUluc2lkZUFuY2hvciA9IChub2RlOiBOb2RlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzIHdpdGhpbiBhbiA8YT4gZWxlbWVudFxuICAgICAgICBpZiAoaXNOb2RlSW5zaWRlQW5jaG9yKHN0YXJ0Q29udGFpbmVyKSB8fCBpc05vZGVJbnNpZGVBbmNob3IoZW5kQ29udGFpbmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBhbGwgZWxlbWVudHMgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGlmIG5lY2Vzc2FyeVxuICAgICAgICBjb25zdCBub2Rlc0luUmFuZ2UgPSByYW5nZS5jbG9uZUNvbnRlbnRzKCkucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgICByZXR1cm4gbm9kZXNJblJhbmdlLmxlbmd0aCA+IDA7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHF1ZXJ5SW5saW5lQ29kZUNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnY29kZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBxdWVyeVVuZGVybGluZUNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgndScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHF1ZXJ5Rm9yZUNvbG9yKGV4cGVjdGVkQ29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9udENvbG9yID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJmb250W2NvbG9yXVwiKTtcbiAgICAgICAgaWYgKCFmb250Q29sb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGZvbnRDb2xvcik7XG4gICAgICAgIGNvbnN0IHJnYkNvbG9yID0gc3R5bGUuY29sb3I7XG5cbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBVdGlscy5yZ2JUb0hleChyZ2JDb2xvcik7XG5cbiAgICAgICAgcmV0dXJuIGhleENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IGV4cGVjdGVkQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBxdWVyeUhpbGl0ZUNvbG9yKGV4cGVjdGVkQ29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGFuV2l0aEJhY2tncm91bmQgPVxuICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJzcGFuW3N0eWxlKj0nYmFja2dyb3VuZC1jb2xvciddXCIpIHx8XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcImZvbnRbc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIik7XG5cbiAgICAgICAgaWYgKCFzcGFuV2l0aEJhY2tncm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNwYW5XaXRoQmFja2dyb3VuZCk7XG4gICAgICAgIGNvbnN0IHJnYkNvbG9yID0gc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpO1xuXG4gICAgICAgIHJldHVybiBoZXhDb2xvci50b1VwcGVyQ2FzZSgpID09PSBleHBlY3RlZENvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0VGFyZ2V0RWxlbWVudE1hcChjb21tYW5kOiBzdHJpbmcpOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcblxuICAgICAgICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImJvbGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJvbmcnO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgY2FzZSBcImVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZW1cIjtcblxuICAgICAgICAgICAgY2FzZSBcInVuZGVybGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ1XCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJpa2V0aHJvdWdoXCI6XG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAncyc7XG5cbiAgICAgICAgICAgIGNhc2UgXCJiYWNrZ3JvdW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuXCI7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkVGV4dE5vZGVzKCk6IE5vZGVbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHROb2RlczogTm9kZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19TVEFSVCwgbm9kZVJhbmdlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIG5vZGVSYW5nZSkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XG4gICAgfVxuXG4gICAgZmluZENsb3Nlc3RNYXRjaGluZ1BhcmVudChlbGVtZW50OiBOb2RlIHwgbnVsbCwgdGFyZ2V0OiBUYXJnZXROb2RlKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQubm9kZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5jbGFzc2VzIHx8IHRhcmdldC5jbGFzc2VzLmV2ZXJ5KGNscyA9PiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGV4dHJhY3RTZWxlY3RlZFRleHQodGV4dE5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gdGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAgIGlmICghcmFuZ2UuaW50ZXJzZWN0c05vZGUodGV4dE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UuZW5kQ29udGFpbmVyID09PSB0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmVuZENvbnRhaW5lci5jb250YWlucyh0ZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVGFibGVVdGlsc1wiO1xuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9JVGFibGVPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiQC9jb3JlL0lGb2N1c1N0YWNrXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIi4vVGFibGVTY29wZXNcIjtcbmltcG9ydCB7IERPTUVsZW1lbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RPTUVsZW1lbnRzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xuaW1wb3J0IHsgVG9vbGJhcklEcyB9IGZyb20gXCJAL2NvcmUvVG9vbGJhcklEc1wiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcbiAgICBwcml2YXRlIG1lbWVudG86IElNZW1lbnRvO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLFxuICAgICAgICBtZW1lbnRvOiBJTWVtZW50bykge1xuICAgICAgICBpZiAoVGFibGVPcGVyYXRpb25zU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcbiAgICB9XG5cbiAgICBpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9XG5cbiAgICByZW1vdmVDb2x1bW4oKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xuXG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgIH1cblxuICAgIHJlbW92ZVJvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xuXG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZVJvd0J5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgIH1cblxuXG4gICAgZXhlY0NlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcblxuICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gVGFibGVVdGlscy5nZXRBY3RpdmVUYWJsZUNlbGwoKTtcblxuICAgICAgICBpZiAoYWN0aXZlQ2VsbCkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBhY3RpdmVDZWxsLmNsb3Nlc3QoJ3RhYmxlJykhO1xuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcblxuICAgICAgICAgICAgc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICBzdGF0aWMgaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCB0YXJnZXRIZXhDb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghY2VsbCB8fCBjZWxsLnRhZ05hbWUgIT09ICdURCcgfHwgIWNlbGwuaGFzQXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcbiAgICAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xuXG4gICAgICAgIGNvbnN0IGhleEJhY2tncm91bmRDb2xvciA9IFV0aWxzLnJnYlRvSGV4KGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IpO1xuXG4gICAgICAgIHJldHVybiBoZXhCYWNrZ3JvdW5kQ29sb3IudG9VcHBlckNhc2UoKSA9PT0gdGFyZ2V0SGV4Q29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBxdWVyeVN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3QgY2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XG5cbiAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcblxuICAgICAgICAgICAgY29uc3QgaGV4QmFja2dyb3VuZENvbG9yID0gVXRpbHMucmdiVG9IZXgoY3VycmVudEJhY2tncm91bmRDb2xvcik7XG5cbiAgICAgICAgICAgIHJldHVybiBoZXhCYWNrZ3JvdW5kQ29sb3IudG9VcHBlckNhc2UoKSA9PT0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBjb25zdCBhID0gRE9NVXRpbHMuXG5cbiAgICAgICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICAvLyBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcblxuICAgICAgICAvLyBjb25zdCBhY3RpdmVDZWxsID0gVGFibGVVdGlscy5nZXRBY3RpdmVUYWJsZUNlbGwoKTtcblxuICAgICAgICAvLyBpZiAoYWN0aXZlQ2VsbCkge1xuICAgICAgICAvLyAgICAgY29uc3QgdGFibGUgPSBhY3RpdmVDZWxsLmNsb3Nlc3QoJ3RhYmxlJykhO1xuXG4gICAgICAgIC8vICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcblxuICAgICAgICAvLyAgICAgc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAvLyAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgLy8gICAgIH0pO1xuXG4gICAgICAgIC8vICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG5cbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKGVsZW1lbnRzOiBIVE1MVGFibGVDZWxsRWxlbWVudFtdLCBjb2xvcjogQ29sb3JzKTogYm9vbGVhbiB7XG5cbiAgICAgICAgbGV0IGlzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY29sb3IgPT0gQ29sb3JzLkJhY2tncm91bmRDb2xvck5vbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goY2VsbCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XG4gICAgICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBVdGlscy5yZ2JUb0hleChyZ2JDb2xvcikudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChoZXhDb2xvciAhPT0gY29sb3IudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGlzID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpcztcbiAgICB9XG5cblxuICAgIC8vIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgLy8gICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImhpbGl0ZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAvLyAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuICAgIC8vICAgICB9ZWxzZXtcbiAgICAvLyAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCB2YWx1ZSwgXCJoaWRlXCIpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG4gICAgICAgIGNvbnN0IG1lbWVudG8gPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SU1lbWVudG8+KFwiSU1lbWVudG9cIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UoZm9jdXNTdGFjaywgbWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnNlcnRSb3dBYm92ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpOyAvLyBBZ29yYSwgYGNlbGxgIMOpIGEgYHRkYCBkaXJldGFtZW50ZVxuICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQ7IC8vIE9idGVtIGEgbGluaGEgKGB0cmApIHBhaSBkYSBjw6lsdWxhXG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcm93IGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5jbG9zZXN0KFwidGFibGVcIik7IC8vIEVuY29udHJhIGEgdGFiZWxhIHF1ZSBjb250w6ltIGEgbGluaGFcbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpIHx8IHRhYmxlOyAvLyBBc3N1bWUgdGFibGUgc2UgdGJvZHkgbsOjbyBleGlzdGlyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0Ym9keS5jaGlsZHJlbikuaW5kZXhPZihyb3cpOyAvLyBFbmNvbnRyYSBvIMOtbmRpY2UgZGEgbGluaGEgZGVudHJvIGRvIHRib2R5IG91IGRhIHRhYmVsYVxuXG4gICAgICAgIGlmIChyb3dJbmRleCA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSb3cgaW5kZXggbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgVGFibGVVdGlscy5hZGRSb3codGFibGUsIHJvd0luZGV4KTsgLy8gSW5zZXJlIHVtYSBub3ZhIGxpbmhhIG5vIMOtbmRpY2UgZW5jb250cmFkb1xuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICB9XG5cbiAgICBpbnNlcnRSb3dCZWxvdyhibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwidGFibGVcIik7XG4gICAgICAgICAgICBpZiAodGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKFwidHI6bGFzdC1jaGlsZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0YWJsZS5jaGlsZHJlblswXS5jaGlsZHJlbikuaW5kZXhPZihyb3cpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgVGFibGVVdGlscy5hZGRSb3codGFibGUsIHJvd0luZGV4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcm93cyBpbiB0aGUgdGFibGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBmb2N1c2VkIGVsZW1lbnQgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGVsZW1lbnQuY2xvc2VzdChcInRkXCIpO1xuICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0YWJsZS5jaGlsZHJlblswXS5jaGlsZHJlbikuaW5kZXhPZihyb3cpICsgMTtcbiAgICAgICAgICAgICAgICBUYWJsZVV0aWxzLmFkZFJvdyh0YWJsZSwgcm93SW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGluc2VydENvbHVtbihkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcpOiB2b2lkIHtcbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpOyAgLy8gU2FsdmEgbyBlc3RhZG8gYXR1YWwgcGFyYSBwb3Nzw612ZWwgZGVzZmF6aW1lbnRvXG5cbiAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7ICAvLyBQZWdhIG8gZWxlbWVudG8gYXR1YWxtZW50ZSBmb2NhZG9cbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAvLyAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTsgIC8vIEVuY29udHJhIGEgY8OpbHVsYSBmb2NhZGEgZGVudHJvIGRhIHRhYmVsYVxuICAgIC8vICAgICBpZiAoIWNlbGwpIHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpOyAgLy8gRW5jb250cmEgYSB0YWJlbGEgY29udGVuZG8gYSBjw6lsdWxhXG4gICAgLy8gICAgIGlmICghdGFibGUpIHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAvLyAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gQXJyYXkuZnJvbShjZWxsLnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pLmluZGV4T2YoY2VsbCk7ICAvLyBEZXRlcm1pbmEgbyDDrW5kaWNlIGRhIGNvbHVuYSBhdHVhbFxuICAgIC8vICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAvLyAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCk7ICAvLyBBZGljaW9uYSBjb2x1bmEgw6AgZXNxdWVyZGFcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCArIDEpOyAgLy8gQWRpY2lvbmEgY29sdW5hIMOgIGRpcmVpdGFcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIGluc2VydENvbHVtbkxlZnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBBcnJheS5mcm9tKGNlbGwucGFyZW50RWxlbWVudCEuY2hpbGRyZW4pLmluZGV4T2YoY2VsbCk7XG4gICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XG5cbiAgICB9XG5cbiAgICBpbnNlcnRDb2x1bW5SaWdodChibG9jazogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gQXJyYXkuZnJvbShjZWxsLnBhcmVudEVsZW1lbnQhLmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpO1xuICAgICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUsIGNvbHVtbkluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtcm93XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcbiAgICB9XG5cbiAgICBzaG93SW5zZXJ0Q29sdW1uRWxlbWVudChibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaW5zZXJ0TGluZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgfVxuXG4gICAgaGlkZUluc2VydFJvd0VsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1yb3dcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgfVxuXG4gICAgaGlkZUluc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1jb2x1bW5cIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgfVxuXG4gICAgLy8gaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyAgICAgcmV0dXJuIFRhYmxlVXRpbHMuaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlKTtcbiAgICAvLyB9XG5cbiAgICAvLyBlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50ID0gKHNjb3BlOiBUYWJsZVNjb3BlcywgY29sb3I6IENvbG9ycyk6IHZvaWQgPT4ge1xuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChDb21tYW5kcy4sIHtcbiAgICAvLyAgICAgICAgIGRldGFpbDogeyBzY29wZTogc2NvcGUgfVxuICAgIC8vICAgICB9KTtcblxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICAvLyB9XG5cblxuICAgIGNoYW5nZVRhYmxlQm9yZGVyQ29sb3Ioc2NvcGU6IFRhYmxlU2NvcGVzLCBjb2xvcjogQ29sb3JzKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5jbG9zZXN0KERPTUVsZW1lbnRzLlRBQkxFKTtcblxuICAgICAgICBpZiAodGFibGUpIHtcbiAgICAgICAgICAgIFRhYmxlVXRpbHMuY2hhbmdlQ2VsbEJvcmRlckNvbG9yKHRhYmxlLCBzY29wZSwgY29sb3IpXG4gICAgICAgIH1cbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBDb21tb25DbGFzc2VzIH0gZnJvbSBcIkAvY29tbW9uL0NvbW1vbkNsYXNzZXNcIjtcclxuaW1wb3J0IHsgSU1lbWVudG8gfSBmcm9tIFwiLi9JTWVtZW50b1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8ge1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBxdWVyeTogc3RyaW5nID0gXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnQtd3JhcHBlclwiO1xyXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBNZW1lbnRvO1xyXG5cclxuICBwcml2YXRlIHVuZG9TdGFjazogeyBodG1sOiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9IH1bXSA9IFtdO1xyXG4gIHByaXZhdGUgcmVkb1N0YWNrOiB7IGh0bWw6IHN0cmluZywgY2FyZXRQb3NpdGlvbjogeyBjaGFySW5kZXg6IG51bWJlciwgaG9yaXpvbnRhbFBvczogbnVtYmVyLCB2ZXJ0aWNhbFBvczogbnVtYmVyIH0gfVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgZ2V0IGNvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoTWVtZW50by5xdWVyeSkhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGlmIChNZW1lbnRvLmluc3RhbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBNZW1lbnRvLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICBjb25zdCBjbG9uZSA9IHRoaXMuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gRE9NVXRpbHMuc2F2ZUNhcmV0UG9zaXRpb24zZCh0aGlzLmNvbnRlbnQpO1xyXG5cclxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKGAuJHtDb21tb25DbGFzc2VzLkVkaXRvck9ubHl9YCkuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XHJcblxyXG4gICAgICAgIHRoaXMudW5kb1N0YWNrLnB1c2goeyBodG1sOiBjbG9uZS5pbm5lckhUTUwsIGNhcmV0UG9zaXRpb24gfSk7XHJcbiAgICAgICAgdGhpcy5yZWRvU3RhY2sgPSBbXTtcclxuICAgICAgfSwgMTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5yZWRvU3RhY2sucHVzaCh7IGh0bWw6IHRoaXMuY29udGVudC5pbm5lckhUTUwsIGNhcmV0UG9zaXRpb246IERPTVV0aWxzLnNhdmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50KSB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlVG9SZXN0b3JlID0gdGhpcy51bmRvU3RhY2sucG9wKCk7XHJcbiAgICAgIGlmIChzdGF0ZVRvUmVzdG9yZSkge1xyXG4gICAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvUmVzdG9yZS5odG1sO1xyXG4gICAgICAgIERPTVV0aWxzLnJlc3RvcmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50LCBzdGF0ZVRvUmVzdG9yZS5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWRvKCkge1xyXG4gICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy51bmRvU3RhY2sucHVzaCh7IGh0bWw6IHRoaXMuY29udGVudC5pbm5lckhUTUwsIGNhcmV0UG9zaXRpb246IERPTVV0aWxzLnNhdmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50KSB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlVG9BcHBseSA9IHRoaXMucmVkb1N0YWNrLnBvcCgpO1xyXG4gICAgICBpZiAoc3RhdGVUb0FwcGx5KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50LmlubmVySFRNTCA9IHN0YXRlVG9BcHBseS5odG1sO1xyXG4gICAgICAgIERPTVV0aWxzLnJlc3RvcmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50LCBzdGF0ZVRvQXBwbHkuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF0dGFjaEV2ZW50cygpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd6Jykge1xyXG4gICAgICAgIHRoaXMudW5kbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gICAgICAgIHRoaXMucmVkbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAvLyAgIGNvbnN0IGlucHV0RXZlbnQgPSBldmVudCBhcyBJbnB1dEV2ZW50O1xyXG4gICAgLy8gICBpZiAoIWlucHV0RXZlbnQuaXNDb21wb3NpbmcgJiYgIWlucHV0RXZlbnQuaW5wdXRUeXBlLnN0YXJ0c1dpdGgoXCJkZWxldGVcIikpIHtcclxuICAgIC8vICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGVib3VuY2VUaW1lcik7XHJcbiAgICAvLyAgICAgdGhpcy5kZWJvdW5jZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5zYXZlU3RhdGUoKTtcclxuICAgIC8vICAgICB9LCB0aGlzLmRlYm91bmNlRGVsYXkpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5dXAsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5TcGFjZSkge1xyXG4gICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBNZW1lbnRvIHtcclxuICAgIGlmICghTWVtZW50by5pbnN0YW5jZSkge1xyXG4gICAgICBNZW1lbnRvLmluc3RhbmNlID0gbmV3IE1lbWVudG8oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWVtZW50by5pbnN0YW5jZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcbmltcG9ydCB7IElFZGl0YWJsZU5hdmlnYXRpb24gfSBmcm9tIFwiLi9JRWRpdGFibGVOYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIkAvY29tbW9uL0RpcmVjdGlvbnNcIjtcbmltcG9ydCB7IEJvdW5kYXJpZXMgfSBmcm9tIFwiQC9jb21tb24vQm91bmRhcmllc1wiO1xuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSBcIkAvY29tcG9uZW50cy9xdWljay1tZW51L0lRdWlja01lbnVcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiLi9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBoYW5kbGVzIGtleWJvYXJkIGV2ZW50cyB0byBuYXZpZ2F0ZSBiZXR3ZWVuIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50cyB1c2luZyBhcnJvdyBrZXlzLFxuICogYW5kIGVuc3VyZXMgZm9jdXMgbWFuYWdlbWVudCBhbmQgY2FyZXQgcGxhY2VtZW50IHdpdGhpbiB0aGVzZSBlbGVtZW50cy5cbiAqIEl0IGltcGxlbWVudHMgdGhlIGBJRWRpdGFibGVOYXZpZ2F0aW9uYCBpbnRlcmZhY2UgYW5kIHVzZXMgYSBzaW5nbGV0b24gcGF0dGVybiB0byBtYW5hZ2UgaXRzIGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgRWRpdGFibGVOYXZpZ2F0aW9uIGltcGxlbWVudHMgSUVkaXRhYmxlTmF2aWdhdGlvbiB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRWRpdGFibGVOYXZpZ2F0aW9uO1xuXG4gICAgcXVpY2tNZW51OiBJUXVpY2tNZW51O1xuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGV4dGVybmFsIGluc3RhbnRpYXRpb24uXG4gICAgICogSXQgYmluZHMgdGhlIGBoYW5kbGVBcnJvd0tleXNgIG1ldGhvZCB0byBrZXlib2FyZCBldmVudHMgb24gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocXVpY2tNZW51OiBJUXVpY2tNZW51KSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUFycm93S2V5cy5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnF1aWNrTWVudSA9IHF1aWNrTWVudTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3RzIGFzIGEgdHJpZ2dlciB3aXRoaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbnRhaW5lciB0byBlbnN1cmUgaW5zdGFudGlhdGlvbiBvZiB0aGlzIHNpbmdsZXRvbiBjbGFzcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIGFueSBvcGVyYXRpb25zIGl0c2VsZiBidXQgZW5zdXJlcyB0aGF0IGFuIGluc3RhbmNlIG9mIEVkaXRhYmxlTmF2aWdhdGlvblxuICAgICAqIGlzIGNyZWF0ZWQgYW5kIHJlYWR5IHRvIGxpc3RlbiB0byBrZXlib2FyZCBldmVudHMuIFRoaXMgaXMgY3J1Y2lhbCBmb3Igc2V0dGluZyB1cCB0aGUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogdGhhdCBtYW5hZ2UgbmF2aWdhdGlvbiB3aXRoaW4gZWRpdGFibGUgY29udGVudCBhcmVhcywgYXMgaXQgdHJpZ2dlcnMgdGhlIG5lY2Vzc2FyeSBiaW5kaW5ncyB1cG9uIGluc3RhbnRpYXRpb24uXG4gICAgICovXG4gICAgbGlzdGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVkaXRhYmxlTmF2aWdhdGlvbiBpcyBub3cgbGlzdGVuaW5nIGZvciBrZXkgZXZlbnRzLlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWRpdGFibGVOYXZpZ2F0aW9uIGNsYXNzLlxuICAgICAqIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCwgaXQgY3JlYXRlcyBhIG5ldyBvbmUuXG4gICAgICogQHJldHVybnMge0VkaXRhYmxlTmF2aWdhdGlvbn0gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWRpdGFibGVOYXZpZ2F0aW9uIGNsYXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRWRpdGFibGVOYXZpZ2F0aW9uIHtcblxuICAgICAgICBpZiAoIUVkaXRhYmxlTmF2aWdhdGlvbi5pbnN0YW5jZSkge1xuXG4gICAgICAgICAgICBjb25zdCBxdWlja01lbnUgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVF1aWNrTWVudT4oXCJJUXVpY2tNZW51XCIpO1xuXG4gICAgICAgICAgICBFZGl0YWJsZU5hdmlnYXRpb24uaW5zdGFuY2UgPSBuZXcgRWRpdGFibGVOYXZpZ2F0aW9uKHF1aWNrTWVudSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVkaXRhYmxlTmF2aWdhdGlvbi5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5cyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuXG4gICAgICAgIGlmICghdGhpcy5xdWlja01lbnUuaXNWaXNpYmxlICYmIGV2ZW50LmtleS5zdGFydHNXaXRoKCdBcnJvdycpICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudEVkaXRhYmxlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFZGl0YWJsZSAmJiBjdXJyZW50RWRpdGFibGUuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTd2l0Y2hFZGl0YWJsZShjdXJyZW50RWRpdGFibGUsIGV2ZW50LmtleSBhcyBEaXJlY3Rpb25zKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFZGl0YWJsZSA9IHRoaXMuZmluZE5leHRFZGl0YWJsZShjdXJyZW50RWRpdGFibGUsIGV2ZW50LmtleSBhcyBEaXJlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFZGl0YWJsZSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd1VwIHx8IGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93RG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VDYXJldEluU2ltaWxhclBvc2l0aW9uKGN1cnJlbnRFZGl0YWJsZSwgbmV4dEVkaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93TGVmdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChuZXh0RWRpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KG5leHRFZGl0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmVzIGlmIG5hdmlnYXRpb24gc2hvdWxkIHN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGVkaXRhYmxlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGFycm93IGRpcmVjdGlvbiBhbmQgY2FyZXQgcG9zaXRpb24uXG4gICAgKiBJdCBjaGVja3MgaWYgdGhlIGNhcmV0IGlzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGV2YWx1YXRlcyBib3VuZGFyeSBjb25kaXRpb25zIGZvciB2ZXJ0aWNhbCBuYXZpZ2F0aW9uLlxuICAgICogXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGN1cnJlbnQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgYmVpbmcgZXZhbHVhdGVkLlxuICAgICogQHBhcmFtIHtEaXJlY3Rpb25zfSBkaXJlY3Rpb24gLSBUaGUgbmF2aWdhdGlvbiBkaXJlY3Rpb24gaW5kaWNhdGVkIGJ5IHRoZSBhcnJvdyBrZXkgcHJlc3MuXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBuYXZpZ2F0aW9uIHNob3VsZCBtb3ZlIHRvIGFub3RoZXIgZWxlbWVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICovXG4gICAgcHJpdmF0ZSBzaG91bGRTd2l0Y2hFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogYm9vbGVhbiB7XG5cbiAgICAgICAgLy8gRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAvLyBJZiBoYXMgc2VsZWN0aW9uIGlnbm9yZSBuYXZpZ2F0aW9uIFxuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW5kT2Zmc2V0ICE9IHJhbmdlLnN0YXJ0T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYXRTdGFydCwgYXRFbmQgfSA9IERPTVV0aWxzLmdldFNlbGVjdGlvblRleHRJbmZvKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNBdEZpcnN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkZpcnN0KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRMYXN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkxhc3QpO1xuXG4gICAgICAgICAgICBpZiAoKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgJiYgYXRTdGFydCkgfHwgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0ICYmIGF0RW5kKSB8fFxuICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCAmJiAoYXRTdGFydCB8fCBpc0F0Rmlyc3RMaW5lKSkgfHxcbiAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93RG93biAmJiAoYXRFbmQgfHwgaXNBdExhc3RMaW5lKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBdExpbmVCb3VuZGFyeShlbGVtZW50OiBIVE1MRWxlbWVudCwgYm91bmRhcnk6IEJvdW5kYXJpZXMpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBoYXNUZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gXCJcIjtcblxuICAgICAgICBpZiAoIWhhc1RleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVswXTtcblxuICAgICAgICBpZiAoIXJlY3QpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gMTE7XG5cbiAgICAgICAgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocmVjdC50b3AgLSBlbGVtZW50UmVjdC50b3ApIDwgdG9sZXJhbmNlO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkxhc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhyZWN0LmJvdHRvbSAtIGVsZW1lbnRSZWN0LmJvdHRvbSkgPCB0b2xlcmFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBMb2NhdGVzIHRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiBkaXJlY3Rpb24uXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCBib3RoIGhvcml6b250YWwgKGxlZnQvcmlnaHQpIGFuZCB2ZXJ0aWNhbCAodXAvZG93bikgZGlyZWN0aW9ucyBhbmQgaGFuZGxlcyB0YWJsZSBjZWxsIGJvdW5kYXJpZXMuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudCBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiB0aGUgYXJyb3cga2V5IG5hdmlnYXRpb24uXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiB0aGUgZGVzaXJlZCBkaXJlY3Rpb24gb3IgbnVsbCBpZiBubyBzdWl0YWJsZSBlbGVtZW50IGlzIGZvdW5kLlxuICAgICovXG4gICAgcHJpdmF0ZSBmaW5kTmV4dEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBhbGxFZGl0YWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuXG4gICAgICAgIC8vIFRoZSB0YWJsZSBuYXZpZ2F0aW9uIGJlaGF2aW9yIGlzIGEgbGl0dGxlIGRpZmZlcmVudFxuICAgICAgICBpZiAoY3VycmVudC5jbG9zZXN0KFwidGRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY3VycmVudC5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gY3VycmVudC5jbG9zZXN0KFwidGRcIik7XG4gICAgICAgICAgICBpZiAodGFibGUgJiYgY2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5laWdoYm9yQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0TmVpZ2hib3JDZWxsKHRhYmxlLCBjZWxsLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmIChuZWlnaGJvckNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5laWdoYm9yQ2VsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV4dEluZGV4ID0gLTE7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dMZWZ0IHx8IGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0KSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dMZWZ0ID8gY3VycmVudEluZGV4IC0gMSA6IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSB0aGlzLmZpbmRWZXJ0aWNhbEVkaXRhYmxlSW5kZXgoY3VycmVudCwgYWxsRWRpdGFibGVzLCBkaXJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IDAgfHwgbmV4dEluZGV4ID49IGFsbEVkaXRhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFsbEVkaXRhYmxlc1tuZXh0SW5kZXhdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBGaW5kcyB0aGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiBhIHZlcnRpY2FsIGRpcmVjdGlvbiAodXAgb3IgZG93bikgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAgICAqIEl0IGNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgZWRpdGFibGUgZWxlbWVudCBiYXNlZCBvbiB2ZXJ0aWNhbCBkaXN0YW5jZSBhbmQgbWluaW1hbCBob3Jpem9udGFsIHNoaWZ0LCBmYXZvcmluZyBlbGVtZW50cyBkaXJlY3RseSBhYm92ZSBvciBiZWxvdy5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY3VycmVudCAtIFRoZSBjdXJyZW50bHkgZm9jdXNlZCBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gYWxsRWRpdGFibGVzIC0gQW4gYXJyYXkgb2YgYWxsIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50cy5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiBuYXZpZ2F0aW9uLCBlaXRoZXIgdXAgb3IgZG93bi5cbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCB2ZXJ0aWNhbCBlZGl0YWJsZSBlbGVtZW50IG9yIHRoZSBjdXJyZW50IGluZGV4IGlmIG5vbmUgYXJlIGNsb3Nlci5cbiAgICAqL1xuICAgIC8vIHByaXZhdGUgZmluZFZlcnRpY2FsRWRpdGFibGUoY3VycmVudDogSFRNTEVsZW1lbnQsIGFsbEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogbnVtYmVyIHtcbiAgICAvLyAgICAgY29uc3QgY3VycmVudEluZGV4ID0gYWxsRWRpdGFibGVzLmluZGV4T2YoY3VycmVudCk7XG4gICAgLy8gICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgbGV0IGNsb3Nlc3RJbmRleCA9IC0xO1xuICAgIC8vICAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAvLyAgICAgYWxsRWRpdGFibGVzLmZvckVhY2goKGVkaXRhYmxlLCBpbmRleCkgPT4ge1xuICAgIC8vICAgICAgICAgaWYgKGVkaXRhYmxlICE9PSBjdXJyZW50KSB7XG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVkaXRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdGFuY2UgPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCA/IGN1cnJlbnRSZWN0LnRvcCAtIHJlY3QuYm90dG9tIDogcmVjdC50b3AgLSBjdXJyZW50UmVjdC5ib3R0b207XG4gICAgLy8gICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3RhbmNlID0gTWF0aC5hYnMoY3VycmVudFJlY3QubGVmdCAtIHJlY3QubGVmdCk7XG5cbiAgICAvLyAgICAgICAgICAgICBpZiAodmVydGljYWxEaXN0YW5jZSA+IDAgJiYgKHZlcnRpY2FsRGlzdGFuY2UgKyBob3Jpem9udGFsRGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IHZlcnRpY2FsRGlzdGFuY2UgKyBob3Jpem9udGFsRGlzdGFuY2U7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNsb3Nlc3RJbmRleCA9IGluZGV4O1xuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfSk7XG5cbiAgICAvLyAgICAgcmV0dXJuIGNsb3Nlc3RJbmRleCA9PT0gLTEgPyBjdXJyZW50SW5kZXggOiBjbG9zZXN0SW5kZXg7XG4gICAgLy8gfVxuICAgIHByaXZhdGUgZmluZFZlcnRpY2FsRWRpdGFibGVJbmRleChjdXJyZW50OiBIVE1MRWxlbWVudCwgYWxsRWRpdGFibGVzOiBIVE1MRWxlbWVudFtdLCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBhbGxFZGl0YWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICBcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1VwKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgtLTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dEb3duKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBpZiAobmV4dEluZGV4ID49IDAgJiYgbmV4dEluZGV4IDwgYWxsRWRpdGFibGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBQbGFjZXMgdGhlIGNhcmV0IGluIGEgcG9zaXRpb24gd2l0aGluIHRoZSBuZXh0IGVsZW1lbnQgdGhhdCBjbG9zZWx5IG1hdGNoZXMgaXRzIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIG1vdmluZyBmb2N1cyBiZXR3ZWVuIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50cyB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlLlxuICAgICogXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjdXJyZW50IC0gVGhlIGN1cnJlbnQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgd2hlcmUgdGhlIGNhcmV0IGlzIGxvY2F0ZWQuXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBuZXh0IC0gVGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGNhcmV0IHdpbGwgbW92ZS5cbiAgICAqL1xuICAgIHByaXZhdGUgcGxhY2VDYXJldEluU2ltaWxhclBvc2l0aW9uKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBuZXh0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBjdXJyZW50UmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihuZXh0LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgbGV0IGJlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgICAgIGxldCBiZXN0T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgICAgICAgICAgaWYgKGJlc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUgfHwgIW5vZGUubm9kZVZhbHVlKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKHRlc3RSZWN0LmxlZnQgLSByZWN0LmxlZnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGhvcml6b250YWxEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpO1xuXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYmVzdE5vZGUsIGJlc3RPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhuZXh0KTtcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59IiwiaW1wb3J0ICcuL2Fzc2V0cy9jc3MvbWFpbi5jc3MnO1xyXG5pbXBvcnQgeyBVSUJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXJzL1VJQnVpbGRlcic7XHJcbmltcG9ydCB7IENvbW1hbmREaXNwYXRjaGVyIH0gZnJvbSAnLi9jb21tYW5kcy9Db21tYW5kRGlzcGF0Y2hlcic7XHJcbmltcG9ydCB7IFNob3J0Y3V0TGlzdGVuZXJzIH0gZnJvbSAnLi9jb3JlL1Nob3J0Y3V0TGlzdGVuZXJzJztcclxuaW1wb3J0IHsgVGFibGVMaXN0ZW5lcnMgfSBmcm9tICcuL2NvcmUvbGlzdGVuZXJzL1RhYmxlTGlzdGVuZXJzJztcclxuaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSAnLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51JztcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gJy4vY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyJztcclxuaW1wb3J0IHsgRm9jdXNTdGFjayB9IGZyb20gJy4vY29yZS9Gb2N1c1N0YWNrJztcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlJztcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlJztcclxuaW1wb3J0IHsgVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvVGV4dE9wZXJhdGlvbnNTZXJ2aWNlJztcclxuaW1wb3J0IHsgVGFibGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZU9wZXJhdGlvbnNTZXJ2aWNlJztcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSAnLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyJztcclxuaW1wb3J0IHsgTWVtZW50byB9IGZyb20gJy4vY29yZS9NZW1lbnRvJztcclxuaW1wb3J0IHsgRWRpdGFibGVOYXZpZ2F0aW9uIH0gZnJvbSAnLi9jb3JlL0VkaXRhYmxlTmF2aWdhdGlvbic7XHJcbmltcG9ydCB7IEJsb2NrVG9vbGJveCB9IGZyb20gJy4vY29tcG9uZW50cy9ibG9jay10b29sYm94L0Jsb2NrVG9vbGJveCc7XHJcblxyXG4vKipcclxuICogVGhpcyBzY3JpcHQgaW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBhbmQgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMgb25jZSB0aGUgRE9NIGNvbnRlbnQgaGFzIGZ1bGx5IGxvYWRlZC5cclxuICogSXQgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB1c2VyIGludGVyZmFjZSBhbmQgc3RhcnRpbmcgdGhlIGV2ZW50IGxpc3RlbmluZyBwcm9jZXNzIHRvIGhhbmRsZSBjb21tYW5kcy5cclxuICpcclxuICogVGhlIGBET01Db250ZW50TG9hZGVkYCBldmVudCBlbnN1cmVzIHRoYXQgYWxsIHRoZSBET00gY29udGVudCBoYXMgYmVlbiBmdWxseSBwYXJzZWQgYW5kIGxvYWRlZCBiZWZvcmUgdGhlIGluaXRpYWxpemF0aW9uIGJlZ2lucy5cclxuICogYFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7YCBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhbmQgYWN0aXZhdGUgdGhlIHVzZXIgaW50ZXJmYWNlLlxyXG4gKiBgQ29tbWFuZERpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5saXN0ZW4oKTtgIHJldHJpZXZlcyBhbiBpbnN0YW5jZSBvZiB0aGUgQ29tbWFuZERpc3BhdGNoZXIgYW5kIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIGV2ZW50cy5cclxuICovXHJcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklNZW1lbnRvXCIsICgpID0+IE1lbWVudG8uZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVNob3J0Y3V0TGlzdGVuZXJzXCIsICgpID0+IFNob3J0Y3V0TGlzdGVuZXJzLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklUYWJsZUxpc3RlbmVyc1wiLCAoKSA9PiBUYWJsZUxpc3RlbmVycy5nZXRJbnN0YW5jZSgpKTtcclxuXHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUZvY3VzU3RhY2tcIiwgKCkgPT4gRm9jdXNTdGFjay5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIsICgpID0+IEVsZW1lbnRGYWN0b3J5U2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIsICgpID0+IFRleHRPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIsICgpID0+IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgLy9Vc2VySW50ZXJmYWNlXHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVF1aWNrTWVudVwiLCAoKSA9PiBRdWlja01lbnUuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiLCAoKSA9PiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUVkaXRhYmxlTmF2aWdhdGlvblwiLCAoKSA9PiBFZGl0YWJsZU5hdmlnYXRpb24uZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgVUlCdWlsZGVyLmJ1aWxkKCkuc3RhcnQoKTtcclxuXHJcbiAgICBDb21tYW5kRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmxpc3RlbigpO1xyXG4gICAgRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkubGlzdGVuKCk7XHJcbiAgICBCbG9ja1Rvb2xib3guZ2V0SW5zdGFuY2UoKS5saXN0ZW4oKTtcclxuXHJcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIlRleHRFZGl0b3JMb2FkZWRcIikpO1xyXG5cclxufSk7Il0sIm5hbWVzIjpbIl9fX0NTU19MT0FERVJfRVhQT1JUX19fIiwicHVzaCIsIm1vZHVsZSIsImlkIiwiZXhwb3J0cyIsImNzc1dpdGhNYXBwaW5nVG9TdHJpbmciLCJsaXN0IiwidG9TdHJpbmciLCJ0aGlzIiwibWFwIiwiaXRlbSIsImNvbnRlbnQiLCJuZWVkTGF5ZXIiLCJjb25jYXQiLCJsZW5ndGgiLCJqb2luIiwiaSIsIm1vZHVsZXMiLCJtZWRpYSIsImRlZHVwZSIsInN1cHBvcnRzIiwibGF5ZXIiLCJ1bmRlZmluZWQiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwiayIsIl9rIiwiY3NzTWFwcGluZyIsImJ0b2EiLCJiYXNlNjQiLCJ1bmVzY2FwZSIsImVuY29kZVVSSUNvbXBvbmVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwic291cmNlTWFwcGluZyIsInN0eWxlc0luRE9NIiwiZ2V0SW5kZXhCeUlkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwicmVzdWx0IiwibW9kdWxlc1RvRG9tIiwib3B0aW9ucyIsImlkQ291bnRNYXAiLCJpZGVudGlmaWVycyIsImJhc2UiLCJjb3VudCIsImluZGV4QnlJZGVudGlmaWVyIiwib2JqIiwiY3NzIiwic291cmNlTWFwIiwicmVmZXJlbmNlcyIsInVwZGF0ZXIiLCJhZGRFbGVtZW50U3R5bGUiLCJieUluZGV4Iiwic3BsaWNlIiwiYXBpIiwiZG9tQVBJIiwidXBkYXRlIiwibmV3T2JqIiwicmVtb3ZlIiwibGFzdElkZW50aWZpZXJzIiwibmV3TGlzdCIsImluZGV4IiwibmV3TGFzdElkZW50aWZpZXJzIiwiX2kiLCJfaW5kZXgiLCJtZW1vIiwiaW5zZXJ0Iiwic3R5bGUiLCJ0YXJnZXQiLCJzdHlsZVRhcmdldCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsIndpbmRvdyIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudERvY3VtZW50IiwiaGVhZCIsImUiLCJnZXRUYXJnZXQiLCJFcnJvciIsImFwcGVuZENoaWxkIiwiZWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsInN0eWxlRWxlbWVudCIsIm5vbmNlIiwic2V0QXR0cmlidXRlIiwiaW5zZXJ0U3R5bGVFbGVtZW50Iiwic3R5bGVUYWdUcmFuc2Zvcm0iLCJhcHBseSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsInJlbW92ZVN0eWxlRWxlbWVudCIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwiZmlyc3RDaGlsZCIsImNyZWF0ZVRleHROb2RlIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm4iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiZCIsImEiLCJkZWZpbml0aW9uIiwia2V5IiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJuYyIsIkNvbnRlbnRUeXBlcyIsIkljb25zIiwiVG9vbGJveE9wdGlvbnMiLCJDb21tb25DbGFzc2VzIiwiQ3VzdG9tVUlFdmVudHMiLCJEZWZhdWx0SlNFdmVudHMiLCJDdXN0b21FdmVudHMiLCJaSW5kZXgiLCJDb2xvcnMiLCJDb2xvcnNOYW1lcyIsIkNvbW1hbmRzIiwiQnV0dG9uSURzIiwiS2V5Ym9hcmRLZXlzIiwiRHJvcGRvd25JdGVtSURzIiwiRE9NRWxlbWVudHMiLCJEcm9wZG93bkxpc3RJRHMiLCJEcm9wZG93bk1lbnVJRHMiLCJsb2NhbHMiLCJVdGlscyIsImdlbmVyYXRlVW5pcXVlSWQiLCJ0aW1lUGFydCIsIkRhdGUiLCJub3ciLCJyYW5kb21BcnJheSIsIlVpbnQzMkFycmF5IiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwicmdiVG9IZXgiLCJyZ2IiLCJtYXRjaCIsIk51bWJlciIsIngiLCJoZXgiLCJpc1ZhbGlkVXJsIiwidXJsIiwicGF0dGVybiIsIlJlZ0V4cCIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ0ZXN0IiwiRWxlbWVudEZhY3RvcnlTZXJ2aWNlIiwiY3JlYXRvcnMiLCJzdGF0aWMiLCJCTE9DS19QQVJBR1JBUEgiLCJQQVJBR1JBUEgiLCJDSEVDS0JPWF9JVEVNIiwiTElTVF9JVEVNIiwiQ09ERSIsIlFVT1RFIiwiQlVMTEVURURfTElTVCIsIk5VTUJFUkVEX0xJU1QiLCJDSEVDS19MSVNUIiwiSEVBREVSXzEiLCJIRUFERVJfMiIsIkhFQURFUl8zIiwiSEVBREVSXzQiLCJIRUFERVJfNSIsIkhFQURFUl82IiwiRFJBR19IQU5ETEVfQlVUVE9OIiwiVEFCTEUiLCJJTUFHRSIsIlZJREVPIiwiU1BPVElGWSIsIkdJVEhVQl9HSVNUIiwiR0lUTEFCX1NOSVBQRVQiLCJDT0RFUEVOIiwiQ0FMTE9VVCIsIlNFUEFSQVRPUiIsIl9pbnN0YW5jZSIsInJlZ2lzdGVyIiwiRUxFTUVOVF9UWVBFUyIsImJsb2NrUGFyYWdyYXBoQ3JlYXRvciIsInBhcmFncmFwaENyZWF0b3IiLCJjaGVja2JveEl0ZW1DcmVhdG9yIiwibGlzdEl0ZW1DcmVhdG9yIiwiY29kZUNyZWF0b3IiLCJxdW90ZUNyZWF0b3IiLCJjaGVja0xpc3RDcmVhdG9yIiwiYnVsbGV0ZWRMaXN0Q3JlYXRvciIsIm51bWJlcmVkTGlzdENyZWF0b3IiLCJoZWFkaW5nQ3JlYXRvciIsImRyYWdIYW5kbGVCdXR0b25DcmVhdG9yIiwidGFibGVDcmVhdG9yIiwicGxhY2Vob2xkZXJDcmVhdG9yIiwiSW1hZ2UiLCJJbWFnZTIiLCJTaG93TWVkaWFJbnB1dFVwbG9hZCIsIlNob3dNZWRpYUlucHV0RW1iZWQiLCJJZnJhbWUiLCJZb3VUdWJlIiwiU3BvdGlmeSIsIkdpdEh1YiIsIkNvZGVQZW4iLCJjYWxsb3V0Q3JlYXRvciIsInNlcGFyYXRvckNyZWF0b3IiLCJnZXRJbnN0YW5jZSIsInR5cGUiLCJjcmVhdG9yIiwiY3JlYXRlIiwiVHlwZUVycm9yIiwiYmxvY2tQYXJhZ3JhcGgiLCJwYXJhZ3JhcGgiLCJsZXZlbCIsImhlYWRpbmciLCJjaGVja2JveEl0ZW0iLCJsaXN0SXRlbV8yIiwiZHJhZ0hhbmRsZUJ1dHRvbiIsImNvbnRhaW5lciIsImNsYXNzTGlzdCIsImFkZCIsImNvZGVCbG9jayIsInByZSIsIkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcyIsIkxhbmd1YWdlU2VsZWN0aW9uVG9vbENsYXNzIiwiRXh0cmFPcHRpb25zQ2xhc3MiLCJjb2RlIiwiY29udGVudEVkaXRhYmxlIiwidGV4dENvbnRlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlQXR0cmlidXRlIiwiaGxqcyIsImhpZ2hsaWdodEVsZW1lbnQiLCJjb250ZW50RWxlbWVudCIsImJsb2NrcXVvdGUiLCJnZXRSYW5kb21RdW90ZSIsInF1b3RhdGlvbnMiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJ1bCIsIkNoZWNrTGlzdCIsImluaXRpYWxJdGVtIiwiQnVsbGV0ZWRMaXN0IiwiTnVtYmVyZWRMaXN0IiwidGFibGVTaGVsbCIsInRhYmxlQ29udHJvbGxlciIsInRhYmxlV3JhcHBlciIsInRhYmxlIiwiQWxpZ25Ub29sQ2xhc3MiLCJUYWJsZSIsInRib2R5Iiwicm93RGF0YSIsInNwbGl0Iiwicm93IiwiZm9yRWFjaCIsImNlbGxDb250ZW50IiwiY2VsbCIsImFkZFJvdyIsImlubmVySFRNTCIsImFkZENvbHVtbiIsImNvbnRlbnRUeXBlIiwiaWNvbiIsInRleHQiLCJjbGFzc2VzIiwiQ29udGVudEVsZW1lbnQiLCJwbGFjZWhvbGRlciIsIlNob3dNZWRpYUlucHV0T25DbGljayIsInBsYWNlaG9sZGVySWNvbiIsImNyZWF0ZUljb24iLCJwbGFjZWhvbGRlclRleHQiLCJpbm5lclRleHQiLCJqb2hhbm5lc0NhbGxvdXQiLCJDb2xvclRvb2xDbGFzcyIsImNhbGxvdXRXcmFwcGVyIiwidGV4dEFyZWEiLCJ3cmFwcGVyIiwic2VwYXJhdG9yIiwicCIsIlBhcmFncmFwaCIsImgiLCJjaGVja2JveCIsInNwYW4iLCJkaXYiLCJuZXdEaXYiLCJuZXdFbGVtZW50IiwiZHJhZ0hhbmRsZXJXcmFwcGVyIiwiRWRpdG9yT25seSIsImJ1dHRvbiIsImRyYWdnYWJsZSIsImljb25JZCIsIkJhc2VVSUNvbXBvbmVudCIsIl9jYW5IaWRlIiwicHJvcHMiLCJodG1sRWxlbWVudCIsInBhcmVudCIsImNvbnN0cnVjdG9yIiwiaW5pdCIsImRpc3BsYXkiLCJzZXRJZCIsImFkZENzc0NsYXNzIiwidG9rZW5zIiwiYXBwZW5kVG8iLCJpc1Zpc2libGUiLCJ2aXNpYmlsaXR5IiwiY29udGFpbnMiLCJnZXRDb21wdXRlZFN0eWxlIiwicGFyZW50RWxlbWVudCIsInNob3ciLCJoaWRlIiwibG9ja0hpZGUiLCJ1bmxvY2tIaWRlIiwiY2FuSGlkZSIsInZhbHVlIiwiZm9jdXMiLCJjaGFuZ2VDb2xvciIsImNvbG9yIiwicmVtb3ZlQ29sb3IiLCJjaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlIiwiY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuIiwiZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbiIsIm9yaWdpbmFsRGlzcGxheSIsIm9yaWdpbmFsVmlzaWJpbGl0eSIsIm9yaWdpbmFsUG9zaXRpb24iLCJwb3NpdGlvbiIsImVsZW1lbnRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic2NyZWVuV2lkdGgiLCJpbm5lcldpZHRoIiwicmlnaHQiLCJsZWZ0IiwiZW5zdXJlVmlzaWJsZSIsImNsb3Nlc3QiLCJzY3JvbGxJbnRvVmlldyIsImJlaGF2aW9yIiwiYmxvY2siLCJpbmxpbmUiLCJjb25zb2xlIiwid2FybiIsImhhbmRsZUNsb3NlRWxlbWVudEV2ZW50IiwiZXZlbnQiLCJkZXRhaWxzIiwiZGV0YWlsIiwidGFyZ2V0SWQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJoYW5kbGVTaG93RWxlbWVudEV2ZW50IiwiYXR0YWNoVUlFdmVudCIsIkNsb3NlRWxlbWVudCIsImJpbmQiLCJTaG93RWxlbWVudCIsIkRlcGVuZGVuY3lDb250YWluZXIiLCJkZXBlbmRlbmNpZXMiLCJJbnN0YW5jZSIsImluc3RhbmNlIiwicmVzb2x2ZSIsIkRPTVV0aWxzIiwiaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJhbmdlQ291bnQiLCJub2RlIiwiYW5jaG9yTm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsInRhZ05hbWUiLCJnZXRTZWxlY3Rpb25UZXh0SW5mbyIsImVsIiwic2VsUmFuZ2UiLCJ0ZXN0UmFuZ2UiLCJhdFN0YXJ0IiwiYXRFbmQiLCJzZWwiLCJnZXRSYW5nZUF0IiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJzZXRFbmQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0Iiwic2V0U3RhcnQiLCJlbmRDb250YWluZXIiLCJlbmRPZmZzZXQiLCJpbnNlcnRBZnRlciIsIm5ld05vZGUiLCJyZWZlcmVuY2VOb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJoYXNUZXh0Q29udGVudCIsInRyaW0iLCJoYXNDaGlsZE5vZGVzIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGROb2RlcyIsInNvbWUiLCJjaGlsZE5vZGUiLCJjbG9uZUFuZEluc2VydEFmdGVyIiwiY2xvbmVkRWxlbWVudCIsImNsb25lTm9kZSIsInByZWZpeCIsImZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzIiwiY2xhc3NOYW1lIiwiYWN0aXZlRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwiZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiVEVYVF9OT0RFIiwicmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQiLCJjdXJyZW50Tm9kZSIsImN1cnNvclBvc2l0aW9uIiwiZ2V0Q3Vyc29yUG9zaXRpb24iLCJyYW5nZXMxIiwic3BsaXRDb250ZW50QXRDdXJzb3JTZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsImRlbGV0ZUZyb21Eb2N1bWVudCIsInNldEN1cnNvclBvc2l0aW9uIiwicmFuZ2VzMiIsInJhbmdlIiwiaW50ZXJzZWN0c05vZGUiLCJ0cmVlV2Fsa2VyIiwiY3JlYXRlVHJlZVdhbGtlciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJhY2NlcHROb2RlIiwiRklMVEVSX0FDQ0VQVCIsImNoYXJDb3VudCIsIm5leHROb2RlIiwiY3VycmVudFBvcyIsInRleHRMZW5ndGgiLCJjb2xsYXBzZSIsImdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQiLCJnZXRDdXJyZW50QWN0aXZlQmxvY2siLCJnZXRBdHRyaWJ1dGUiLCJyb290Tm9kZSIsInJhbmdlcyIsInJhbmdlQmVmb3JlIiwicmFuZ2VBZnRlciIsImxhc3RDaGlsZCIsInNldEVuZEFmdGVyIiwicGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQiLCJlZGl0YWJsZUVsZW1lbnQiLCJzZXRUaW1lb3V0IiwiaXNDb250ZW50RWRpdGFibGUiLCJwbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQiLCJjb250ZW50QmxvY2siLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJsYXN0Tm9kZSIsImlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mIiwicGFyZW50U2VsZWN0b3IiLCJyZW1vdmVGaWx0ZXJUZXh0IiwibGFzdFNsYXNoUG9zaXRpb24iLCJvZmZzZXQiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImRlbGV0ZUNvbnRlbnRzIiwiZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5RGF0YUNvbnRlbnRUeXBlIiwiZGF0YUNvbnRlbnRUeXBlIiwiY2xpY2tlZEVsZW1lbnQiLCJkYXRhc2V0IiwiZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlDbGFzcyIsImNsYXNzS2V5IiwiaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZiIsInNlbGVjdG9yIiwiRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsIm1hdGNoZXMiLCJnZXRQYXJlbnRUYXJnZXRCeVNlbGVjdG9yIiwiZ2V0UGFyZW50RnJvbVNlbGVjdGlvbiIsInJlbW92ZUNsYXNzZXNXaXRoUHJlZml4IiwiZmlsdGVyIiwiY2xzIiwic3RhcnRzV2l0aCIsImlzVGFyZ2V0RGVzY2VuZGFudE9mU2VsZWN0b3IiLCJIVE1MRWxlbWVudCIsIlRleHQiLCJxdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZiIsInNhbml0aXplQ29udGVudEVkaXRhYmxlIiwic2hvdWxkUmVzdG9yZUNhcmV0IiwiY2FyZXRQb3MiLCJlbmRzV2l0aCIsIm5vZGVOYW1lIiwiUmFuZ2UiLCJ0ZXh0Tm9kZXMiLCJnZXRUZXh0Tm9kZXNJbiIsInRleHROb2RlIiwibm9kZUxlbmd0aCIsImNoaWxkcmVuIiwiZ2V0UHJldmlvdXNDb250ZW50RWRpdGFibGUiLCJhbGxDb250ZW50RWRpdGFibGVzIiwicXVlcnlTZWxlY3RvckFsbCIsImluZGV4T2YiLCJnZXROZXh0Q29udGVudEVkaXRhYmxlIiwiZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlIiwiZmluZENvbnRlbnRFZGl0YWJsZUluRGVzY2VuZGFudHMiLCJjaGlsZCIsInNhdmVDYXJldFBvc2l0aW9uMmQiLCJyZWN0IiwiY2hhckluZGV4Iiwic2xpY2UiLCJhbmNob3JPZmZzZXQiLCJob3Jpem9udGFsUG9zIiwicmVzdG9yZUNhcmV0UG9zaXRpb24yZCIsIndhbGtlciIsImJlc3ROb2RlIiwiYmVzdE9mZnNldCIsImJlc3REaXN0YW5jZSIsIkluZmluaXR5Iiwibm9kZVZhbHVlIiwidGVzdFJlY3QiLCJob3Jpem9udGFsRGlzdGFuY2UiLCJhYnMiLCJzYXZlQ2FyZXRQb3NpdGlvbjNkIiwidmVydGljYWxQb3MiLCJ0b3AiLCJyZXN0b3JlQ2FyZXRQb3NpdGlvbjNkIiwidmVydGljYWxEaXN0YW5jZSIsInRvdGFsRGlzdGFuY2UiLCJzcXJ0IiwibWVyZ2VJbmxpbmVFbGVtZW50cyIsIm5vcm1hbGl6ZSIsImNoaWxkRWxlbWVudCIsIkZsb2F0aW5nVG9vbGJhciIsImRyb3Bkb3ducyIsInNlcGFyYXRvcnMiLCJjdXJyZW50U2VsZWN0aW9uUmFuZ2UiLCJodG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Iiwic3VwZXIiLCJ6SW5kZXgiLCJTbGlnaHRseUltcG9ydGFudCIsInNlbGVjdFdyYXBwZXIiLCJhbnlEcm9wZG93blZpc2libGUiLCJoaWRlQWxsRHJvcGRvd25WaXNpYmxlIiwiYXBwZW5kRHJvcGRvd24iLCJkcm9wZG93biIsImFwcGVuZEJ1dHRvbkdyb3VwIiwiYnV0dG9uR3JvdXAiLCJhcHBlbmRTZXBhcmF0b3IiLCJhcHBlbmRUZXh0VG9vbGJhciIsImRyb3Bkb3duTGlzdCIsImF0dGFjaEV2ZW50cyIsIkNsaWNrIiwicHJldmVudERlZmF1bHQiLCJNb3VzZWRvd24iLCJyZXN0b3JlUmFuZ2VTZWxlY3Rpb24iLCJibG9ja0RlbGV0ZWQiLCJibG9ja1R5cGVDaGFuZ2VkIiwiaXNTZWxlY3Rpb25FbXB0eSIsIkNoYW5nZUNvbG9yIiwiU2hvd0hpZGVBY3RpdmVCdXR0b24iLCJpbnRlbnRpb24iLCJSZXNldEFjdGl2ZUJ1dHRvbnMiLCJDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSIsImxhbmd1YWdlIiwiYmxvY2tJZCIsIkV2ZW50RW1pdHRlciIsImVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudCIsInRhcmdldENsYXNzIiwiY3VzdG9tRXZlbnQiLCJDdXN0b21FdmVudCIsImFjdGlvbiIsImRpc3BhdGNoRXZlbnQiLCJlbWl0U2hvd0VsZW1lbnRFdmVudCIsImVtaXRDbG9zZUVsZW1lbnRFdmVudCIsImVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50IiwiQ29sb3JDaGFuZ2VSZXF1ZXN0IiwiZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50IiwiaW50ZW5zaW9uIiwiSGlsaXRlQ29sb3JOb25lIiwiRm9yZUNvbG9ySW5pdGlhbCIsIkJhY2tncm91bmRDb2xvck5vbmUiLCJlbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50IiwiZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCIsInNjb3BlIiwiZW1pdHRlZENvbW1hbmQiLCJjb21tYW5kIiwiY2hhbmdlVGFibGVCb3JkZXJDb2xvciIsIlRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwidGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwiaW5pdGlhbFJlY3QiLCJsb2NrZWRIaWRlIiwiZGVib3VuY2VUaW1lciIsIlZlcnlJbXBvcnRhbnQiLCJwcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cyIsImlzTGluayIsInF1ZXJ5Q29tbWFuZFN0YXRlIiwiaXNCb2xkIiwiaXNJdGFsaWMiLCJpc1VuZGVybGluZSIsImlzSW5saW5lQ29kZSIsImlzU3RyaWtlVGhyb3VnaCIsImhpbGl0ZUNvbG9ycyIsIkhpbGl0ZUNvbG9yUmVkIiwicXVlcnlIaWxpdGVDb2xvciIsIkhpbGl0ZUNvbG9yR3JlZW4iLCJIaWxpdGVDb2xvckJsdWUiLCJIaWxpdGVDb2xvclllbGxvdyIsIkhpbGl0ZUNvbG9yR3JleSIsImZvcmVDb2xvcnMiLCJGb3JlQ29sb3JSZWQiLCJxdWVyeUZvcmVDb2xvciIsIkZvcmVDb2xvckdyZWVuIiwiRm9yZUNvbG9yQmx1ZSIsIkZvcmVDb2xvclllbGxvdyIsIkZvcmVDb2xvckdyZXkiLCJlbnRyaWVzIiwiYWN0aXZlIiwiTGluayIsIkJvbGQiLCJJdGFsaWMiLCJJbmxpbmVDb2RlIiwiVW5kZXJsaW5lIiwiU3RyaWtldGhyb3VnaCIsIkljb25BY3RpdmVCbHVlIiwiSWNvbkRlZmF1bHRCbGFjayIsInByb2Nlc3NBZnRlckNoYW5nZSIsImlzQ29sbGFwc2VkIiwiaXNTZWxlY3RpbmciLCJNb3VzZXVwIiwiQmJsQ2xpY2siLCJTZWxlY3Rpb25DaGFuZ2UiLCJLZXlkb3duIiwic2hpZnRLZXkiLCJLZXl1cCIsIlNoaWZ0Iiwic2hvd0hpZGUiLCJjbGVhclRpbWVvdXQiLCJFc2NhcGUiLCJzaG91bGRVcGRhdGVQb3NpdGlvbiIsImN1cnJlbnRSZWN0IiwiaGFzQ29udGVudCIsImhhc1NlbGVjdGlvbiIsImNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbiIsImVycm9yIiwicmVjdHMiLCJnZXRDbGllbnRSZWN0cyIsImZpcnN0UmVjdCIsImNfZmlyc3RSZWN0TGVmdCIsImNfZmlyc3RSZWN0VG9wIiwiY19maXJzdFJlY3RCb3R0b20iLCJib3R0b20iLCJlbGVtZW50V2lkdGgiLCJvZmZzZXRXaWR0aCIsImxlZnRQb3NpdGlvbiIsInNjcm9sbFgiLCJlbGVtZW50SGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0IiwidG9wUG9zaXRpb24iLCJzY3JvbGxZIiwiaGlkZVR1cm5JbnRvRHJvcGRvd25JZkluQ2VsbCIsImlzQ2VsbCIsInVwZGF0ZVBvc2l0aW9uIiwic2V0UG9zaXRpb24iLCJJbnB1dExpbmtCb3giLCJwYXJlbnRXcmFwcGVyIiwic2V0UGFyZW50V3JhcHBlciIsIklucHV0TGlua0JveFdyYXBwZXIiLCJpbnB1dExpbmtCb3giLCJoaWdobGlnaHRzIiwidGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIiLCJhdHRhY2hFdmVudCIsImhlYWRlciIsInNoZWxsIiwiQ29udHJvbCIsImJvZHkiLCJFbnRlciIsImluc2VydExpbmsiLCJjdHJsS2V5IiwiaHJlZiIsIm9wZW4iLCJ1cmxXaXRoUHJvdG9jb2wiLCJsaW5rUmVhZHlUb0luc2VydCIsImlucHV0IiwiYmFja2dyb3VuZENvbG9yIiwicG9zaXRpb25MaW5rQ29tcG9uZW50QmVsb3dTZWxlY3Rpb24iLCJoaWdobGlnaHRTZWxlY3RlZFRleHQiLCJyZW1vdmVIaWdobGlnaHRzIiwiaGlnaGxpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvcGFjaXR5IiwicG9pbnRlckV2ZW50cyIsIkVkaXRvciIsImVsZW1lbnRGYWN0b3J5U2VydmljZSIsIm1lbWVudG8iLCJ0aXRsZSIsImFkZEJsb2NrIiwidGV4dEZsb2F0aW5nVG9vbGJhciIsInF1aWNrTWVudSIsInRhYmxlQ29udGV4dFRvb2xiYXIiLCJtZWRpYUlucHV0dGVyIiwiaW5wdXRMaW5rQm94V3JhcHBlciIsImJsb2NrT3BlcmF0aW9uc1NlcnZpY2UiLCJmbG9hdGluZ1Rvb2xiYXIiLCJ0YWJsZVRvb2xiYXIiLCJzYXZlU3RhdGUiLCJnZXRFbGVtZW50QnlJZCIsImVkaXRvcklkIiwiY29udGVudFdyYXBwZXIiLCJlZGl0b3JDb25maWciLCJ0YWJsZUZsb2F0aW5nVG9vbGJhciIsImJsb2NrRWxlbWVudCIsImFwcGVuZERyYWdIYW5kbGVyIiwicmVhZHlTdGF0ZSIsImZpcnN0UGFyYWdyYXBoIiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJpbnNlcnRUZXh0QXRDdXJzb3IiLCJhdHRhY2hEcmFnSGFuZGxlciIsImluc2VydE5vZGUiLCJzZXRTdGFydEFmdGVyIiwiZHJhZ0hhbmRsZXIiLCJwcmVwZW5kIiwicmVtb3ZlRHJhZ0hhbmRsZXIiLCJleHRyYWN0Q29udGVudCIsImRyYWdnZWRJdGVtIiwiZHJvcExpbmUiLCJib3VuZGluZyIsInkiLCJjbGllbnRZIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50IiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIkFkZEJsb2NrQnV0dG9uIiwiZXhlY0NvbW1hbmQiLCJjcmVhdGVEZWZhdWx0QmxvY2siLCJBZGRCbG9ja1dyYXBwZXIiLCJTaXplcyIsIlNWR0ljb24iLCJ1c2VFbGVtZW50Iiwic2l6ZSIsImNyZWF0ZUVsZW1lbnROUyIsInVzZSIsInNldEF0dHJpYnV0ZU5TIiwiY2xvbmUiLCJzaXplcyIsInNldFVzZVRvIiwiQWRkQmxvY2tCdWlsZGVyIiwiYnVpbGQiLCJQbHVzIiwibWVkaXVtIiwiRHJvcGRvd25NZW51IiwiZHJvcGRvd25CdXR0b24iLCJwcmVmaXhJZCIsImNsYXNzZXNLZXkiLCJCYXNlRG91Ymx5TGlua2VkTGlzdCIsInRhaWwiLCJnZXRGaXJzdCIsImdldExhc3QiLCJTeW1ib2wiLCJpdGVyYXRvciIsImN1cnJlbnQiLCJjYWxsYmFjayIsImFueSIsInByZWRpY2F0ZSIsImZpbmRGaXJzdCIsImZpbmRMYXN0IiwicHJldmlvdXNOb2RlIiwiZmluZCIsIkpOb2RlIiwicGFyZW50TGlzdCIsInNldE5leHQiLCJzZXRQcmV2aW91cyIsImdldE5leHRTYXRpc2Z5aW5nIiwic3RhcnROb2RlIiwiZ2V0UHJldmlvdXNTYXRpc2Z5aW5nIiwiQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IiwiYXBwZW5kIiwiRHJvcGRvd25NZW51TGlzdEl0ZW0iLCJhY3RpdmVJY29uIiwibGVmdEljb24iLCJvbkZvY3VzRnVuY3Rpb25MaXN0Iiwib25Mb3NlRm9jdXNGdW5jdGlvbkxpc3QiLCJwYXJlbnREcm9wZG93bk1lbnVMaXN0Iiwic2hvcnRjdXQiLCJhZGRDbGFzcyIsImF0dGFjaE9uRm9jdXMiLCJmdW5jIiwiYXJncyIsImF0dGFjaE9uTG9zZUZvY3VzIiwicmVtb3ZlRm9jdXMiLCJ0YWJJbmRleCIsInRleHRPcHRpb24iLCJzaG9ydEN1dCIsImVtaXRDb21tYW5kRXZlbnQiLCJNb3VzZW1vdmUiLCJhc3luYyIsImRyb3Bkb3duSXRlbXMiLCJzd2l0Y2hWaXN1YWxGb2N1cyIsImhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQiLCJldmVudFZhbHVlcyIsImhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQiLCJoYW5kbGVSZXNldEFjdGl2ZUJ1dHRvbnNFdmVudCIsImV2ZW50Q29sb3IiLCJEcm9wZG93bk1lbnVMaXN0IiwicGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24iLCJjdXJyZW50Rm9jdXNlZE1lbnVJdGVtIiwibWF4SGVpZ2h0Iiwib3ZlcmZsb3dZIiwiRXh0cmVtZWx5SW1wb3J0YW50IiwiZHJvcGRvd25JdGVtIiwic2V0UGFyZW50RHJvcGRvd25NZW51QnV0dG9uIiwiZHJvcGRvd25QYXJlbnRCdXR0b24iLCJjbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZSIsImtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlIiwiZm9jdXNOZXh0VmlzaWJsZUl0ZW0iLCJmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0iLCJoYW5kbGVyS2V5RG93bkV2ZW50IiwiYmxvY2tDbG9uZWQiLCJhbHRLZXkiLCJtZXRhS2V5IiwiQmFja3NwYWNlIiwiYXBwbHlGaWx0ZXIiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsInN2Z0ljb24iLCJuZXh0VmlzaWJsZUl0ZW0iLCJwcmV2aW91c1Zpc2libGVJdGVtIiwiRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIiwiYm9yZGVyUmlnaHQiLCJtYXJnaW4iLCJCdXR0b25Hcm91cCIsIkJ1dHRvbkdyb3VwSXRlbSIsInNob3dVSSIsInRvZ2dsZUxpbmsiLCJDb2xvckljb24iLCJib3JkZXJSYWRpdXMiLCJib3JkZXIiLCJib3hTaXppbmciLCJEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIiwiY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSIsImdldExlZnRJY29uQmFja2dyb3VuZENvbG9yIiwicmVzZXRBY3RpdmVJY29uIiwiQmxvY2tUb29sYm94QnVpbGRlciIsImFsaWduVG9vbCIsImdyb3VwQnV0dG9uIiwiSnVzdGlmeUxlZnQiLCJKdXN0aWZ5U3RhcnQiLCJsYXJnZSIsIkp1c3RpZnlDZW50ZXIiLCJKdXN0aWZ5UmlnaHQiLCJKdXN0aWZ5RW5kIiwiY29sb3JUb29sIiwiY29sb3JEcm9wZG93bkxpc3QiLCJjb2xvckJ1dHRvbiIsIkRyb3Bkb3duTWVudUJ1dHRvbiIsImNvbG9yRHJvcGRvd24iLCJiYWNrZ3JvdW5kQ29sb3JSZWQiLCJCYWNrZ3JvdW5kT3B0aW9uUmVkIiwiY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciIsIkNhbGxvdXRCYWNrZ3JvdW5kUmVkIiwiYmFja2dyb3VuZENvbG9yR3JlZW4iLCJCYWNrZ3JvdW5kT3B0aW9uR3JlZW4iLCJDYWxsb3V0QmFja2dyb3VuZEdyZWVuIiwiYmFja2dyb3VuZENvbG9yQmx1ZSIsIkJhY2tncm91bmRPcHRpb25CbHVlIiwiQ2FsbG91dEJhY2tncm91bmRCbHVlIiwiYmFja2dyb3VuZENvbG9yWWVsbG93IiwiQmFja2dyb3VuZE9wdGlvblllbGxvdyIsIkNhbGxvdXRCYWNrZ3JvdW5kWWVsbG93IiwiYmFja2dyb3VuZENvbG9yR3JleSIsIkJhY2tncm91bmRPcHRpb25HcmV5IiwiQ2FsbG91dEJhY2tncm91bmRHcmV5IiwiYmFja2dyb3VuZENvbG9yTm9uZSIsIkJhY2tncm91bmRPcHRpb25Ob25lIiwiQ2FsbG91dEJhY2tncm91bmROb25lIiwibGFuZ3VhZ2VTZWxlY3Rpb25Ub29sIiwic2VsZWN0IiwibWVudSIsIkJsb2NrVG9vbGJveCIsImxhbmd1YWdlTWFwIiwic29ydCIsImIiLCJsb2NhbGVDb21wYXJlIiwibmFtZSIsImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlIiwiZXh0cmFPcHRpb25zIiwiZHVwbGljYXRlQmxvY2siLCJEdXBsaWNhdGUiLCJkZWxldGVJdGVtIiwiZGVsZXRlQmxvY2siLCJUcmFzaCIsImxpc3RlbiIsImxvZyIsIk1vdXNlb3ZlciIsImluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlIiwiRm9jdXNpbiIsImhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luIiwiRm9jdXNvdXQiLCJoYW5kbGVUYWJsZUJlaGF2aW9yRm9jdXNPdXQiLCJoYW5kbGVDbGlja0V2ZW50IiwidGFyZ2V0RWxlbWVudCIsInRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlciIsImZvcmNlSGlkZUVsZW1lbnQiLCJvcHRpb25zV3JhcHBlciIsImluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wiLCJpbmNsdWRlQWxpZ25Ub29sIiwiaW5jbHVkZUNvbG9yVG9vbCIsImluY2x1ZGVFeHRyYU9wdGlvbnMiLCJ0b29sYm94V3JhcHBlciIsImNyZWF0ZVRvb2xib3giLCJNb3VzZWVudGVyIiwicmVzZXRUb29sYm94IiwiYmxvY2tUb29sYmFySWQiLCJ0b29sYmFyIiwiaGlkZUJsb2NrVG9vbGJveCIsIk1vdXNlbGVhdmUiLCJpZnJhbWUiLCJjaGFuZ2VUb29sYmFyQ29sb3IiLCJjb2xvckludGVyYWN0aXZlQnV0dG9uIiwiYm9yZGVyQ29sb3IiLCJpc0FueURlcGVuZGVudEJveFZpc2libGUiLCJkZXBlbmRlbnRCb3hlcyIsImJveCIsImJsb2NrVG9vbGJhciIsIm1vcmUiLCJodG1sRWxlbWVudFdyYXBwZXIiLCJpbmNsdWRlQ2hldnJvbkljb24iLCJyb2xlIiwiY2hhbmdlVGl0bGUiLCJUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJmbG9hdGluZ0JhciIsInR1cm5JbnRvRHJvcGRvd24iLCJtb3JlT3B0aW9uc0Ryb3Bkb3duIiwidHVybkludG9CYXJMaXN0IiwidHVybkludG9CYXJCdXR0b24iLCJ0cmFuc2Zvcm1CbG9jayIsIlNWR0ljb25zIiwidG9kb19saXN0IiwiYl9saXN0Iiwibl9saXN0IiwicXVvdGUiLCJoZWFkMiIsImhlYWQzIiwiaGVhZDQiLCJsaW5rIiwiYm9sZCIsInRvZ2dsZUJvbGQiLCJpdGFsaWMiLCJ0b2dnbGVJdGFsaWMiLCJ1bmRlcmxpbmUiLCJ0b2dnbGVVbmRlcmxpbmUiLCJpbmxpbmVDb2RlIiwidG9nZ2xlSW5saW5lQ29kZSIsInN0cmlrZXRocm91Z2giLCJ0b2dnbGVTdHJpa2VUaHJvdWdoIiwiU3RyaWtlVGhyb3VnaCIsIkNvbG9yVGV4dE9wdGlvblNlbGVjdCIsIkNvbG9yVGV4dE9wdGlvbnNNZW51IiwiaGlsaXRlQ29sb3JSZWQiLCJ0b2dnbGVIaWxpdGVDb2xvciIsImhpbGl0ZUNvbG9yR3JlZW4iLCJoaWxpdGVDb2xvckJsdWUiLCJoaWxpdGVDb2xvclllbGxvdyIsImhpbGl0ZUNvbG9yR3JleSIsImhpbGl0ZUNvbG9yTm9uZSIsImZvcmVDb2xvclJlZCIsInRvZ2dsZUZvcmVDb2xvciIsImZvcmVDb2xvckdyZWVuIiwiZm9yZUNvbG9yQmx1ZSIsImZvcmVDb2xvclllbGxvdyIsImZvcmVDb2xvckdyZXkiLCJmb3JlQ29sb3JOb25lIiwibW9yZU9wdGlvbnNMaXN0IiwibW9yZU9wdGlvbnNCdXR0b24iLCJjb3B5U2VsZWN0ZWQiLCJjb3B5IiwiY3V0U2VsZWN0ZWQiLCJjdXQiLCJwYXN0IiwicGFzdGUiLCJkdXBsaWNhdGUiLCJyZW1vdmVGb3JtYXQiLCJlcmFzZXIiLCJkZWxldGUiLCJoZWFkMSIsImhlYWQ1IiwiaGVhZDYiLCJRdWlja01lbnVFbXB0eSIsImh0bWxFbXB0eUluZGljYXRvciIsInBhZGRpbmciLCJRdWlja01lbnUiLCJtZW51U2VjdGlvbnMiLCJxdWlja01lbnVFbXB0eSIsImZpbHRlcklucHV0IiwiZm9jdXNTdGFjayIsImJsb2NrT3B0aW9ucyIsIm1lbnVJdGVtIiwicGVlayIsImZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtIiwiZmlyc3RTZWN0aW9uTm9kZSIsImN1cnJlbnRTZWN0aW9uTm9kZSIsIml0ZW1Ob2RlIiwibWVudUl0ZW1zIiwicHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUiLCJpbW1lZGlhdGVQYXJlbnQiLCJzZWN0aW9uIiwibGFzdFZpc2libGVTZWN0aW9uTm9kZSIsIm5leHRWaXNpYmxlU2VjdGlvbk5vZGUiLCJmaXJzdFZpc2libGVTZWN0aW9uTm9kZSIsImZpbHRlckl0ZW1zIiwiZmlsdGVyU2VjdGlvbiIsInJlc3RvcmUiLCJyZW1vdmVMYXN0RmlsdGVySW5wdXRDaGFyYWN0ZXIiLCJjb25jYXRGaWx0ZXJJbnB1dCIsInN0b3BQcm9wYWdhdGlvbiIsImJsb2NrVHlwZSIsInRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUiLCJzdGciLCJEb3VibHlMaW5rZWRMaXN0IiwiUXVpY2tNZW51U2VjdGlvbiIsInF1aWNrTWVudUluc3RhbmNlIiwiYXBwZW5kUXVpY2tNZW51SXRlbXMiLCJhcHBlbmRRdWlja01lbnVJdGVtIiwiZmlsdGVyVmFsdWUiLCJRdWlja01lbnVJdGVtIiwiX2Jsb2NrVHlwZSIsIl9maWx0ZXJWYWx1ZSIsIl9pbW1lZGlhdGVQYXJlbnQiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbkltYWdlIiwic3ZnIiwib3B0aW9uVGV4dCIsImJsb2NrVGl0bGUiLCJibG9ja0Rlc2NyaXB0aW9uIiwiUXVpY2tNZW51QnVpbGRlciIsImJhc2ljQmxvY2tzU2VjdGlvbiIsIkNhbGxvdXQiLCJtZWRpYUJsb2Nrc1NlY3Rpb24iLCJoZWFkaW5nQmxvY2tzU2VjdGlvbiIsImxpc3RCbG9ja3NTZWN0aW9uIiwiZW1iZWRTZWN0aW9uIiwiVGl0bGUiLCJoMSIsIlRpdGxlQnVpbGRlciIsIkRpcmVjdGlvbnMiLCJUYWJsZVNjb3BlcyIsIlNlbGVjdGlvbk1vZGVzIiwiRW1iZWRUeXBlcyIsIlRvb2xiYXJJRHMiLCJCb3VuZGFyaWVzIiwiVGFibGVVdGlscyIsImluc2VydFBvc2l0aW9uIiwicm93cyIsIm5ld1JvdyIsImluc2VydFJvdyIsIm51bUNvbHVtbnMiLCJyZWR1Y2UiLCJtYXgiLCJjZWxscyIsImFmZmVjdGVkQ2VsbHMiLCJpbnNlcnRDZWxsIiwiaXNMYXN0Q29sdW1uIiwiY2VsbFJvdyIsImlzTGFzdFJvdyIsInJlbW92ZUNvbHVtbkJ5Q2VsbCIsImNvbHVtbkluZGV4IiwiY2VsbEluZGV4IiwiZGVsZXRlQ2VsbCIsInJlbW92ZVJvd0J5Q2VsbCIsImRlbGV0ZVJvdyIsInJvd0luZGV4IiwiZ2V0QWN0aXZlVGFibGVDZWxsIiwiZ2V0TGFzdFRhYmxlQ2VsbCIsImoiLCJnZXRGaXJzdFRhYmxlQ2VsbCIsImdldE5laWdoYm9yQ2VsbCIsImRpcmVjdGlvbiIsIkFycm93UmlnaHQiLCJBcnJvd0xlZnQiLCJBcnJvd1VwIiwiQXJyb3dEb3duIiwiY2hhbmdlQ2VsbEJvcmRlckNvbG9yIiwiY2VsbHNUb0NoYW5nZSIsIkNvbHVtbiIsIlJvdyIsInNlbGVjdGVkQ2VsbCIsIkNlbGwiLCJTZWxlY3RlZENlbGxzIiwibW92ZUZvY3VzVG9CZWxvd0NlbGwiLCJuZXh0Um93IiwiYmVsb3dDZWxsIiwiQ29udGVudCIsIm1hcmdpblRvcCIsImNsZWFyU2VsZWN0aW9uT25EcmFnIiwicmVSZW5kZXJQbGFjZWhvbGRlciIsInNlbGVjdGVkIiwicGFyZW50QmxvY2siLCJCbHVyIiwiY29weUVsZW1lbnRJdGVtIiwiZWRpdG9yIiwiYmxvY2tzIiwicHJlc3NlZEVudGVyT25UaXRsZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzIiwic2VsZWN0ZWRDb250ZW50IiwibWVyZ2VXaXRoUHJldmlvdXNCbG9jayIsIkRlbGV0ZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQiLCJtZXJnZVdpdGhOZXh0QmxvY2siLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsInRhYkNoYXJhY3RlciIsImFjdGl2ZUNlbGwiLCJmb2N1c09uTmV4dEJsb2NrIiwiaW5zZXJ0TmV3Iiwic2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyIiwiSW5wdXQiLCJoYXNBdHRyaWJ1dGUiLCJjdXN0b21QbGFjZWhvbGRlciIsImZvY3VzYWJsZVBhcmVudCIsImVuZE5vZGUiLCJjb2xsYXBzZWQiLCJpc0F0Rmlyc3RWaXNpYmxlTGluZSIsImNsb25lUmFuZ2UiLCJpc0F0TGFzdFZpc2libGVMaW5lIiwiZGlkQ3Vyc29yTW92ZSIsIlByb21pc2UiLCJvcmlnaW5hbFJlY3QiLCJuZXdSZWN0IiwiZGlkTW92ZSIsIkNvbnRlbnRCdWlsZGVyIiwiVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwic2VsZWN0ZWRDZWxscyIsImFjdHVhbEZvY3VzZWRDZWxsIiwidGFibGVPcGVyYXRpb25zU2VydmljZSIsImNvbnRyb2xsZXIiLCJzZWxlY3Rpb25Nb2RlIiwic2VsZWN0aW9uRmxhZyIsInNlbGVjdGVkVGV4dCIsImNsZWFyQW5kSGlkZSIsIk1vZGVyYXRlbHlJbXBvcnRhbnQiLCJBYm9ydENvbnRyb2xsZXIiLCJoYW5kbGVNb3VzZURvd24iLCJoYW5kbGVNb3VzZU1vdmUiLCJoYW5kbGVNb3VzZVVwIiwiaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duIiwiaGFuZGxlQ2VsbFNlbGVjdGlvbkNvbnRpbnVhdGlvbk9uS2V5RG93biIsImhhbmRsZUtleURvd24iLCJoYW5kbGVLZXlVcCIsIlREIiwiYWJvcnQiLCJjbGVhckFsbCIsImFkZFNlbGVjdGVkQ2VsbCIsInVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQiLCJyZXNldFNlbGVjdGlvblN0YXRlIiwiY3VycmVudENlbGwiLCJyZXBlYXQiLCJuZXh0Q2VsbCIsIm5vcm1hbGl6ZVRleHQiLCJyZXBsYWNlIiwidXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlIiwiYWN0dWFsU2VsZWN0aW9uIiwiY3VycmVudENlbGxUZXh0IiwiY2VsbFJlY3QiLCJtb3VzZVgiLCJjbGllbnRYIiwibW91c2VZIiwicmVzZXRBYm9ydENvbnRyb2xsZXIiLCJjaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8iLCJzaWduYWwiLCJiYWNrZ3JvdW5kQ29sb3JzIiwiQmFja2dyb3VuZENvbG9yUmVkIiwicXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJCYWNrZ3JvdW5kQ29sb3JHcmVlbiIsIkJhY2tncm91bmRDb2xvckJsdWUiLCJCYWNrZ3JvdW5kQ29sb3JZZWxsb3ciLCJCYWNrZ3JvdW5kQ29sb3JHcmV5IiwiVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciIsInRhYmxlT3BlcmF0aW9uU2VydmljZSIsInRhYmxlT3B0aW9ucyIsInRhYmxlQ29sb3JEcm9wZG93biIsImluc2VydFRhYmxlQ29sdW1uTGVmdCIsIkNvbHVtbkxlZnQiLCJpbnNlcnRUYWJsZUNvbHVtblJpZ2h0IiwiQ29sdW1uUmlnaHQiLCJpbnNlcnRUYWJsZVJvd0Fib3ZlIiwiUm93QWJvdmUiLCJpbnNlcnRUYWJsZVJvd0JlbG93IiwiUm93QmVsb3ciLCJkZWxldGVDb2x1bW5JdGVtIiwicmVtb3ZlQ29sdW1uIiwiZGVsZXRlU3dlZXAiLCJkZWxldGVSb3dJdGVtIiwicmVtb3ZlUm93IiwiY2VsbEJhY2tncm91bmRDb2xvclJlZCIsInRvZ2dsZUNlbGxIaWxpdGVDb2xvciIsIkJhY2tncm91bmRDb2xvckNlbGxSZWQiLCJjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4iLCJCYWNrZ3JvdW5kQ29sb3JDZWxsR3JlZW4iLCJjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSIsIkJhY2tncm91bmRDb2xvckNlbGxCbHVlIiwiY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyIsIkJhY2tncm91bmRDb2xvckNlbGxZZWxsb3ciLCJjZWxsQmFja2dyb3VuZENvbG9yR3JleSIsIkJhY2tncm91bmRDb2xvckNlbGxHcmV5IiwiY2VsbEJhY2tncm91bmRDb2xvck5vbmUiLCJFbWJlZFRvb2wiLCJlbWJlZEltYWdlIiwidXJsT2JqIiwibGFzdEZvY3VzZWRFbGVtZW50IiwiVVJMIiwidmFsaWRhdGVJbWFnZSIsImNyZWF0ZUVtYmVkQ29udGFpbmVyIiwiaW1hZ2UiLCJzcmMiLCJhbHQiLCJtYXhXaWR0aCIsImZpbmFsaXplRW1iZWQiLCJ1cmxUb0NoZWNrIiwicmVqZWN0Iiwib25sb2FkIiwib25lcnJvciIsImVtYmVkR29vZ2xlU2hlZXQiLCJzaGVldElkIiwicGF0aG5hbWUiLCJzYWZlU2hlZXRJZCIsImZyYW1lQm9yZGVyIiwiYWxsb3dGdWxsc2NyZWVuIiwiZW1iZWRZb3VUdWJlVmlkZW9Bc0lmcmFtZSIsInZpZGVvSWQiLCJzZWFyY2hQYXJhbXMiLCJzYWZlVmlkZW9JZCIsImFsbG93IiwiZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSIsInBhdGhTZWdtZW50cyIsInNob3J0SWQiLCJzYWZlU2hvcnRJZElkIiwiZW1iZWRZb3VUdWJlUGxheWxpc3RBc0lmcmFtZSIsImxpc3RJZCIsInNhZmVMaXN0SWQiLCJlbWJlZFNwb3RpZnlDb250ZW50IiwiY29udGVudElkIiwicG9wIiwic2FmZUNvbnRlbnRJZCIsIlNwb3RpZnlUcmFjayIsIlNwb3RpZnlQbGF5bGlzdCIsIlNwb3RpZnlTaG93IiwiU3BvdGlmeUVwaXNvZGUiLCJTcG90aWZ5QXJ0aXN0IiwiZW1iZWRHaXN0QXNTY3JpcHQiLCJnaXN0SWQiLCJzaGFkb3dFbGVtZW50IiwibWluSGVpZ2h0Iiwic2hhZG93Um9vdCIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJzY3JpcHRTcmMiLCJzY3JpcHQiLCJvcmlnaW5hbFdyaXRlIiwid3JpdGUiLCJzY3JpcHRPdXRwdXQiLCJ0ZW1wRGl2IiwiZW1iZWRDb2RlcGVuQXNJZnJhbWUiLCJwYXJ0cyIsInVzZXIiLCJwZW4iLCJzYWZlVXNlciIsInNhZmVQZW4iLCJvdmVyZmxvdyIsInJlc2l6ZU9ic2VydmVyIiwiUmVzaXplT2JzZXJ2ZXIiLCJlbnRyeSIsImNvbnRlbnRSZWN0Iiwib2JzZXJ2ZSIsImZpZ3VyZSIsImNvbnRlbnRFbGVtZW50Q2xhc3NlcyIsInRvb2xiYXJXcmFwcGVyIiwiZGV0ZXJtaW5lRW1iZWRUeXBlIiwiZG9tYWluIiwiaG9zdG5hbWUiLCJwYXRoIiwiaGFzIiwiWW91VHViZVBsYXlsaXN0IiwiWW91VHViZVZpZGVvIiwiWW91VHViZVNob3J0IiwiVmltZW9WaWRlbyIsIkdvb2dsZVNoZWV0IiwiVHdlZXQiLCJHb29nbGVNYXAiLCJHaXRIdWJHaXN0IiwiR2l0TGFiU25pcHBldCIsIk1lZGlhSW5wdXR0ZXIiLCJ1cGxvYWRUYWIiLCJjcmVhdGVOYXZJdGVtIiwiZW1iZWRUYWIiLCJ1cGxvYWRDb250ZW50IiwiY3JlYXRlVXBsb2FkQ29udGVudCIsImVtYmVkQ29udGVudCIsImNyZWF0ZUVtYmVkQ29udGVudCIsImxpIiwibGFiZWwiLCJ0ZXh0SW5mbyIsImVtYmVkR2VuZXJpYyIsInJlc2V0SW5wdXRCZ0NvbG9yIiwic3RyaW5nVVJMIiwiZm9jdXNlZEVsZW1lbnQiLCJlbWJlZFR5cGUiLCJpbnB1dFZhbHVlIiwiaW5wdXRUZXh0Iiwic2V0QWN0aXZlVGFiIiwiaGFuZGxlcktleWRvd25FdmVudHMiLCJoYW5kbGVyQ2xpY2tFdmVudHMiLCJoaWRlTWVkaWFJbnB1dHRlck9uRXh0ZXJuYWxDbGljayIsInNob3dNZWRpYUlucHV0dGVyT25NZWRpYUlucHV0dGVyRWxlbWVudENsaWNrIiwiY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzIiwiZmluZENsYXNzV2l0aFN1ZmZpeCIsInN1ZmZpeCIsInJlZ2V4IiwiZ2V0VGFiIiwidGFiSWQiLCJnZXRDb250ZW50IiwibGFzdEZvY3VzZWQiLCJzaG93SW5wdXRNZWRpYSIsInRleHRQbGFjZWhvbGRlciIsInNldElucHV0UGxhY2Vob2xkZXIiLCJhY3RpdmF0ZU1lZGlhVXBsb2FkIiwiaXNFbGVtZW50VmlzaWJsZSIsImVtYmVkIiwib2Zmc2V0UGFyZW50IiwiTWVkaWFJbnB1dHRlckJ1aWxkZXIiLCJFZGl0b3JCdWlsZGVyIiwiVUlCdWlsZGVyIiwic3RhcnQiLCJpbnNlcnRJY29ucyIsInN2Z0NvbnRhaW5lciIsIkNvbW1hbmREaXNwYXRjaGVyIiwidGV4dE9wZXJhdGlvblNlcnZpY2UiLCJoYW5kbGVDb21tYW5kRXZlbnQiLCJjcmVhdGVBTmV3UGFyYWdyYXBoRnJvbVRpdGxlIiwidGFyZ2V0QmxvY2tUeXBlIiwiZXhlY0luc2VydExpbmsiLCJleGVjVG9nZ2xlTGluayIsImV4ZWNCb2xkIiwiZXhlY0lubGluZUNvZGUiLCJleGVjSXRhbGljIiwiZXhlY1VuZGVybGluZSIsImV4ZWNTdHJpa2VUaHJvdWdoIiwiZXhlY0hpbGl0ZUNvbG9yIiwiZXhlY0ZvcmVDb2xvciIsImV4ZWNEdXBsaWNhdGVCbG9jayIsImV4ZWNEZWxldGVCbG9jayIsImV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMiLCJleGVjRGVsZXRlQW5kRm9jdXNPbk5leHQiLCJleGVjRm9jdXNPbk5leHQiLCJleGVjUmVtb3ZlRm9ybWF0IiwianVzdGlmeUxlZnQiLCJqdXN0aWZ5Q2VudGVyIiwianVzdGlmeVJpZ2h0IiwiZXhlY0NyZWF0ZURlZmF1bHRCbG9jayIsImV4ZWNJbnNlcnROZXciLCJmb2N1c09uUHJldmlvdXNCbG9jayIsImV4ZWNGb2N1c09uUHJldmlvdXNCbG9jayIsImV4ZWNNZXJnZVdpdGhOZXh0QmxvY2siLCJleGVjTWVyZ2VXaXRoUHJldmlvdXNCbG9jayIsImluc2VydENvbHVtbkxlZnQiLCJpbnNlcnRDb2x1bW5SaWdodCIsImluc2VydFJvd0Fib3ZlIiwiaW5zZXJ0Um93QmVsb3ciLCJleGVjQ2VsbEJhY2tncm91bmRDb2xvciIsImV4ZWNDaGFuZ2VDYWxsb3V0QmFja2dyb3VuZCIsImZvcm1hdCIsImNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQiLCJTaG9ydGN1dExpc3RlbmVycyIsInN0YXJ0TGlzdGVuIiwiaXNOdW1QYWQiLCJudW1Mb2NrT24iLCJnZXRNb2RpZmllclN0YXRlIiwiVGFibGVMaXN0ZW5lcnMiLCJzaG93bkVsZW1lbnRzIiwiTWFwIiwiRm9jdXNTdGFjayIsInN0YWNrIiwiY2FwYWNpdHkiLCJzaGlmdCIsImNsZWFyIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInRoZW4iLCJjb3BpZWRFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY2F0Y2giLCJlcnIiLCJyZWFkVGV4dCIsInBhc3RlZFRleHQiLCJzZWxlY3Rpb25FdmVudCIsImdldEN1cnJlbnRTZWxlY3RlZEJsb2NrIiwiZm9jdXNPbkZpcnN0QmxvY2siLCJnZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbiIsImN1cnJlbnRDb250ZW50RWRpdGFibGUiLCJwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSIsImNhcmV0UG9zaXRpb24iLCJsaXN0SXRlbSIsImFkanVzdGVkQ2FyZXRQb3NpdGlvbiIsIm5leHRDb250ZW50RWRpdGFibGUiLCJuZXh0RWxlbWVudCIsImhpZGVFdmVudCIsImZvY3VzT25OZXh0IiwiZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkiLCJuZXdDb250ZW50QmxvY2siLCJmb2N1c1N0YWNrVG9BZGQiLCJlZGl0YWJsZUNvbnRlbnQiLCJjYWxsb3V0IiwicmVwbGFjZUNoaWxkIiwiZm9jdXNhYmxlIiwiY3JlYXRlTmV3RWxlbWVudCIsImNyZWF0ZUxpc3RJdGVtIiwibmV3Q29udGVudEVsZW1lbnQiLCJjdXJyZW50SXRlbSIsImNvbnRlbnRDdXJyZW50IiwiY29udGVudENsb25lIiwiY291bnRlciIsIm5ld1BhcmFncmFwaCIsImN1cnJlbnRCbG9jayIsImNsb25lZEJsb2NrIiwiY2xvbmVkVGl0bGUiLCJuZXdCbG9jayIsImV2ZW50UGFyYWdyYXBoIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJmb2N1c09uUHJldmlvdXMiLCJhY3R1YWxFbGVtZW50IiwidG9VcHBlckNhc2UiLCJwcmV2aW91c0VsZW1lbnQiLCJhcHBseUN1cnNvclhFbmRQb3NpdGlvbiIsInNpYmxpbmciLCJmb2N1c2FibGVDYW5kaWRhdGVzIiwiZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50IiwiYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbiIsImdldE5leHRGb2N1c2FibGVFbGVtZW50IiwiYWN0dWFsIiwieFBvc2l0aW9uIiwiYWRqdXN0Q3Vyc29yT2Zmc2V0IiwicHJldmlvdXNTaWJsaW5nIiwiY2xvc2VzdE5vZGUiLCJjbG9zZXN0T2Zmc2V0IiwiY2xvc2VzdERpZmYiLCJsZWZ0RGlmZiIsInJpZ2h0RGlmZiIsIm1pbiIsImdldEN1cnJlbnRTZWxlY3RlZEZvY3VzYWJsZSIsInJlbW92ZUp1c3RpZnkiLCJjYWxsb3V0RGl2IiwiVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwibm9ybWFsaXplQW5jaG9ycyIsImFuY2hvciIsInF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlIiwicXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlIiwiZXh0cmFjdENvbnRlbnRzIiwiaXNDb2RlIiwiY29udGFpbnNDb2RlIiwicGFyZW50Q29kZSIsImNvZGVFbGVtZW50IiwicXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUiLCJpc05vZGVJbnNpZGVBbmNob3IiLCJjbG9uZUNvbnRlbnRzIiwiZXhwZWN0ZWRDb2xvciIsImZvbnRDb2xvciIsInJnYkNvbG9yIiwic3BhbldpdGhCYWNrZ3JvdW5kIiwiZ2V0VGFyZ2V0RWxlbWVudE1hcCIsImdldFNlbGVjdGVkSFRNTEVsZW1lbnQiLCJnZXRTZWxlY3RlZFRleHROb2RlcyIsIm5vZGVJdGVyYXRvciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJFTkRfVE9fU1RBUlQiLCJTVEFSVF9UT19FTkQiLCJmaW5kQ2xvc2VzdE1hdGNoaW5nUGFyZW50IiwiZWxlbSIsImV2ZXJ5IiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsImVuZCIsIlRhYmxlT3BlcmF0aW9uc1NlcnZpY2UiLCJpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJUYWJsZVRvb2xiYXIiLCJpc0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJ0YXJnZXRIZXhDb2xvciIsImN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJlbGVtZW50cyIsImlzIiwic2hvd0luc2VydExpbmVFbGVtZW50Iiwic2hvd0luc2VydENvbHVtbkVsZW1lbnQiLCJoaWRlSW5zZXJ0Um93RWxlbWVudCIsImhpZGVJbnNlcnRDb2x1bW5FbGVtZW50IiwiTWVtZW50byIsInVuZG9TdGFjayIsInJlZG9TdGFjayIsInF1ZXJ5IiwiaHRtbCIsInVuZG8iLCJzdGF0ZVRvUmVzdG9yZSIsInJlZG8iLCJzdGF0ZVRvQXBwbHkiLCJTcGFjZSIsIkVkaXRhYmxlTmF2aWdhdGlvbiIsImhhbmRsZUFycm93S2V5cyIsImN1cnJlbnRFZGl0YWJsZSIsInNob3VsZFN3aXRjaEVkaXRhYmxlIiwibmV4dEVkaXRhYmxlIiwiZmluZE5leHRFZGl0YWJsZSIsInBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbiIsImlzQXRGaXJzdExpbmUiLCJpc0F0TGluZUJvdW5kYXJ5IiwiRmlyc3QiLCJpc0F0TGFzdExpbmUiLCJMYXN0IiwiYm91bmRhcnkiLCJhbGxFZGl0YWJsZXMiLCJjdXJyZW50SW5kZXgiLCJuZWlnaGJvckNlbGwiLCJuZXh0SW5kZXgiLCJmaW5kVmVydGljYWxFZGl0YWJsZUluZGV4IiwibmV4dCIsIkV2ZW50Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/demo/assets/bundle.js b/demo/assets/bundle.js index a6dab1f..7afb276 100644 --- a/demo/assets/bundle.js +++ b/demo/assets/bundle.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e={282:(e,t,n)=>{n.d(t,{A:()=>s});var o=n(354),i=n.n(o),r=n(314),l=n.n(r)()(i());l.push([e.id,'/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n}\n\n.list-item-checkable input {\n /* width: 18px; */\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n/* .block:hover .block-toolbar {\n visibility: visible;\n} */\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n/* pre {\n width: 100%;\n} */\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n /* min-height: 2000px; */\n background-color: white;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n /* background-color: white; */\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n ;\n padding: 10px 20px;\n /* font-size: 0.75rem; */\n /* color: rgba(55, 53, 47, 0.6); */\n font-size: 0.86rem;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n\n\n/* #linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n\n border: 1px solid #949494;\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n} */\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n/* code:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n} */\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n/* #deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n} */\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #FDDEDE;\n border-color: #e4c8c8;\n}\n\n.callout-background-green {\n background-color: #D7F7DC;\n border-color: #c2dec6;\n}\n\n.callout-background-blue {\n background-color: #D9EDF6;\n border-color: #c3d5dd;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #fbf5d6;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #e7e6e6;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n\n\n\n\n\n\n\n\n\n/* .embed-container {\n position: relative;\n}\n\n.more-options-button {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 999999;\n background-color: red;\n\n}\n\n.context-menu {\n position: absolute;\n top: 20px;\n right: 0;\n background-color: #fff;\n border: 1px solid #ccc;\n padding: 5px;\n z-index: 10;\n display: none;\n}\n\n.more-options-button:active + .context-menu,\n.more-options-button:focus + .context-menu {\n display: block;\n}\n\n\n.bbbuton{\n background-color: red;\n top: 0;\n left: 0;\n} */\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n \n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n color: inherit;\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: "#2383e2";\n color: "white";\n border: "none";\n padding: "3px";\n border-radius: "5px";\n font-weight: "500";\n}\n\n\n.block-selected {\n /* border: 2px dashed red; */\n}\n\n.separator {\n /* padding: 10px 0; */\n}\n\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n /* height: 50px; */\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n/* .separator::before,\n.separator::after {\n content: "";\n flex-grow: 1;\n} */\n\n\n\n.separator-wrapper hr {\n /* Outros estilos */\n outline: none !important;\n /* Remova esta linha se estiver presente */\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n /* outline: 2px solid blue; */\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n\n.separator-selected hr {\n /* outline: 2px solid blue; */\n /* border: 1px solid white !important; */\n\n /* background-color: hsl(210 75% 50% / 1); */\n color: white !important;\n border-color: white !important;\n\n\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n}\n\n.list-item-checkable input {\n /* width: 18px; */\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n/* .block:hover .block-toolbar {\n visibility: visible;\n} */\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n/* pre {\n width: 100%;\n} */\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n /* min-height: 2000px; */\n background-color: white;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n /* background-color: white; */\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n ;\n padding: 10px 20px;\n /* font-size: 0.75rem; */\n /* color: rgba(55, 53, 47, 0.6); */\n font-size: 0.86rem;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n\n\n/* #linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n\n border: 1px solid #949494;\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n} */\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n/* code:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n} */\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n/* #deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n} */\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #FDDEDE;\n border-color: #e4c8c8;\n}\n\n.callout-background-green {\n background-color: #D7F7DC;\n border-color: #c2dec6;\n}\n\n.callout-background-blue {\n background-color: #D9EDF6;\n border-color: #c3d5dd;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #fbf5d6;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #e7e6e6;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n\n\n\n\n\n\n\n\n\n/* .embed-container {\n position: relative;\n}\n\n.more-options-button {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 999999;\n background-color: red;\n\n}\n\n.context-menu {\n position: absolute;\n top: 20px;\n right: 0;\n background-color: #fff;\n border: 1px solid #ccc;\n padding: 5px;\n z-index: 10;\n display: none;\n}\n\n.more-options-button:active + .context-menu,\n.more-options-button:focus + .context-menu {\n display: block;\n}\n\n\n.bbbuton{\n background-color: red;\n top: 0;\n left: 0;\n} */\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n \n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n color: inherit;\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: "#2383e2";\n color: "white";\n border: "none";\n padding: "3px";\n border-radius: "5px";\n font-weight: "500";\n}\n\n\n.block-selected {\n /* border: 2px dashed red; */\n}\n\n.separator {\n /* padding: 10px 0; */\n}\n\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n /* height: 50px; */\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n/* .separator::before,\n.separator::after {\n content: "";\n flex-grow: 1;\n} */\n\n\n\n.separator-wrapper hr {\n /* Outros estilos */\n outline: none !important;\n /* Remova esta linha se estiver presente */\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n /* outline: 2px solid blue; */\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n\n.separator-selected hr {\n /* outline: 2px solid blue; */\n /* border: 1px solid white !important; */\n\n /* background-color: hsl(210 75% 50% / 1); */\n color: white !important;\n border-color: white !important;\n\n\n}'],sourceRoot:""}]);const s=l},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var l={};if(o)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[t].concat([r]).join("\n")}return[t].join("\n")}},72:e=>{var t=[];function n(e){for(var n=-1,o=0;o{var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var o,i,r,l,s,a,c,d,u,m,h,p,A,C,g,b,E,f=n(72),B=n.n(f),v=n(825),w=n.n(v),k=n(659),I=n.n(k),y=n(56),x=n.n(y),T=n(540),S=n.n(T),L=n(113),M=n.n(L),N=n(282),q={};q.styleTagTransform=M(),q.setAttributes=x(),q.insert=I().bind(null,"head"),q.domAPI=w(),q.insertStyleElement=S(),B()(N.A,q),N.A&&N.A.locals&&N.A.locals,function(e){e.Paragraph="p",e.Heading_1="h1",e.Heading_2="h2",e.Heading_3="h3",e.Heading_4="h4",e.Heading_5="h5",e.Heading_6="h6",e.CheckList="checkList",e.BulletedList="bulletedList",e.NumberedList="numberedList",e.List="list",e.Table="table",e.Image="image",e.Script="script",e.Iframe="iframe"}(o||(o={}));class H{static generateUniqueId(){const e=Date.now().toString(36),t=new Uint32Array(1);return window.crypto.getRandomValues(t),e+t[0].toString(36)}static rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join("")}static isValidUrl(e){const t=new RegExp("^(https?:\\/\\/)(?!-)[a-zA-Z\\d-]{1,63}(?O.blockParagraph(e)}static paragraphCreator(){return e=>O.paragraph(e)}static headingCreator(e){return t=>O.heading(e,t)}static checkboxItemCreator(){return e=>O.checkboxItem(e||"")}static listItemCreator(){return e=>O.listItem_2(e)}static dragHandleButtonCreator(){return()=>O.dragHandleButton()}static codeCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","ignore-events");const n=document.createElement("div");n.classList.add("code-block","ignore-quick-menu","ignore-text-floating-toolbar");const o=document.createElement("pre");o.classList.add(r.IncludeBlockToolbarClass,r.LanguageSelectionToolClass,r.ExtraOptionsClass);const i=document.createElement("code");return i.contentEditable="true",i.setAttribute("data-placeholder","/* Code snippet */"),i.textContent=e||"",i.classList.add("johannes-code","focusable","hljs","language-plaintext"),i.setAttribute("spellCheck","false"),o.appendChild(i),i.addEventListener("blur",(()=>{i.removeAttribute("data-highlighted"),hljs.highlightElement(i)})),n.appendChild(o),t.appendChild(n),hljs.highlightElement(i),t}}static quoteCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","swittable");const n=document.createElement("blockquote");return n.classList.add("focusable"),n.textContent=e||"",n.contentEditable="true",n.setAttribute("data-placeholder",O.getRandomQuote()),t.appendChild(n),t}}static getRandomQuote(){const e=["Talk is cheap. Show me the code. - Linus Torvalds","Premature optimization is the root of all evil. - Donald Knuth","The most dangerous phrase in the language is, 'We've always done it this way.' - Grace Hopper","Simplicity is prerequisite for reliability. - Edsger W. Dijkstra","Any fool can write code that a computer can understand. Good programmers write code that humans can understand. - Martin Fowler","First, solve the problem. Then, write the code. - John Johnson","In programming, the hard part isn't solving problems, but deciding what problems to solve. - Paul Graham","Code is like humor. When you have to explain it, it's bad. - Cory House","Make it work, make it right, make it fast. - Kent Beck","Before software can be reusable it first has to be usable. - Ralph Johnson"];return e[Math.floor(Math.random()*e.length)]}static checkListCreator(){return e=>{const t=document.createElement("ul");t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list"),t.classList.add("checkbox-list"),t.setAttribute("data-content-type",o.CheckList);const n=O.checkboxItem(e||"");return t.appendChild(n),t}}static bulletedListCreator(){return e=>{const t=document.createElement("ul");t.setAttribute("data-content-type",o.BulletedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=O.listItem_2(e||"");return t.appendChild(n),t}}static numberedListCreator(){return e=>{const t=document.createElement("ol");t.setAttribute("data-content-type",o.NumberedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=O.listItem_2(e||"");return t.appendChild(n),t}}static tableCreator(){return e=>{const t=document.createElement("div");t.classList.add("table-shell","ignore-quick-menu");const n=document.createElement("div");n.classList.add("table-controller");const i=document.createElement("div");i.classList.add("table-wrapper");const l=document.createElement("table");l.classList.add("johannes-content-element","swittable","table",r.IncludeBlockToolbarClass,r.AlignToolClass,r.ExtraOptionsClass),l.setAttribute("data-content-type",o.Table),t.appendChild(n),n.appendChild(i),i.appendChild(l);const s=document.createElement("tbody");l.appendChild(s);const a=e?e.split(","):[],c=document.createElement("tr");a.forEach((e=>{const t=document.createElement("td");t.classList.add("focusable"),t.setAttribute("data-placeholder","cell"),t.textContent=e,t.contentEditable="true",c.appendChild(t)})),s.appendChild(c);const d=document.createElement("div");d.classList.add("add-table-row"),d.innerHTML='';const u=document.createElement("div");return u.classList.add("add-table-column"),u.innerHTML='',n.appendChild(d),n.appendChild(u),t}}static placeholderCreator(e,t,n,o=[]){return i=>{const s=document.createElement("div");s.classList.add(l.ContentElement,"swittable","no-selection",r.IncludeBlockToolbarClass,r.ExtraOptionsClass),s.setAttribute("data-content-type",e);const a=document.createElement("div");a.classList.add("content-placeholder",l.ShowMediaInputOnClick,...o);const c=this.createIcon(t),d=document.createElement("span");return d.classList.add("no-selection"),d.innerText=n,s.appendChild(a),a.appendChild(c),a.appendChild(d),s}}static calloutCreator(){return e=>{const t=document.createElement("div");t.classList.add("ignore-quick-menu","callout","johannes-content-element","swittable",r.IncludeBlockToolbarClass,r.ColorToolClass,r.ExtraOptionsClass);const n=document.createElement("div");n.classList.add("callout-background-grey","callout-wrapper");const o=document.createElement("p");return o.setAttribute("data-placeholder","Type something..."),o.contentEditable="true",o.classList.add("callout-text","editable","focusable"),n.appendChild(o),t.appendChild(n),t}}static separatorCreator(){return()=>{const e=document.createElement("div");e.classList.add("johannes-content-element");const t=document.createElement("div");t.classList.add("separator-wrapper");const n=document.createElement("hr");return n.classList.add("separator"),t.appendChild(n),e.appendChild(t),e}}static paragraph(e=null){const t=document.createElement("p");return t.innerText=e||"",t.contentEditable="true",t.setAttribute("data-content-type",o.Paragraph),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.classList.add("key-trigger"),t.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),t}static heading(e,t=null){const n=document.createElement(`h${e}`);return n.innerText=t||"",n.contentEditable="true",n.setAttribute("data-content-type",`h${e}`),n.classList.add("johannes-content-element"),n.classList.add("swittable"),n.classList.add("focusable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.setAttribute("data-placeholder",`Heading ${e}`),n}static checkboxItem(e){const t=H.generateUniqueId();let n=document.createElement("li");n.classList.add("deletable","no-list-style","list-item","list-item-checkable");let o=document.createElement("input");o.id=t,o.setAttribute("type","checkbox");let i=document.createElement("div");return i.textContent=e,i.setAttribute("data-placeholder","To-do"),i.contentEditable="true",i.setAttribute("for",t),i.setAttribute("contentEditable","true"),i.classList.add("focusable"),i.classList.add("editable"),i.classList.add("focus"),n.appendChild(o),n.appendChild(i),n}static listItem_2(e=null){let t=document.createElement("li");t.classList.add("deletable"),t.classList.add("list-item");const n=document.createElement("div");return n.classList.add("focusable"),n.classList.add("editable"),n.classList.add("focus"),n.contentEditable="true",n.classList.add("key-trigger"),n.setAttribute("data-placeholder","Item"),t.appendChild(n),n.innerText=e||"",t}static blockParagraph(e=null){let t=document.createElement("div");t.id=`b-${H.generateUniqueId()}`;let n=O.paragraph(e);return t.appendChild(n),t.classList.add("block"),t.classList.add("deletable"),t}static dragHandleButton(){const e=document.createElement("div");e.classList.add("drag-handler-wrapper",l.EditorOnly);let t=document.createElement("button");return t.innerHTML='',t.classList.add(l.EditorOnly,"drag-handler","button-reset"),t.draggable=!0,e.appendChild(t),e}static createIcon(e){let t=document.createElement("div");return t.classList.add("icon-wrapper"),t.innerHTML=``,t}}!function(e){e.ColorChangeRequest="ColorChangeRequest",e.ShowHideActiveButton="ShowHideActiveButton",e.ResetActiveButtons="ResetActiveButtons",e.CloseElement="HideComponent",e.ShowElement="ShowElement",e.ChangeBlockToolbarLanguage="ChangeBlockToolbarLanguage"}(s||(s={}));class R{id;_canHide;classList=[];props;htmlElement;parent;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}setId(e){this.id=e,this.htmlElement.id=e}addCssClass(...e){this.classList.push(...e),this.htmlElement.classList.add(...e)}appendTo(e){this.parent=e,e.htmlElement.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this.htmlElement.style.display=this.display}hide(){this.htmlElement.style.display="none"}lockHide(){this._canHide=!1}unlockHide(){this._canHide=!0}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,t=this.htmlElement.style.visibility,n=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=t,this.htmlElement.style.position=n),o.right>i||o.left<0}ensureVisible(){this.htmlElement.closest("select, ul")?this.htmlElement.scrollIntoView({behavior:"smooth",block:"nearest",inline:"start"}):console.warn("Attempted to make a non-relevant item visible")}handleCloseElementEvent(e){const t=e.detail;this.id&&this.id==t.targetId&&(e.stopImmediatePropagation(),this.hide())}handleShowElementEvent(e){e.detail.targetId==this.id&&(e.stopImmediatePropagation(),this.show())}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this)),document.addEventListener(s.ShowElement,this.handleShowElementEvent.bind(this))}}class D{static instance=new D;dependencies={};constructor(){}static get Instance(){return D.instance}register(e,t){this.dependencies[e]=t}resolve(e){if(!this.dependencies[e])throw new Error(`Dependency ${e} not found.`);return this.dependencies[e]()}}!function(e){e.Load="load",e.Mouseenter="mouseenter",e.Mouseleave="mouseleave",e.Mousedown="mousedown",e.Mousemove="mousemove",e.Mouseup="mouseup",e.Mouseover="mouseover",e.Keyup="keyup",e.Keydown="keydown",e.Blur="blur",e.SelectStart="selectstart",e.SelectionChange="selectionchange",e.Click="click",e.Focusin="focusin",e.Focusout="focusout",e.DOMContentLoaded="DOMContentLoaded",e.Input="input",e.BblClick="dblclick"}(a||(a={}));class P{static isSelectionInTableCell(){let e=window.getSelection();if(!e?.rangeCount)return!1;let t=e.anchorNode;for(;t;){if(t.nodeType===Node.ELEMENT_NODE&&("TD"===t.tagName||"TH"===t.tagName))return!0;t=t.parentNode}return!1}static getSelectionTextInfo(e){let t,n,o=!1,i=!1;if(""==e.textContent)return o=!0,i=!0,{atStart:o,atEnd:i};const r=window.getSelection();return r&&r.rangeCount>0&&(t=r.getRangeAt(0),n=document.createRange(),n.selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),o=""===n.toString(),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),i=""===n.toString()),{atStart:o,atEnd:i}}static insertAfter(e,t){t.parentNode&&t.parentNode.insertBefore(e,t.nextSibling)}static hasTextContent(e){return""!==e.textContent?.trim()||e.hasChildNodes()&&Array.from(e.childNodes).some((e=>this.hasTextContent(e)))}static cloneAndInsertAfter(e){const t=e.cloneNode(!0),n=e.parentNode;if(!n)return null;if(n.insertBefore(t,e.nextSibling),t.id){const e=t.id.match(/^(.+?)-/);if(e){const n=e[1];t.id=n+"-"+H.generateUniqueId()}else t.id=H.generateUniqueId()}return t}static findClosestAncestorOfActiveElementByClass(e){const t=document.activeElement;if(!t)return null;let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static findClosestAncestorOfSelectionByClass(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;for(n&&n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static rearrangeContentAfterSplit(e,t){const n=P.getCursorPosition(e),o=this.splitContentAtCursorSelection(e);if(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(o[1]),document.getSelection()?.deleteFromDocument(),t&&n){this.setCursorPosition(t,n);const e=this.splitContentAtCursorSelection(t);document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e[0]),document.getSelection()?.deleteFromDocument()}}static getCursorPosition(e){const t=window.getSelection();if(!t||!e)return null;const n=t.getRangeAt(0);if(!n.intersectsNode(e))return null;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>NodeFilter.FILTER_ACCEPT});let i=0,r=o.firstChild();for(;r;){if(r===n.startContainer){i+=n.startOffset;break}i+=r.textContent?.length||0,r=o.nextNode()}return i}static setCursorPosition(e,t){const n=window.getSelection();if(!n)return;n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:()=>NodeFilter.FILTER_ACCEPT});let r=i.nextNode(),l=0;for(;r;){const e=r.textContent?.length||0;if(l+e>=t){o.setStart(r,t-l),o.collapse(!0);break}l+=e,r=i.nextNode()}n.addRange(o)}static getContentTypeFromActiveElement(){const e=P.getCurrentActiveBlock(),t=e?.querySelector(".johannes-content-element");return t&&t.getAttribute("data-content-type")||null}static splitContentAtCursorSelection(e){const t=[],n=window.getSelection();if(!n||0===n.rangeCount)return t;const o=n.getRangeAt(0),i=document.createRange();i.selectNodeContents(e),i.setEnd(o.startContainer,o.startOffset);const r=document.createRange();return r.selectNodeContents(e),r.setStart(o.endContainer,o.endOffset),e.lastChild&&r.setEndAfter(e.lastChild),t.push(i),t.push(r),t}static placeCursorAtStartOfEditableElement(e){setTimeout((()=>{if(e.isContentEditable){e.focus();const t=document.createRange();t.selectNodeContents(e),t.collapse(!0);const n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}else console.warn("The element is not editable.")}))}static placeCursorAtEndOfEditableElement(e){e.isContentEditable?requestAnimationFrame((()=>{e.focus();const t=document.createRange(),n=window.getSelection();t.selectNodeContents(e);let o=e;for(;o.lastChild;)o=o.lastChild;t.setEnd(o,o.nodeType===Node.TEXT_NODE?o.textContent.length:0),t.collapse(!1),n?.removeAllRanges(),n?.addRange(t)})):console.warn("The element is not editable.")}static getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}static isSelectedTextDescendantOf(e){const t=document.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).startContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!!n&&null!==n.closest(e)}static removeFilterText(){let e=null;const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0),o=n.commonAncestorContainer;if(o.nodeType===Node.TEXT_NODE&&o.parentElement?.isContentEditable){let i=o,r=n.startOffset;for(;i&&r>0;){if(e=(i.textContent?.substring(0,r)||"").lastIndexOf("/"),-1!==e){n.setStart(i,e),n.deleteContents();break}r=i.parentNode?.textContent?.lastIndexOf("/")||-1,i=i.parentNode}t.removeAllRanges(),t.addRange(n)}else console.warn("The cursor is not within a contentEditable element or a text node.")}else console.warn("No active selection.");return e}static findClickedElementOrAncestorByDataContentType(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.dataset.contentType===t)return n;let o=n.parentElement;for(;o;){if(o.dataset.contentType===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorById(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.id===t)return n;let o=n.parentElement;for(;o;){if(o.id===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorByClass(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.classList.contains(t))return n;let o=n.parentElement;for(;o;){if(o.classList.contains(t))return o;o=o.parentElement}return null}static isEventTargetDescendantOf(e,t){let n=e.target;if(!(e.target instanceof Element))return!1;for(;n&&n!==document.documentElement;){if(n.matches(t))return!0;n=n.parentElement}return!1}static getParentTargetBySelector(e,t){let n=e.target instanceof Element?e.target:e.target instanceof Node?e.target.parentElement:null;if(!n)return null;for(;n&&n!==document.documentElement;){if(n.matches(t))return n;n=n.parentElement}return null}static getParentFromSelection(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;if(n instanceof Element&&n.matches(e))return n;let o=n instanceof Element?n:n.parentElement;for(;o&&o!==document.documentElement;){if(o.matches(e))return o;o=o.parentElement}return null}static removeClassesWithPrefix(e,t){Array.from(e.classList).filter((e=>e.startsWith(t))).forEach((t=>e.classList.remove(t)))}static isTargetDescendantOfSelector(e,t){let n=null;return e.target instanceof HTMLElement?n=e.target:e.target instanceof Text&&(n=e.target.parentElement),!!n&&null!==n.closest(t)}static querySelectorIncludingSelf(e,t){return e.matches(t)?e:e.querySelector(t)}static sanitizeContentEditable(e){const t=e.innerHTML,n=window.getSelection();if(!n)return;let o=!1,i=0;if(n.rangeCount>0){const r=n.getRangeAt(0);r.endOffset===e.innerText.length&&t.endsWith("
")&&(o=!0,i=r.endOffset)}if(t.endsWith("
")){const t=e.lastChild;t&&"BR"===t.nodeName&&e.removeChild(t)}if(o){const t=new Range,o=this.getTextNodesIn(e);let r=0;for(const e of o){const n=e.length;if(r+n>=i){t.setStart(e,i-r),t.setEnd(e,i-r);break}r+=n}n.removeAllRanges(),n.addRange(t)}}static getTextNodesIn(e){let t=[];if(e.nodeType===Node.TEXT_NODE)t.push(e);else{const n=e.childNodes;for(let e=0;e0?t[n-1]:null}static getNextContentEditable(e){const t=Array.from(document.querySelectorAll('[contenteditable="true"]')),n=t.indexOf(e);return n0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left}}return{charIndex:0,horizontalPos:0}}static restoreCaretPosition2d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos);if(i0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left,verticalPos:n.top}}return{charIndex:0,horizontalPos:0,verticalPos:0}}static restoreCaretPosition3d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos),c=Math.abs(n.top-t.verticalPos),d=Math.sqrt(i**2+c**2);if(d0;)o.appendChild(o.nextSibling.firstChild);e.removeChild(o.nextSibling)}P.mergeInlineElements(o)}}}}!function(e){e.floatingToolbarDisplayed="floatingToolbarDisplayed",e.anchorButtonClicked="anchorButtonClicked",e.boldButtonClicked="boldButtonClicked",e.italicButtonClicked="italicButtonClicked",e.underlineButtonClicked="underlineButtonClicked",e.inlineCodeButtonClicked="inlineCodeButtonClicked",e.strikeThroughButtonClicked="strikeThroughButtonClicked",e.hiliteColorButtonClicked="hiliteColorButtonClicked",e.foreColorButtonClicked="foreColorButtonClicked",e.buttonGroupItemClicked="buttonGroupItemClicked",e.focusOnFirstRequested="focusOnFirstRequested",e.pressedEnterOnTitle="pressedEnterOnTitle",e.transformBlockRequested="transformBlockRequested",e.duplicateBlockRequested="duplicateBlockRequested",e.anchor="anchor",e.bold="bold",e.italic="italic",e.underline="underline",e.inlineCode="inlineCode",e.strikeThrough="strikeThrough",e.hiliteColor="hiliteColor",e.foreColor="foreColor",e.textFormatChanged="textFormatChanged",e.emittedCommand="emittedCommand",e.blockTypeChanged="blockTypeChanged",e.blockDeleted="blockDeleted",e.blockCloned="blockCloned",e.tableCellChanged="tableCellChanged"}(c||(c={})),function(e){e.LowImportance="100",e.SlightlyImportant="200",e.Neutral="300",e.ModeratelyImportant="400",e.VeryImportant="500",e.ExtremelyImportant="600"}(d||(d={}));class F extends R{dropdowns;separators;currentSelectionRange;htmlFocusedElementBeforeOpenQuickMenu;constructor(e){super({id:e}),this.dropdowns=[],this.separators=[],this.currentSelectionRange=null,this.htmlFocusedElementBeforeOpenQuickMenu=null}init(){const e=document.createElement("div");e.id=this.props.id,e.style.display="none",e.classList.add("floating-toolbar","select-wrapper","soft-box-shadow"),e.style.zIndex=d.SlightlyImportant;const t=document.createElement("div");return e.appendChild(t),e}get display(){return"flex"}hide(){this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.currentSelectionRange=null,super.hide())}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendButtonGroup(e){this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.separators.push(e),this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener(c.blockDeleted,(()=>{this.hide()})),document.addEventListener(c.blockTypeChanged,(()=>{this.hide()}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}!function(e){e.HiliteColorRed="#FDDEDE",e.HiliteColorGreen="#D7F7DC",e.HiliteColorBlue="#D9EDF6",e.HiliteColorYellow="#FAF4D1",e.HiliteColorGrey="#E1E0E0",e.HiliteColorNone="transparent",e.ForeColorRed="#D44C47",e.ForeColorGreen="#448361",e.ForeColorBlue="#337EA9",e.ForeColorYellow="#CB912F",e.ForeColorGrey="#787774",e.ForeColorInitial="initial",e.BackgroundColorRed="#FDDEDE",e.BackgroundColorGreen="#D7F7DC",e.BackgroundColorBlue="#D9EDF6",e.BackgroundColorYellow="#FAF4D1",e.BackgroundColorGrey="#E1E0E0",e.BackgroundColorNone="transparent",e.IconActiveBlue="#2382e2",e.IconDefaultBlack="rgba(55, 53, 47, 0.85)",e.Red="red",e.Tomato="#EB5757",e.OriginalTableColor="#84888d"}(u||(u={})),function(e){e.CalloutBackgroundRed="callout-background-red",e.CalloutBackgroundGreen="callout-background-green",e.CalloutBackgroundBlue="callout-background-blue",e.CalloutBackgroundYellow="callout-background-yellow",e.CalloutBackgroundGrey="callout-background-grey",e.CalloutBackgroundNone="callout-background-none"}(m||(m={})),function(e){e.toggleBold="bold",e.toggleItalic="italic",e.toggleHiliteColor="hiliteColor",e.changeCalloutBackgroundColor="changeCalloutBackgroundColor",e.toggleForeColor="foreColor",e.toggleInlineCode="inlineCode",e.toggleLink="createLink",e.linkReadyToInsert="linkReadyToInsert",e.toggleUnderline="underline",e.toggleStrikeThrough="strikeThrough",e.removeFormat="removeFormat",e.copySelected="copySelected",e.cutSelected="cutSelected",e.past="past",e.transformBlock="transformBlock",e.duplicateBlock="duplicateBlock",e.deleteBlock="deleteBlock",e.createDefaultBlock="createDefaultBlock",e.focusOnNextBlock="focusOnNextBlock",e.focusOnPreviousBlock="focusOnPreviousBlock",e.mergeWithPreviousBlock="mergeWithPreviousBlock",e.mergeWithNextBlock="mergeWithNextBlock",e.focusOnFirstBlock="focusOnFirstBlock",e.deleteBlockAndFocusOnPrevious="deleteBlockAndFocusOnPrevious",e.deleteBlockAndFocusOnNext="deleteBlockAndFocusOnNext",e.JustifyLeft="justifyLeft",e.JustifyCenter="justifyCenter",e.JustifyRight="justifyRight",e.insertNew="insertNew",e.insertTableRowAbove="insertTableRowAbove",e.insertTableRowBelow="insertTableRowBelow",e.insertTableColumnLeft="insertTableColumnLeft",e.insertTableColumnRight="insertTableColumnRight",e.showInsertTableColumnElement="showInsertTableColumnElement",e.showInsertTableRowElement="showInsertTableRowElement",e.hideInsertTableColumnElement="hideInsertTableColumnElement",e.hideInsertTableRowElement="hideInsertTableRowElement",e.toggleCellHiliteColor="toggleCellHiliteColor",e.removeColumn="removeColumn",e.removeRow="removeRow",e.changeTableBorderColor="changeTableBorderColor",e.changeCodeBlockLanguage="changeCodeBlockLanguage"}(h||(h={}));class V{color;constructor(e){this.color=e}}class _{classKey;value;intention;constructor(e,t,n){this.classKey=e,this.value=t,this.intention=n}}class j{classKey;constructor(e){this.classKey=e}}class z{}class Y{}class U{language;blockId;constructor(e,t){this.blockId=e,this.language=t}}class G{static emitCodeBlockLanguageChangedEvent(e,t,n){const o=new CustomEvent(s.ChangeBlockToolbarLanguage,{detail:{targetClass:e,action:new U(t,n)}});document.dispatchEvent(o)}static emitShowElementEvent(e){const t=new CustomEvent(s.ShowElement,{detail:{targetId:e,action:new Y}});document.dispatchEvent(t)}static emitCloseElementEvent(e){const t=new CustomEvent(s.CloseElement,{detail:{targetId:e,action:new z}});document.dispatchEvent(t)}static emitChangeComponentColorEvent(e,t){const n=new CustomEvent(s.ColorChangeRequest,{detail:{targetId:e,action:new V(t)}});document.dispatchEvent(n)}static emitShowHideActiveElementEvent(e,t,n){"hiliteColor"==e&&t==u.HiliteColorNone&&(n="hide"),"foreColor"==e&&t==u.ForeColorInitial&&(n="hide"),"backgroundColor"==e&&t==u.BackgroundColorNone&&(n="hide");const o=new CustomEvent(s.ShowHideActiveButton,{detail:{targetClass:e,action:new _(e,t,n)}});document.dispatchEvent(o)}static emitResetActiveButtonsElementEvent(e){const t=new CustomEvent(s.ResetActiveButtons,{detail:{targetClass:e,action:new j(e)}});document.dispatchEvent(t)}static emitChangeTableBorderColorEvent(e,t){const n=new CustomEvent(c.emittedCommand,{detail:{command:h.changeTableBorderColor,value:t,scope:e}});document.dispatchEvent(n)}}!function(e){e.Link="linkButton",e.Bold="boldButton",e.Italic="italicButton",e.Underline="underlineButton",e.InlineCode="inlineCodeButton",e.Strikethrough="strikethroughButton",e.AlignLeft="alignLeft",e.AlignCenter="alignCenter",e.AlignRight="alignRight"}(p||(p={})),function(e){e.Shift="Shift",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Control="Control",e.Space=" ",e.Delete="Delete"}(A||(A={}));class K extends F{static id="textFloatingToolbar";static instance;textOperationsService;initialRect=null;lockedHide=!1;debounceTimer=null;constructor(e){if(K.instance)throw new Error("Use TextContextFloatingToolbar.getInstance() to get instance.");super(K.id),this.htmlElement.style.zIndex=d.VeryImportant,this.textOperationsService=e,this.attachEvents()}static getInstance(){const e=D.Instance.resolve("ITextOperationsService");return K.instance||(K.instance=new K(e)),K.instance}processSelectionChangeEffects(){setTimeout((()=>{G.emitResetActiveButtonsElementEvent("hiliteColor"),G.emitResetActiveButtonsElementEvent("foreColor");const e=this.textOperationsService.queryCommandState("createLink"),t=this.textOperationsService.queryCommandState("bold"),n=this.textOperationsService.queryCommandState("italic"),o=this.textOperationsService.queryCommandState("underline"),i=this.textOperationsService.queryCommandState("inlineCode"),r=this.textOperationsService.queryCommandState("strikeThrough"),l={};l[u.HiliteColorRed]=this.textOperationsService.queryHiliteColor(u.HiliteColorRed),l[u.HiliteColorGreen]=this.textOperationsService.queryHiliteColor(u.HiliteColorGreen),l[u.HiliteColorBlue]=this.textOperationsService.queryHiliteColor(u.HiliteColorBlue),l[u.HiliteColorYellow]=this.textOperationsService.queryHiliteColor(u.HiliteColorYellow),l[u.HiliteColorGrey]=this.textOperationsService.queryHiliteColor(u.HiliteColorGrey);const s={};s[u.ForeColorRed]=this.textOperationsService.queryForeColor(u.ForeColorRed),s[u.ForeColorGreen]=this.textOperationsService.queryForeColor(u.ForeColorGreen),s[u.ForeColorBlue]=this.textOperationsService.queryForeColor(u.ForeColorBlue),s[u.ForeColorYellow]=this.textOperationsService.queryForeColor(u.ForeColorYellow),s[u.ForeColorGrey]=this.textOperationsService.queryForeColor(u.ForeColorGrey),Object.entries(l).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")})),Object.entries(s).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("foreColor",e,"show")})),this.emitChangeComponentColorEvent(e,p.Link),this.emitChangeComponentColorEvent(t,p.Bold),this.emitChangeComponentColorEvent(n,p.Italic),this.emitChangeComponentColorEvent(i,p.InlineCode),this.emitChangeComponentColorEvent(o,p.Underline),this.emitChangeComponentColorEvent(r,p.Strikethrough)}),20)}emitChangeComponentColorEvent(e,t){e?G.emitChangeComponentColorEvent(t,u.IconActiveBlue):G.emitChangeComponentColorEvent(t,u.IconDefaultBlack)}logSelectionChange(e){const t=document.getSelection();t&&!t.isCollapsed&&(this.processSelectionChangeEffects(),console.log("passou no log selection"))}attachEvents(){let e,t=!1;this.htmlElement.addEventListener(a.Mouseup,(e=>{e.preventDefault()})),document.addEventListener(a.Mouseup,this.logSelectionChange.bind(this)),document.addEventListener(a.BblClick,this.logSelectionChange.bind(this)),document.addEventListener(a.SelectionChange,this.logSelectionChange.bind(this)),document.addEventListener(a.Keydown,(e=>{e.shiftKey&&(t=!0)})),document.addEventListener(a.Keyup,(e=>{e.key===A.Shift&&(t=!1,this.showHide(e,t))})),document.addEventListener(a.Mousedown,(()=>{t=!0})),document.addEventListener(a.Mouseup,(n=>{t=!1,this.showHide(n,t),clearTimeout(e),e=setTimeout((()=>{t=!1,this.showHide(n,t)}),100)})),document.addEventListener(a.SelectionChange,(e=>{this.showHide(e,t)})),document.addEventListener(a.Keydown,(e=>{setTimeout((()=>{this.canHide&&e.key===A.Escape&&!this.lockedHide&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide())}),10)})),super.attachEvents()}shouldUpdatePosition(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0).getBoundingClientRect();return!this.initialRect||(Math.abs(t.left-this.initialRect.left)>10||Math.abs(t.top-this.initialRect.top)>10)}showHide(e,t){const n=this.hasSelection();if(!n){if(this.lockedHide)return;return this.hide(),void(this.initialRect=null)}if(n&&!t)if(this.isVisible){if(this.shouldUpdatePosition()&&(P.isSelectedTextDescendantOf(".gist")||P.isSelectedTextDescendantOf(".gist")))return}else{if(P.isSelectedTextDescendantOf(".ignore-text-floating-toolbar")||P.isSelectedTextDescendantOf(".gist"))return;this.show()}}hasSelection(){const e=window.getSelection();return!!(e&&e.rangeCount>0&&""!==e.toString().trim())}changeToolbarPositionToBeClosedToSelection(){const e=window.getSelection();if(!e||0===e.rangeCount)return void console.error("No selection found");this.currentSelectionRange=e.getRangeAt(0);const t=this.currentSelectionRange.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20);const a=this.htmlElement.offsetHeight;let c=i+window.scrollY-a-10;c<0&&(c=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${c}px`}show(){const e=window.getSelection();e&&0!==e.rangeCount?P.findClosestAncestorOfActiveElementByClass("title")||(this.changeToolbarPositionToBeClosedToSelection(),this.hideTurnIntoDropdownIfInCell()):console.error("No selection found")}hideTurnIntoDropdownIfInCell(){const e=P.isSelectionInTableCell();this.dropdowns.forEach((t=>{"turnIntoMenu"==t.id&&(t.htmlElement.style.display=e?"none":this.display)})),this.separators.forEach((t=>{"turnIntoSeparator"==t.id&&(t.htmlElement.style.display=e?"none":this.display)}))}updatePosition(){const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0).getBoundingClientRect();this.setPosition(t)}}setPosition(e){const t=this.htmlElement.offsetWidth;let n=e.left+window.scrollX-50;n+t>window.innerWidth&&(n=window.innerWidth-t-20);const o=this.htmlElement.offsetHeight;let i=e.top+window.scrollY-o-10;i<0&&(i=e.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}hide(){this.canHide&&(this.currentSelectionRange=null,super.hide())}lockHide(){this.lockedHide=!0}unlockHide(){this.lockedHide=!1}}class Z extends R{parentWrapper;constructor(){super({})}init(){const e=document.createElement("input");return e.id="linkBoxInput",e.type="url",e.placeholder="Paste or type a link...",e.style.position="relative",e}setParentWrapper(e){this.parentWrapper=e}}class W extends R{inputLinkBox;highlights=[];button;textContextFloatingToolbar;constructor(){const e=new Z,t=document.createElement("button");super({inputLinkBox:e,button:t}),this.id="linkBox",this.inputLinkBox=e,this.button=t,e.setParentWrapper(this),this.textContextFloatingToolbar=K.getInstance(),this.attachEvent()}init(){const e=document.createElement("div");e.id="linkBox",e.style.display="none",e.classList.add("dependent-box","soft-box-shadow"),e.style.position="absolute";const t=document.createElement("div");t.classList.add("header"),t.innerText="Link";const n=document.createElement("div");return n.appendChild(this.props.inputLinkBox.htmlElement),n.classList.add("link-box-shell"),this.props.button.classList.add("blue-button"),this.props.button.innerHTML="Embed",n.appendChild(this.props.button),e.appendChild(t),e.appendChild(n),e}attachEvent(){document.addEventListener(a.Keydown,(e=>{this.canHide&&"Escape"===e.key&&(e.stopImmediatePropagation(),this.hide())}),!0),document.addEventListener(a.Keydown,(function(e){e.key===A.Control&&document.body.classList.add("ctrl-active")})),document.addEventListener(a.Keyup,(function(e){e.key===A.Control&&document.body.classList.remove("ctrl-active")})),this.inputLinkBox.htmlElement.addEventListener(a.Keydown,(e=>{e.key==A.Enter&&this.insertLink(e)})),document.addEventListener(a.Click,(e=>{if(e.ctrlKey){const t=e.target;if("A"===t.tagName&&t.getAttribute("href")){const e=t.getAttribute("href");return void window.open(e,"_blank")}}!this.canHide||e.target.closest("#linkBox")||e.target.closest("#textFloatingToolbar")||this.hide()})),this.button.addEventListener(a.Click,this.insertLink.bind(this)),super.attachUIEvent()}handleShowElementEvent(e){const t=e.detail;t.targetId!=this.id||this.isVisible?t.targetId==this.id&&this.isVisible&&(e.stopImmediatePropagation(),this.hide()):(e.stopImmediatePropagation(),this.show())}insertLink(e){e.preventDefault(),e.stopImmediatePropagation();const t=this.inputLinkBox.htmlElement.value,n=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;if(H.isValidUrl(n))this.hide(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.linkReadyToInsert,value:n}}));else{const e=this.inputLinkBox.htmlElement;e.style.backgroundColor="rgb(253, 222, 222)",e.classList.add("shake-animation"),setTimeout((()=>{e.classList.remove("shake-animation")}),1e3)}}show(){this.inputLinkBox.htmlElement.style.backgroundColor="white",this.textContextFloatingToolbar.lockHide();const e=document.getSelection()?.getRangeAt(0);e&&(this.positionLinkComponentBelowSelection(e),this.highlightSelectedText(e),super.show())}positionLinkComponentBelowSelection(e){const t=e.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20),this.htmlElement.offsetHeight;let a=i+window.scrollY+40;a<0&&(a=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${a}px`}hide(){this.textContextFloatingToolbar.unlockHide(),super.hide(),this.removeHighlights(),this.inputLinkBox.htmlElement.value="";const e=this.textContextFloatingToolbar.currentSelectionRange;e&&(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e))}highlightSelectedText(e){const t=e.getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class $ extends R{elementFactoryService;static editorId="johannesEditor";static instance;memento;title;content;addBlock;textFloatingToolbar;quickMenu;tableContextToolbar;mediaInputter;inputLinkBoxWrapper;constructor(e,t,n,o,i,r,l,s,a,c,d){if(super({elementFactoryService:e,blockOperationsService:t,title:o,content:i,addBlock:r,floatingToolbar:l,quickMenu:s,tableToolbar:a,mediaInputter:c,inputLinkBoxWrapper:d}),$.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.inputLinkBoxWrapper=d,this.elementFactoryService=e,this.memento=n,this.addBlock=r,this.textFloatingToolbar=l,this.quickMenu=s,this.tableContextToolbar=a,this.mediaInputter=c,this.attachEvents(),$.instance=this,this.memento.saveState()}init(){const e=document.getElementById($.editorId)||document.createElement("div");e.classList.add("johannes-editor");const t=document.createElement("div");return t.classList.add("content-wrapper"),window.editorConfig,t.appendChild(this.props.title.htmlElement),t.appendChild(this.props.content.htmlElement),e.appendChild(t),window.editorConfig,e.appendChild(this.props.addBlock.htmlElement),window.editorConfig,e.appendChild(this.props.floatingToolbar.htmlElement),window.editorConfig,e.appendChild(this.props.quickMenu.htmlElement),e.appendChild(this.props.tableToolbar.htmlElement),e.appendChild(this.props.mediaInputter.htmlElement),e.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}static getInstance(e,t,n,o,i,r,l){const s=D.Instance.resolve("IElementFactoryService"),a=D.Instance.resolve("IBlockOperationsService"),c=D.Instance.resolve("IMemento"),d=new W;return $.instance||($.instance=new $(s,a,c,e,t,n,o,i,r,l,d)),$.instance}attachEvents(){const e=document.getElementById($.editorId);if(e?.addEventListener("mouseover",(e=>{const t=e.target;if(t instanceof Node){let e=t;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const t=e.closest(".block");t&&this.appendDragHandler(t)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",t)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const t=e.clipboardData;if(t){const e=t.getData("text/plain");$.insertTextAtCursor(e)}}}),!0),this.attachDragHandler()}static insertTextAtCursor(e){const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents();const o=document.createTextNode(e);n.insertNode(o),n.setStartAfter(o),n.setEndAfter(o),t.removeAllRanges(),t.addRange(n)}}appendDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");let n=t?.querySelector(".drag-handler");!n&&t&&(n=this.elementFactoryService.create(O.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(n))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");if(t){const e=t.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}attachDragHandler(){let e=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",this.htmlElement.addEventListener("dragstart",(t=>{t.target?.classList?.contains("drag-handler")&&(e=t.target?.closest(".block"),e.setAttribute("draggable","true"),setTimeout((()=>{e.style.opacity="0.5"}),0))})),this.htmlElement.addEventListener("dragend",(()=>{setTimeout((()=>{e&&(e.style.opacity="",e.removeAttribute("draggable"),e=null),t.remove()}),0)})),this.htmlElement.addEventListener("dragover",(n=>{n.preventDefault();let o=n.target?.closest(".block");if(o&&o!==e){let e=o.getBoundingClientRect(),i=e.y+e.height/2;n.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),this.htmlElement.addEventListener("drop",(n=>{n.preventDefault(),e&&t&&t.parentElement&&(t.parentElement.insertBefore(e,t),t.remove())}))}}class Q extends R{blockOperationsService;icon;constructor(e,t){super({icon:t}),this.blockOperationsService=e,this.icon=t,this.attachEvents()}init(){const e=document.createElement("button");return e.title="Add a new block",e.classList.add("add-block","block-operation","pointer"),e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(h.createDefaultBlock,!1)}))}static create(e){const t=D.Instance.resolve("IBlockOperationsService");return new Q(t,e)}}class X extends R{button;constructor(e){super({button:e}),this.button=e}init(){const e=document.createElement("div");return e.classList.add("add-block-wrapper"),e.appendChild(this.props.button.htmlElement),e}static create(e){return new X(e)}}class J{static medium="1rem";static large="1.25rem"}class ee extends R{useElement;constructor(e,t){super({iconId:e,size:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="red !important";let t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.iconId}`),t.style.color="red !important",e.appendChild(t),e.setAttribute("width",this.props.size),e.setAttribute("height",this.props.size),e.setAttribute("fill","currentColor"),e}clone(){return new ee(this.props.iconId,this.props.sizes)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}static create(e,t){return new ee(e,t)}}class te{static build(){return X.create(Q.create(ee.create(i.Plus,J.medium)))}}class ne extends R{id;dropdownButton;dropdownList;constructor(e,t,n){super({id:e}),this.id=e,this.dropdownButton=t,this.dropdownList=n,t.appendTo(this),n.appendTo(this)}init(){const e=document.createElement("div");return e.id=this.props.id,e.classList.add("select-wrapper"),e}get display(){return"block"}static create(e,t,n,o=[]){const i=new ne(e+H.generateUniqueId(),t,n);return i.addCssClass(...o),i}}class oe{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let t=0;for(let n of this)e(n.value,t,this),t++}any(e){let t=this.head;for(;t;){if(e(t.value))return!0;if(t=t.nextNode,t===this.head)break}return!1}findFirst(e){if(!this.head)return null;let t=this.head;do{if(e(t.value))return t;t=t.nextNode}while(t&&t!==this.head);return null}findLast(e){if(!this.tail)return null;let t=this.tail;do{if(e(t.value))return t;t=t.previousNode}while(t&&t!==this.tail);return null}find(e){let t=this.head;for(;t;){if(t.value==e)return t;if(t=t.nextNode,t===this.head)break}return null}}class ie{parentList;previousNode;nextNode;value;constructor(e,t){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=t}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let t=this.nextNode;const n=this;for(;t;){if(e(t.value))return t;if(t=t.nextNode,t===n)break}return null}getPreviousSatisfying(e){let t=this.previousNode;const n=this;for(;t&&t!==n;){if(e(t.value))return t;if(t=t.previousNode,t===this)break}return null}}class re extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(t.setPrevious(this.tail),t.setNext(this.head),this.tail.setNext(t),this.head.setPrevious(t),this.tail=t):(this.head=t,this.tail=t,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class le extends R{id;command;value;activeIcon;leftIcon;title;onFocusFunctionList=[];onLoseFocusFunctionList=[];parentDropdownMenuList;constructor(e,t,n,o,i,r,l=null){const s=["list-item","option","option-hover","block-operation","no-list-style","no-selection"],a=new ee("icon-material-small-check",J.medium);a.htmlElement.style.visibility="hidden",o&&i&&(i.style.color=o),super({id:e,classList:s,leftIcon:i,title:r,icon:a,shortcut:l}),this.id=e,this.classList=s,this.leftIcon=i,this.command=n,this.value=o,this.title=r,this.parentDropdownMenuList=t,this.activeIcon=a,this.attachEvents()}addClass(e){this.classList.push(e),this.htmlElement.classList.add(e)}attachOnFocus(e,...t){this.onFocusFunctionList.push((()=>e(...t)))}attachOnLoseFocus(e,...t){this.onLoseFocusFunctionList.push((()=>e(...t)))}get display(){return"flex"}focus(){this.htmlElement.classList.add("option-focused"),this.onFocusFunctionList.forEach((e=>e()))}removeFocus(){this.htmlElement.classList.remove("option-focused"),this.onLoseFocusFunctionList.forEach((e=>e()))}init(){const e=document.createElement("li");e.id=this.props.id;const t=this.props.classList;e.classList.add("pointer",...t),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),this.props.leftIcon&&n.appendChild(this.props.leftIcon);const o=document.createElement("span");if(o.innerText=this.props.title,n.appendChild(o),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const t=document.createElement("span");t.innerText=this.props.shortcut,t.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(t)}return e}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:this.command,value:this.value,block:P.getParentFromSelection(".block")||P.getParentTargetBySelector(e,".block")}});document.dispatchEvent(t)}attachEvents(){this.attachUIEvent(),this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousemove,(async()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault(),e.stopImmediatePropagation(),this.emitCommandEvent(e)})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&t.targetClass.includes("code-block-language-menu")){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.value==e.language?this.activeIcon?.changeVisibilityToVisible():this.activeIcon?.changeVisibilityToHidden())}}attachUIEvent(){document.addEventListener(s.ShowHideActiveButton,this.handleShowHideActiveButtonEvent.bind(this)),document.addEventListener(s.ResetActiveButtons,this.handleResetActiveButtonsEvent.bind(this))}handleShowHideActiveButtonEvent(e){const t=e.detail;if(this.classList?.includes(t.targetClass)){const e=t.action,n=e.value;this.value?.toLowerCase()==n.toLowerCase()&&"show"==e.intention&&this.activeIcon?.changeVisibilityToVisible()}}handleResetActiveButtonsEvent(e){const t=e.detail;this.classList?.includes(t.targetClass)&&this.activeIcon?.changeVisibilityToHidden()}}class se extends R{parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;filter="";constructor(e){super({id:e}),this.id=e,this.dropdownItems=new re,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e.style.zIndex=d.ExtremelyImportant,e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener(a.Keydown,(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&(e.stopImmediatePropagation(),e.preventDefault(),this.currentFocusedMenuItem.value.emitCommandEvent(e))}),!0),document.addEventListener(a.Click,(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener(a.Keydown,(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()),e.key!=A.Escape||this.htmlElement.closest(".floating-toolbar")||(e.stopImmediatePropagation(),e.preventDefault(),this.hide()))})),document.addEventListener(a.Keydown,this.handlerKeyDownEvent.bind(this)),document.addEventListener(c.blockCloned,(()=>{this.hide()})),this.attachUIEvent()}handlerKeyDownEvent(e){this.isVisible&&/^[a-zA-Z]$/.test(e.key)?(this.filter+=e.key,this.applyFilter()):this.isVisible&&e.key===A.Backspace&&(this.filter=this.filter.slice(0,-1),this.applyFilter())}applyFilter(){this.dropdownItems.forEach((e=>{""==e.value||e.value?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())||e.title?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())?e.show():e.hide()}))}show(){this.filter="",this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),this.applyFilter(),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}static create(e,t=[]){const n=new se(e+H.generateUniqueId());return n.addCssClass(...t),n}}class ae extends R{id;constructor(e){super({id:e}),this.id=e}init(){const e=document.createElement("div");return e.id=this.props.id,e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class ce extends R{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e}}class de extends R{command;showUI;icon;constructor(e,t,n){super({title:t,icon:n}),this.command=e,this.showUI=e==h.toggleLink,this.icon=n,this.attachEvents()}init(){const e=document.createElement("button");return e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener(a.Click,(async e=>{const t=P.findClickedElementOrAncestorByClass(e,"block");document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:this.command,showUI:this.showUI,block:t}}))})),document.addEventListener(s.ColorChangeRequest,(e=>{const t=e.detail;this.id==t.targetId&&this.icon.changeColor(t.action.color)}))}static create(e,t,n){return new de(e,t,n)}}class ue extends R{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class me extends R{parentDropdownMenuList;constructor(e,t){super({title:t}),this.parentDropdownMenuList=e}title="";activeIcon;value="";changeActiveIconToVisible(){}getLeftIconBackgroundColor(){return null}resetActiveIcon(){}attachOnLoseFocus(e){throw new Error("Method not implemented.")}attachOnFocus(e){throw new Error("Method not implemented.")}emitCommandEvent(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li");e.classList.add("no-list-style");const t=document.createElement("h3");return t.innerText=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}}!function(e){e.BackgroundOptionRed="BackgroundOptionRed",e.BackgroundOptionGreen="BackgroundOptionRed",e.BackgroundOptionBlue="BackgroundOptionRed",e.BackgroundOptionYellow="BackgroundOptionRed",e.BackgroundOptionGrey="BackgroundOptionRed",e.BackgroundOptionNone="BackgroundOptionRed"}(C||(C={}));class he{static alignTool(){const e=new ce;return de.create(h.JustifyLeft,"Left",ee.create(i.JustifyStart,J.large)).appendTo(e),de.create(h.JustifyCenter,"Center",ee.create(i.JustifyCenter,J.large)).appendTo(e),de.create(h.JustifyRight,"Right",ee.create(i.JustifyEnd,J.large)).appendTo(e),e}static colorTool(){const e=new se("colorInteractiveOptionSelect"+H.generateUniqueId()),t=new Ae("colorInteractiveButton"+H.generateUniqueId(),new ue("#FAF4D1").htmlElement,e);t.addCssClass("color-interactive-button");const n=new ne("colorInteractionOptionsMenu"+H.generateUniqueId(),t,e);e.append(new me(e,"Background"));const o=new le(C.BackgroundOptionRed+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundRed,new ue(u.HiliteColorRed).htmlElement,"Red"),i=new le(C.BackgroundOptionGreen+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGreen,new ue(u.HiliteColorGreen).htmlElement,"Green"),r=new le(C.BackgroundOptionBlue+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue"),l=new le(C.BackgroundOptionYellow+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow"),s=new le(C.BackgroundOptionGrey+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey"),a=new le(C.BackgroundOptionNone+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundNone,new ue(u.HiliteColorNone).htmlElement,"None");return e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static languageSelectionTool(){const e=se.create("languageSelectionInteractiveOptionSelect"),t=Ae.create("languageSelectionInteractiveButton","Plain Text",e,!0,["code-block-language-menu","color-interactive-button"]),n=ne.create("languageSelectionInteractionOptionsMenu",t,e);return e.append(new me(e,"Language")),Object.entries(pe.languageMap).sort(((e,t)=>e[1].localeCompare(t[1]))).forEach((([t,n])=>{const o=new le("languageSelectionItem-"+H.generateUniqueId(),e,h.changeCodeBlockLanguage,t,null,n);"plaintext"==o.value&&o.activeIcon?.changeVisibilityToVisible(),e.append(o)})),n}static extraOptions(){const e=new ee("icon-material-more",J.large),t=se.create("moreInteractiveOptionSelect",["media-more-option-select"]),n=Ae.create("moreInteractiveOptionButton",e.htmlElement,t,!1,["moreMediaOptionsButton"]),o=ne.create("moreInteractiveOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("duplicateOption"+H.generateUniqueId(),t,h.duplicateBlock,null,ee.create(i.Duplicate,J.large).htmlElement,"Clone","Ctrl+D"));const r=new le("deleteOption"+H.generateUniqueId(),t,h.deleteBlock,null,ee.create(i.Trash,J.large).htmlElement,"Delete","Shift+Del");return r.addCssClass("danger-option"),t.append(r),o}}!function(e){e.TD="td",e.TABLE="table"}(g||(g={}));class pe{static instance;static languageMap={ada:"Ada",apache:"Apache Config",applescript:"AppleScript",arduino:"Arduino",asciidoc:"AsciiDoc",bash:"Bash",basic:"BASIC",c:"C",csharp:"C#",cpp:"C++",css:"CSS",coffeescript:"CoffeeScript",dart:"Dart",go:"Go",html:"HTML",java:"Java",javascript:"JavaScript",json:"JSON",markdown:"Markdown",perl:"Perl",php:"PHP",plaintext:"Plain Text",python:"Python",ruby:"Ruby",scss:"SCSS",shell:"Shell",sql:"SQL",typescript:"TypeScript",xml:"XML",yaml:"YAML"};constructor(){if(pe.instance)throw new Error("Use BlockToolbox.getInstance() to get instance.");this.attachEvents()}static getInstance(){return pe.instance||(pe.instance=new pe),pe.instance}listen(){console.log("Listening block toolboxes...")}attachEvents(){document.addEventListener(a.Mouseover,this.insertToolboxIntoBlockOnce.bind(this)),document.addEventListener(a.Focusin,this.handleTableBehaviorFocusIn.bind(this)),document.addEventListener(a.Focusout,this.handleTableBehaviorFocusOut.bind(this)),document.addEventListener(a.Click,this.handleClickEvent.bind(this))}handleClickEvent(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}handleTableBehaviorFocusIn(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!0)}handleTableBehaviorFocusOut(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}toolboxVisibilityController(e,t){const n=e.closest(".block");if(n){const e=n.querySelector(".block-toolbar");e&&(t?e.classList.add("hidden"):e.classList.remove("hidden"))}}insertToolboxIntoBlockOnce(e){const t=e.target.closest(`.${r.IncludeBlockToolbarClass}`);if(!t)return;const n=t.closest(".block");if(n&&null===n.querySelector(".block-toolbar-wrapper")){const e=t.classList.contains(r.LanguageSelectionToolClass),o=t.classList.contains(r.AlignToolClass),i=t.classList.contains(r.ColorToolClass),l=t.classList.contains(r.ExtraOptionsClass),s=pe.createToolbox(e,o,i,l);n&&(n.appendChild(s),n.addEventListener(a.Mouseenter,(e=>this.resetToolbox(e,n))),n.addEventListener(a.Mousemove,(e=>{const t=s.firstChild?.id,o=document.getElementById(t);o&&(n.contains(e.target)?o.style.display="flex":this.hideBlockToolbox(s))})),n.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s))),document.addEventListener(a.Click,(e=>{P.isTargetDescendantOfSelector(e,`#${n.id}`)||this.hideBlockToolbox(s)})),n.querySelectorAll("iframe").forEach((e=>{e.addEventListener(a.Mouseenter,(()=>{const e=s.firstChild?.id,t=document.getElementById(e);t&&(t.style.display="flex",this.changeToolbarColor(n))})),e.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s)))})))}}changeToolbarColor(e){const t=e.querySelector(".color-interactive-button div"),n=e.querySelector(".callout-wrapper");if(t&&n){var o=window.getComputedStyle(n);t.style.backgroundColor=o.backgroundColor,t.style.borderColor=o.borderColor,t.style.borderColor="#ccc"}}hideBlockToolbox(e){const t=e.firstChild?.id,n=document.getElementById(t);n&&(pe.isAnyDependentBoxVisible(n)||(n.style.display="none"))}static isAnyDependentBoxVisible(e){const t=e.querySelectorAll(".dependent-box");for(const e of t){const t=window.getComputedStyle(e);if("none"!==t.display&&"hidden"!==t.visibility)return!0}return!1}resetToolbox(e,t){const n=t.querySelector(".block-toolbar");if(!n)return void console.log("block-toolbar not found");const o=n.querySelector(".media-more-option-select");o&&(o.style.display="none");const i=n.querySelector(".color-interactive-select");i&&(i.style.display="none"),this.changeToolbarColor(t)}static createToolbox(e=!1,t=!1,n=!1,o=!1){const i=document.createElement("div");i.classList.add("block-toolbar-wrapper","exclude-from-clone",l.EditorOnly),i.style.position="relative";const r=document.createElement("div");return r.classList.add("block-toolbar","soft-box-shadow"),r.id=`btb-${H.generateUniqueId()}`,i.appendChild(r),e&&r.appendChild(he.languageSelectionTool().htmlElement),t&&r.appendChild(he.alignTool().htmlElement),n&&r.appendChild(he.colorTool().htmlElement),o&&r.appendChild(he.extraOptions().htmlElement),i}}class Ae extends R{dropdownList;svgIcon;constructor(e,t,n,o=!0){const i=new ee("icon-wordpress-chevron-down",J.medium);super({id:e,title:t,dropdownList:n,svgIcon:o?i:null}),this.dropdownList=n,this.svgIcon=i,this.attachEvents(),n.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover","pointer"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const t=document.createElement("span");t.classList.add("no-selection"),t.textContent=this.props.title,e.appendChild(t)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible?this.dropdownList.hide():this.dropdownList.show()})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&this.classList.includes(t.targetClass)){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.changeTitle(pe.languageMap[e.language]),this.dropdownList.hide())}}get display(){return"block"}changeTitle(e){const t=this.htmlElement.querySelector("span");t&&(t.textContent=e)}static create(e,t,n,o,i=[]){const r=new Ae(e+H.generateUniqueId(),t,n,o);return r.addCssClass(...i),r}}!function(e){e.ColorTextOptionSelect="colorTextOptionSelect"}(b||(b={})),function(e){e.ColorTextOptionsMenu="colorTextOptionsMenu"}(E||(E={}));class Ce{static build(){const e=K.getInstance();return e.appendDropdown(Ce.turnIntoDropdown()),e.appendSeparator(Ce.separator("turnIntoSeparator")),e.appendButtonGroup(Ce.buttonGroup()),e.appendDropdown(Ce.colorDropdown()),e.appendSeparator(Ce.separator("textOperationsSeparator")),e.appendDropdown(Ce.moreOptionsDropdown()),e}static turnIntoDropdown(){const e=new se("turnIntoSelect"),t=new Ae("turnIntoButton","Text",e),n=new ne("turnIntoMenu",t,e);return e.append(new me(e,"Turn into")),e.append(new le("turnIntoOptionText",e,h.transformBlock,O.ELEMENT_TYPES.PARAGRAPH,ge.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),e.append(new le("turnIntoOptionTodoList",e,h.transformBlock,O.ELEMENT_TYPES.CHECK_LIST,ge.todo_list.htmlElement,"Todo list","Ctrl+1")),e.append(new le("turnIntoOptionBulletedList",e,h.transformBlock,O.ELEMENT_TYPES.BULLETED_LIST,ge.b_list.htmlElement,"Bulleted list","Ctrl+.")),e.append(new le("turnIntoOptionNumberedList",e,h.transformBlock,O.ELEMENT_TYPES.NUMBERED_LIST,ge.n_list.htmlElement,"Numbered list","Ctrl+/")),e.append(new le("turnIntoOptionBlockCode",e,h.transformBlock,O.ELEMENT_TYPES.CODE,ge.code.htmlElement,"Block code")),e.append(new le("turnIntoOptionQuote",e,h.transformBlock,O.ELEMENT_TYPES.QUOTE,ge.quote.htmlElement,"Quote")),e.append(new le("turnIntoOptionHeading2",e,h.transformBlock,O.ELEMENT_TYPES.HEADER_2,ge.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),e.append(new le("turnIntoOptionHeading3",e,h.transformBlock,O.ELEMENT_TYPES.HEADER_3,ge.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),e.append(new le("turnIntoOptionHeading4",e,h.transformBlock,O.ELEMENT_TYPES.HEADER_4,ge.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),n}static separator(e){return new ae(e)}static buttonGroup(){const e=new ce,t=de.create(h.toggleLink,"Link",ee.create(i.Link,J.large));t.setId(p.Link),t.appendTo(e);const n=de.create(h.toggleBold,"Bold",ee.create(i.Bold,J.large));n.setId(p.Bold),n.appendTo(e);const o=de.create(h.toggleItalic,"Italic",ee.create(i.Italic,J.large));o.setId(p.Italic),o.appendTo(e);const r=de.create(h.toggleUnderline,"Underline",ee.create(i.Underline,J.large));r.setId(p.Underline),r.appendTo(e);const l=de.create(h.toggleInlineCode,"Code",ee.create(i.InlineCode,J.large));l.setId(p.InlineCode),l.appendTo(e);const s=de.create(h.toggleStrikeThrough,"Strike-through",ee.create(i.StrikeThrough,J.large));return s.setId(p.Strikethrough),s.appendTo(e),e}static colorDropdown(){const e=new se(b.ColorTextOptionSelect),t=new Ae("colorTextButton",new ue("#FAF4D1").htmlElement,e),n=new ne(E.ColorTextOptionsMenu,t,e);e.append(new me(e,"Highlight"));const o=new le(C.BackgroundOptionRed,e,h.toggleHiliteColor,u.HiliteColorRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("hiliteColor");const i=new le(C.BackgroundOptionGreen,e,h.toggleHiliteColor,u.HiliteColorGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("hiliteColor");const r=new le(C.BackgroundOptionBlue,e,h.toggleHiliteColor,u.HiliteColorBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("hiliteColor");const l=new le(C.BackgroundOptionYellow,e,h.toggleHiliteColor,u.HiliteColorYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("hiliteColor");const s=new le(C.BackgroundOptionGrey,e,h.toggleHiliteColor,u.HiliteColorGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("hiliteColor");const a=new le(C.BackgroundOptionNone,e,h.toggleHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");a.addClass("hiliteColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),e.append(new me(e,"Text"));const c=new le("colorOptionRed",e,h.toggleForeColor,u.ForeColorRed,new ee("icon-material-format",J.large).htmlElement,"Red");c.addClass("foreColor");const d=new le("colorOptionGreen",e,h.toggleForeColor,u.ForeColorGreen,new ee("icon-material-format",J.large).htmlElement,"Green");d.addClass("foreColor");const m=new le("colorOptionBlue",e,h.toggleForeColor,u.ForeColorBlue,new ee("icon-material-format",J.large).htmlElement,"Blue");m.addClass("foreColor");const p=new le("colorOptionYellow",e,h.toggleForeColor,u.ForeColorYellow,new ee("icon-material-format",J.large).htmlElement,"Yellow");p.addClass("foreColor");const A=new le("colorOptionGrey",e,h.toggleForeColor,u.ForeColorGrey,new ee("icon-material-format",J.large).htmlElement,"Grey");A.addClass("foreColor");const g=new le("colorOptionNone",e,h.toggleForeColor,u.ForeColorInitial,new ee("icon-material-format",J.large).htmlElement,"None");return g.addClass("foreColor"),e.append(c),e.append(d),e.append(m),e.append(p),e.append(A),e.append(g),n}static moreOptionsDropdown(){const e=new ee("icon-material-more",J.large),t=new se("moreTextOptionSelect"),n=new Ae("moreTextOptionButton",e.htmlElement,t,!1),o=new ne("moreTextOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("copyOption",t,h.copySelected,null,ge.copy.htmlElement,"Copy","Ctrl+C")),t.append(new le("cutOption",t,h.cutSelected,null,ge.cut.htmlElement,"Cut","Ctrl+X")),t.append(new le("pasteOption",t,h.past,null,ge.paste.htmlElement,"Replace","Ctrl+V")),t.append(new le("duplicateOption",t,h.duplicateBlock,null,ge.duplicate.htmlElement,"Clone","Ctrl+D")),t.append(new le("resetOption",t,h.removeFormat,null,ge.eraser.htmlElement,"Reset Style","Ctrl+\\"));const i=new le("deleteOption",t,h.deleteBlock,null,ge.delete.htmlElement,"Delete","Shift+Del");return i.addCssClass("danger-option"),t.append(i),o}}const ge={paragraph:new ee("icon-material-format","1.25rem"),todo_list:new ee("icon-material-check-list-2",J.large),b_list:new ee("icon-wordpress-bulleted-list",J.large),n_list:new ee("icon-wordpress-numbered-list",J.large),code:new ee("icon-wordpress-code-mark",J.large),quote:new ee("icon-wordpress-quote",J.large),head1:new ee("icon-julia-head-1",J.large),head2:new ee("icon-julia-head-2",J.large),head3:new ee("icon-julia-head-3",J.large),head4:new ee("icon-julia-head-4",J.large),head5:new ee("icon-julia-head-5",J.large),head6:new ee("icon-julia-head-6",J.large),duplicate:new ee("icon-material-duplicate",J.large),delete:new ee("icon-material-trash",J.large),eraser:new ee("icon-material-clear",J.large),copy:new ee("icon-material-copy",J.large),cut:new ee("icon-material-cut",J.large),paste:new ee("icon-material-paste",J.large)};class be extends R{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No results",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}class Ee extends R{static id="quickMenu";blockOperationsService;currentFocusedMenuItem;menuSections;quickMenuEmpty;filterInput;static instance;focusStack;constructor(e,t){super({}),this.currentFocusedMenuItem=null,this.menuSections=new re,this.quickMenuEmpty=new be,this.blockOperationsService=e,this.focusStack=t,this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=Ee.id,e.style.zIndex=d.SlightlyImportant,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const t=document.createElement("div");return t.classList.add("block-options"),t.style.position="relative",e.appendChild(t),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){const e=D.Instance.resolve("IBlockOperationsService"),t=D.Instance.resolve("IFocusStack");return Ee.instance||(Ee.instance=new Ee(e,t)),Ee.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.focusStack.peek()?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let t=e;for(;t;){const n=t.value.menuItems.findFirst((e=>e.isVisible));if(n)return void this.switchVisualFocus(n);if(t=t.nextNode,t==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getPreviousSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}}else{let t=this.menuSections.findLast((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getNextSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}}else{let t=this.menuSections.findFirst((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{const e=document.activeElement;if(!e)return void console.error("Failed to display the quickMenu: no active element found. Please ensure an element is focused before attempting to display the quickMenu.");this.focusStack.push(e);const t=window.getSelection();if(!t||0===t.rangeCount)throw new Error("Nenhuma seleção encontrada");const n=t.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const o=this.htmlElement.offsetWidth;let i=n.left+window.scrollX;i+o>window.innerWidth&&(i=window.innerWidth-o-20),this.htmlElement.offsetHeight;let r=n.bottom+window.scrollY+10;this.htmlElement.style.left=`${i}px`,this.htmlElement.style.top=`${r}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.focusStack.peek()?.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.focusStack.peek()?.focus(),super.hide()}attachEvents(){document.addEventListener(c.emittedCommand,(e=>{const{command:t}=e.detail;t==h.transformBlock&&this.hide()})),document.addEventListener("keydown",(e=>{const t=P.findClosestAncestorOfActiveElementByClass("block");if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||!t)(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)&&(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)?!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey?this.isVisible&&"Backspace"===e.key?""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems()):!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||this.hide():(this.concatFilterInput(e.key),this.filterItems()):(e.preventDefault(),this.focusPreviousVisibleItem()):(e.preventDefault(),this.focusNextVisibleItem()):(e.preventDefault(),e.stopPropagation());else{if(e.target.closest(".ignore-quick-menu"))return;this.show()}})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if(this.isVisible&&"Enter"===e.key&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();const t=this.currentFocusedMenuItem?.value.blockType;t&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(t)}})),document.addEventListener(c.blockTypeChanged,(e=>{this.hide()}))}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:e}});document.dispatchEvent(t)}transformHtmlFocusedElementBeforeOpenQuickMenu(e){e&&this.emitCommandEvent(e)}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class fe extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(this.tail.setNext(t),t.setPrevious(this.tail),this.tail=t):(this.head=t,this.tail=t),this.length++}}class Be extends R{immediateParent;menuItems=new fe;constructor(e){super({title:e.title,classList:e.classList}),this.immediateParent=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const t=document.createElement("h2");return t.textContent=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((t=>{t.filterValue.toLocaleLowerCase().includes(e)||t.hide()})),this.menuItems.any((t=>t.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class ve extends R{_blockType;_filterValue;_immediateParent;constructor(e,t,n,o,i,r){super({title:t,description:n,iconId:o}),this._blockType=i,this._filterValue=r,this._immediateParent=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation","pointer","no-selection"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const t=document.createElement("div");t.classList.add("option-image");const n=new ee(this.props.iconId,"100%");t.appendChild(n.htmlElement),e.appendChild(t);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}get filterValue(){return this._filterValue}get immediateParent(){return this._immediateParent}get blockType(){return this._blockType}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}emitCommandEvent(){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:this.blockType}});document.dispatchEvent(e)}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this._immediateParent.menuItems.find(this);this._immediateParent.immediateParent.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.emitCommandEvent()}))}}class we{static build(){const e=Ee.getInstance(),t=new Be({quickMenuInstance:e,title:"Basic",classList:"basic-section"});t.appendQuickMenuItems([new ve(t,"Text","Start writing in plain text.","icon-material-format",O.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new ve(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",O.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",O.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list"),new ve(t,"Table","Organize data in rows and columns.","icon-material-table",O.ELEMENT_TYPES.TABLE,"table tr th"),new ve(t,"Callout","Emphasize key points with a callout box.",i.Callout,O.ELEMENT_TYPES.CALLOUT,"callout note spotlight"),new ve(t,"Code","Include a code snippet.","icon-wordpress-code-mark",O.ELEMENT_TYPES.CODE,"code script source markup"),new ve(t,"Quote","Highlight text as a quote.","icon-wordpress-quote",O.ELEMENT_TYPES.QUOTE,"quote blockquote citation quotation cite"),new ve(t,"Heading 2","Medium header for sections.","icon-julia-head-2",O.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(t,"Heading 3","Small header for subsections.","icon-julia-head-2",O.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(t,"Separator","Visually divide blocks.","icon-wordpress-separator",O.ELEMENT_TYPES.SEPARATOR,"separator divider rule line hr")]),e.append(t);const n=new Be({quickMenuInstance:e,title:"Media",classList:"media-section"});n.appendQuickMenuItems([new ve(n,"Image","Upload or embed an image.",i.Image2,O.ELEMENT_TYPES.IMAGE,"image figure photo illustration picture media upload"),new ve(n,"YouTube","Embed a YouTube video.",i.YouTube,"video","video embed youtube clip film movie tape")]),e.append(n);const o=new Be({quickMenuInstance:e,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new ve(o,"Heading 1","Large header for main topics.","icon-julia-head-1",O.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new ve(o,"Heading 2","Medium header for sections.","icon-julia-head-2",O.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(o,"Heading 3","Small header for subsections.","icon-julia-head-3",O.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",O.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new ve(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",O.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new ve(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",O.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),e.append(o);const r=new Be({quickMenuInstance:e,title:"List",classList:"list-section"});r.appendQuickMenuItems([new ve(r,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2",O.ELEMENT_TYPES.CHECK_LIST,"todo list task list checklist"),new ve(r,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",O.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(r,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",O.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list")]),e.append(r);const l=new Be({quickMenuInstance:e,title:"Embed",classList:"embed-section"});return l.appendQuickMenuItems([new ve(l,"GitHub Gist","Embed a GitHub Gist.",i.GitHub,"github-gist","code gist github snippet git"),new ve(l,"CodePen","Embed a CodePen web demo.",i.CodePen,"codepen","code codepen"),new ve(l,"Spotify","Embed a Spotify audio track.",i.Spotify,"spotify","mp3 sound audio music spotify track")]),e.append(l),e}}class ke extends R{constructor(e){super({value:e})}init(){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("h1");return t.setAttribute("contentEditable","true"),t.setAttribute("data-placeholder","Untitled"),this.props.value&&(t.textContent=this.props.value),e.appendChild(t),e}static create(e){return new ke(e)}}class Ie{static build(){return ke.create(window.editorConfig?.title)}}var ye,xe,Te,Se,Le,Me;!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight"}(ye||(ye={})),function(e){e.Column="Column",e.Row="Row",e.Cell="Cell",e.SelectedCells="SelectedCells"}(xe||(xe={}));class Ne{static addRow(e,t=null){const n=null!==t&&t>=0&&t<=e.rows.length?t:e.rows.length,o=e.insertRow(n),i=Array.from(e.rows).reduce(((e,t)=>Math.max(e,t.cells.length)),0);let r=[];for(let e=0;e{r.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static addColumn(e,t=null){const n=null!==t?t:void 0;let o=[];for(let t=0;t{o.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static isLastColumn(e,t){if(!e.contains(t))return!1;const n=t.parentElement;return t===n.cells[n.cells.length-1]}static isLastRow(e,t){return!!e.contains(t)&&t.parentElement===e.rows[e.rows.length-1]}static removeColumnByCell(e){if("td"!==e.tagName.toLowerCase()&&"th"!==e.tagName.toLowerCase())throw new Error("The provided element is not a table cell.");const t=e.parentElement.parentElement,n=e.cellIndex;for(let e=0;e=0;t--){const n=e.rows[t];for(let e=n.cells.length-1;e>=0;e--){const t=n.cells[e];if(t.isContentEditable)return t}}return null}static getFirstTableCell(e){for(let t=0;t{e.style.border=`1px double ${n}`}))}static moveFocusToBelowCell(e,t){const n=t.parentElement?.nextElementSibling;if(!n)return!1;const o=t.cellIndex,i=n.cells[o];return!(!i||!i.isContentEditable||(i.focus(),0))}}class qe extends R{constructor(){super({}),this.attachEvent()}init(){const e=document.createElement("div");return e.classList.add("content"),window.editorConfig,e.append(O.blockParagraph()),e}clearSelectionOnDrag(){document.addEventListener(a.Mousedown,(e=>{const t=e.target;let n;t&&(n=t.nodeType==Node.TEXT_NODE?t.parentElement:t,n&&n.closest(".drag-handler")&&window.getSelection()?.removeAllRanges())}))}attachEvent(){this.clearSelectionOnDrag(),this.reRenderPlaceholder(),document.addEventListener(a.Click,(e=>{document.querySelectorAll(".separator-selected").forEach((e=>{e.classList.remove("separator-selected"),e.removeAttribute("tabindex")}));let t=e.target;if(t&&t.closest(".separator-wrapper")){e.stopImmediatePropagation(),e.preventDefault();let n=t.closest(".separator-wrapper");n&&(n.classList.add("separator-selected"),n.setAttribute("tabindex","-1"),setTimeout((()=>{n.focus()}),50))}})),document.addEventListener(a.Blur,(e=>{const t=e.target;if(t instanceof HTMLElement&&t.closest(".separator-selected")){e.stopImmediatePropagation();const n=t.closest(".separator-selected");n.classList.remove("separator-selected"),n.removeAttribute("tabindex")}}),!0),document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),document.addEventListener(a.DOMContentLoaded,(function(){const e=document.querySelector(".johannes-editor");if(e){let t=e.querySelectorAll(".block");if(1==t.length){const e=t[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),document.addEventListener(a.Keydown,(e=>{"Enter"===e.key&&!e.shiftKey&&P.isEventTargetDescendantOf(e,"#johannesEditor .content-wrapper .title")&&(e.preventDefault(),document.dispatchEvent(new CustomEvent(c.pressedEnterOnTitle,{})))}),!0),document.addEventListener(a.Keydown,(async e=>{if(P.isEventTargetDescendantOf(e,".ignore-events")&&"Tab"!==e.key)return;const t=D.Instance.resolve("IQuickMenu"),n=D.Instance.resolve("ITableContextFloatingToolbar");if(!(e.ctrlKey||e.shiftKey||e.altKey))if(e.key!==A.Enter||e.shiftKey||t.isVisible||n.isVisible){if(e.key===A.Backspace){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();n&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithPreviousBlock}})))}}else if(e.key===A.Delete){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.classList.contains("johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();o&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithNextBlock}})))}}else if("ArrowRight"===e.key&&qe.isCursorAtEnd(e.target));else if("ArrowLeft"===e.key&&qe.isCursorAtStart(e.target));else if("ArrowDown"===e.key&&qe.isCursorOnLastLine());else if("ArrowUp"===e.key&&qe.isCursorOnFirstLine());else if("Tab"===e.key&&P.isEventTargetDescendantOf(e,".johannes-code")){e.preventDefault();const t="    ";document.execCommand("insertText",!1,t)}}else{e.preventDefault();const t=e.target.closest(".table-controller");if(t){const n=e.target.closest("td, th"),o=t.querySelector("table");return void(n&&(Ne.moveFocusToBelowCell(o,n)||document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.focusOnNextBlock}}))))}if(e.target.closest(".johannes-code"))return;e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.insertNew}}))}})),document.addEventListener(a.Blur,(e=>this.sanitizeElementEventHandler(e)),!0)}sanitizeElementEventHandler(e){const t=e.target;t instanceof HTMLElement&&"true"===t.contentEditable&&(console.log("lipou"),P.sanitizeContentEditable(t))}reRenderPlaceholder(){document.addEventListener(a.Input,(function(e){if(e.target instanceof HTMLElement){const t=e.target;if(t.isContentEditable&&t.hasAttribute("data-placeholder")){const e=t.getAttribute("data-placeholder");""===t.textContent?.trim()&&(t.setAttribute("data-placeholder",e||""),t.textContent="")}}}))}static isCursorAtEnd(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&0===o.startOffset}static isAtFirstVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!0),n.setStart(e,0),n.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!1),n.setEnd(e,e.childNodes.length),n.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const t=window.getSelection();if(!t.rangeCount)return Promise.resolve(!1);const n=t.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=t.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(n.top===i.top&&n.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return 0===t.startOffset&&t.startContainer===t.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return t.endOffset===t.endContainer.textContent?.length&&t.endContainer===t.commonAncestorContainer}static getInstance(){return D.Instance.resolve("IShortcutListeners"),D.Instance.resolve("ITableListeners"),new qe}}class He{static build(){return qe.getInstance()}}!function(e){e.Text="Text",e.Cell="Cell",e.Block="Block"}(Te||(Te={}));class Oe extends F{static id="tableFloatingToolbar";static instance;focusStack;selectedCells=[];actualFocusedCell=null;tableOperationsService;controller;selectionMode=Te.Text;selectionFlag=!1;selectedText="";constructor(e,t){if(Oe.instance)throw new Error("Use TableContextFloatingToolbar.getInstance() to get instance.");super(Oe.id),this.clearAndHide=this.clearAndHide.bind(this),this.htmlElement.style.zIndex=d.ModeratelyImportant,this.controller=new AbortController,this.focusStack=e,this.tableOperationsService=t,this.attachEvents()}attachEvents(){document.addEventListener(a.Mousedown,this.handleMouseDown.bind(this)),document.addEventListener(a.Mousemove,this.handleMouseMove.bind(this)),document.addEventListener(a.Mouseup,this.handleMouseUp.bind(this)),document.addEventListener(a.Keydown,this.handleStartSelectionInCellKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleCellSelectionContinuationOnKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleKeyDown.bind(this)),document.addEventListener(a.Keyup,this.handleKeyUp.bind(this)),this.attachUIEvent(),super.attachEvents()}handleMouseDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".figure-embed-container td")&&(console.log("MouseDown event on: ",e.target),e.stopImmediatePropagation(),this.controller.abort(),t!=this.actualFocusedCell&&this.hide(),this.clearAll(),this.addSelectedCell(t),this.selectionFlag=!0,this.selectionMode=Te.Text)}handleMouseMove(e){if(this.selectionFlag){const t=e.target.closest(g.TD);t&&(this.updateSelectionModeByMouseEvent(e),this.selectionMode==Te.Cell&&(e.stopImmediatePropagation(),e.preventDefault(),this.canHide&&this.hide(),this.addSelectedCell(t),document.getSelection()?.removeAllRanges()))}}handleMouseUp(e){this.selectedCells.length>0&&this.selectionFlag&&(this.resetSelectionState(),this.show())}handleKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.key!=A.Enter||e.shiftKey||e.ctrlKey||e.metaKey||e.altKey?e.key==A.Escape&&this.canHide&&!K.getInstance().isVisible&&setTimeout((()=>{this.canHide&&(e.stopImmediatePropagation(),this.clearAll(),this.hide())}),10):e.stopImmediatePropagation())}handleStartSelectionInCellKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.repeat||e.key!==A.Shift||(e.stopImmediatePropagation(),this.controller.abort(),this.selectionFlag=!0,this.selectionMode=Te.Text,this.addSelectedCell(t)))}handleCellSelectionContinuationOnKeyDown(e){if(this.selectionFlag){const t=e.target.closest(g.TD);if(t&&!t.matches(".gist td")&&this.selectionMode==Te.Cell&&e.shiftKey&&e.key.startsWith("Arrow")&&!e.repeat){e.stopImmediatePropagation(),e.preventDefault();const n=t.closest(g.TABLE),o=Ne.getNeighborCell(n,t,e.key);this.addSelectedCell(t),o&&this.addSelectedCell(o)}}}normalizeText(e){return e.replace(/\s+/g," ").trim()}updateTheSelectionModeByCurrentSelectionState(e){if(this.selectionFlag){const t=document.getSelection();if(t){const n=this.normalizeText(t.toString().trim()),o=e.target.closest(g.TD);if(o.matches(".gist td"))return;const i=this.normalizeText((o.textContent||"").trim()),{atStart:r,atEnd:l}=P.getSelectionTextInfo(o);""===i||n===this.selectedText.trim()&&(r||l)?(this.selectionMode=Te.Cell,this.selectedText="",this.canHide&&this.hide()):n&&(this.selectedText=n)}}}updateSelectionModeByMouseEvent(e){if(this.selectionFlag&&this.actualFocusedCell){const t=this.actualFocusedCell.getBoundingClientRect(),n=e.clientX,o=e.clientY;n>=t.left&&n<=t.right&&o>=t.top&&o<=t.bottom||(this.selectionMode=Te.Cell,this.canHide&&this.hide())}}handleKeyUp(e){e.target.closest(g.TD)&&(e.stopImmediatePropagation(),this.updateTheSelectionModeByCurrentSelectionState(e),e.key===A.Shift&&(this.resetSelectionState(),this.selectedCells.length>0&&this.show()))}addSelectedCell(e){if(0===this.selectedCells.length)return this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,void e.focus();this.selectedCells[this.selectedCells.length-1].closest("table")===e.closest("table")&&(-1===this.selectedCells.indexOf(e)?(this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,e.focus()):(this.actualFocusedCell=e,e.focus()))}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this))}handleCloseElementEvent(e){const t=e.detail;Oe.id==t.targetId&&this.clearAndHide()}show(){this.actualFocusedCell?(this.resetAbortController(),this.focusStack.push(this.actualFocusedCell),this.changeToolbarPositionToBeClosedTo(this.actualFocusedCell),this.processSelectionChangeEffects(),super.show(),this.actualFocusedCell.addEventListener(a.Blur,this.clearAndHide,{signal:this.controller.signal})):console.error("No focused cell found")}processSelectionChangeEffects(){G.emitResetActiveButtonsElementEvent("backgroundColor");const e={};e[u.BackgroundColorRed]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorRed),e[u.BackgroundColorGreen]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGreen),e[u.BackgroundColorBlue]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorBlue),e[u.BackgroundColorYellow]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorYellow),e[u.BackgroundColorGrey]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGrey),Object.entries(e).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("backgroundColor",e,"show")}))}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";const n=this.htmlElement.offsetWidth;let o=t.left+window.scrollX+0;o+n>window.innerWidth&&(o=window.innerWidth-n-20);const i=this.htmlElement.offsetHeight;let r=t.top+window.scrollY-i-10;r<0&&(r=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`}resetSelectionState(){this.selectionMode=Te.Text,this.selectionFlag=!1,this.selectedText=""}clearAll(){this.actualFocusedCell=null,document.querySelectorAll("td").forEach((e=>e.classList.remove("selected"))),this.selectedCells=[]}hide(){this.canHide&&super.hide()}clearAndHide(){this.clearAll(),this.hide()}resetAbortController(){this.controller=new AbortController}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("ITableOperationsService");return new Oe(e,t)}}class Re{static build(){const e=D.Instance.resolve("ITableOperationsService"),t=Oe.getInstance();return t.appendDropdown(Re.tableOptions(e)),t.appendSeparator(Re.separator("tableOperationsSeparator")),t.appendDropdown(Re.tableColorDropdown()),t}static tableOptions(e){const t=new se("tableOptionsSelect"),n=new Ae("tableOptions","Options",t),o=new ne("tableOptionsMenu",n,t);t.append(new me(t,"Insert Column")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnLeft,O.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnLeft,J.medium).htmlElement,"Left")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnRight,O.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnRight,J.medium).htmlElement,"Right")),t.append(new me(t,"Insert Row")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowAbove,O.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowAbove,J.medium).htmlElement,"Above")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowBelow,O.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowBelow,J.medium).htmlElement,"Below")),t.append(new me(t,"Remove"));const r=new le("turnIntoOptionText",t,h.removeColumn,O.ELEMENT_TYPES.PARAGRAPH,ee.create(i.deleteSweep,J.medium).htmlElement,"Column");r.addCssClass("danger-option"),t.append(r);const l=new le("turnIntoOptionTodoList",t,h.removeRow,O.ELEMENT_TYPES.CHECK_LIST,ee.create(i.deleteSweep,J.medium).htmlElement,"Row");return l.addCssClass("danger-option"),t.append(l),o}static tableColorDropdown(){const e=new se("colorTableOptionSelect"),t=new Ae("colorTableButton",new ue("#FAF4D1").htmlElement,e),n=new ne("tableColorOptionsMenu",t,e);e.append(new me(e,"Background"));const o=new le("backgroundOptionRed",e,h.toggleCellHiliteColor,u.HiliteColorRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("backgroundColor");const i=new le("backgroundOptionGreen",e,h.toggleCellHiliteColor,u.HiliteColorGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("backgroundColor");const r=new le("backgroundOptionBlue",e,h.toggleCellHiliteColor,u.HiliteColorBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("backgroundColor");const l=new le("backgroundOptionYellow",e,h.toggleCellHiliteColor,u.HiliteColorYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("backgroundColor");const s=new le("backgroundOptionGrey",e,h.toggleCellHiliteColor,u.HiliteColorGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("backgroundColor");const a=new le("backgroundOptionNone",e,h.toggleCellHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");return a.addClass("backgroundColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static separator(e){return new ae(e)}}class De{static async embedImage(e,t){const n=new URL(e);if(!await De.validateImage(n.toString()))throw new Error("invalid image");const o=this.createEmbedContainer(),i=document.createElement("img");i.src=n.toString(),i.alt="Embedded Image",i.style.maxWidth="100%",i.style.width="auto",i.style.height="auto",o.appendChild(i),o.classList.add(r.AlignToolClass),De.finalizeEmbed(o,[r.AlignToolClass,"fit-content","x-resizable"],t)}static validateImage(e){return new Promise(((t,n)=>{const o=new Image;o.onload=()=>{t(!0)},o.onerror=()=>{t(!1)},o.src=e}))}static embedGoogleSheet(e,t){const n=e.pathname.split("/")[3],o=De.createEmbedContainer(["embed-container"]),i=document.createElement("iframe"),r=encodeURIComponent(n);i.src=`https://docs.google.com/spreadsheets/d/e/${r}/pubhtml?widget=true&headers=false`,i.style.width="100%",i.style.height="450px",i.frameBorder="0",i.allowFullscreen=!0,o.appendChild(i),De.finalizeEmbed(o,["x-resizable"],t)}static embedYouTubeVideoAsIframe(e,t){const n=e.searchParams.get("v");if(n){const e=this.createEmbedContainer(["embed-container"]),o=document.createElement("iframe"),i=encodeURIComponent(n);o.src=`https://www.youtube.com/embed/${i}`,o.frameBorder="0",o.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",o.allowFullscreen=!0,e.appendChild(o),e.classList.add(r.AlignToolClass),this.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube video URL")}static embedYouTubeShortAsIframe(e,t){const n=e.pathname.split("/"),o=n[n.length-1];if(o){const e=De.createEmbedContainer(["embed-container"]),n=document.createElement("iframe"),i=encodeURIComponent(o);n.src=`https://www.youtube.com/embed/${i}`,n.frameBorder="0",n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,e.appendChild(n),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube Shorts URL")}static embedYouTubePlaylistAsIframe(e,t){const n=e.searchParams.get("list");if(n){const e=De.createEmbedContainer(["embed-container"]),o=encodeURIComponent(n),i=document.createElement("iframe");i.src=`https://www.youtube.com/embed/videoseries?list=${o}`,i.setAttribute("allowfullscreen","true"),e.appendChild(i),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube playlist URL")}static embedSpotifyContent(e,t,n){const o=e.pathname.split("/").pop(),i=this.createEmbedContainer(["embed-container"]);if(i.classList.add("spotify-embed",r.AlignToolClass),!o)return void console.error("contentId is empty");const l=encodeURIComponent(o),s=document.createElement("iframe");switch(s.classList.add("spotify-embed"),s.src=`https://open.spotify.com/embed/${n}/${l}`,s.frameBorder="0",s.setAttribute("scrolling","no"),n){case Se.SpotifyTrack:s.style.height="80px";break;case Se.SpotifyPlaylist:case Se.SpotifyShow:case Se.SpotifyEpisode:case Se.SpotifyArtist:s.style.height="380px";break;default:s.style.height="300px"}i.appendChild(s),this.finalizeEmbed(i,["x-resizable",r.AlignToolClass],t)}static async embedGistAsScript(e,t){const n=e.pathname.split("/").pop();if(!n)return void console.error("Invalid Gist ID");const o=document.createElement("div");o.classList.add("shadow-element");const i=De.createEmbedContainer(["gist-embed-container","figure-embed-container","ignore-text-floating-toolbar"]);i.style.minHeight="100px",i.style.width="100%",t.appendChild(i),i.appendChild(o);const r=o.attachShadow({mode:"open"}),l=`https://gist.github.com/${encodeURIComponent(n)}.js`,s=document.createElement("script");s.type="text/javascript",s.src=l,s.async=!0;const a=document.write;let c="";document.write=e=>{c+=e},s.onload=()=>{document.write=a;const e=document.createElement("div");e.innerHTML=c,Array.from(e.childNodes).forEach((e=>{r.appendChild(e)})),console.log("Gist loaded successfully")},s.onerror=()=>{document.write=a,console.error("Failed to load the Gist")},r.appendChild(s),De.finalizeEmbed(i,[],t)}static embedCodepenAsIframe(e,t){const n=e.pathname.split("/");if(n.length<4||""===n[1]||""===n[3])return void console.error("Invalid URL: Expected format /user/{username}/pen/{penId}");const o=n[1],i=n[3],r=encodeURIComponent(o),l=encodeURIComponent(i),s=De.createEmbedContainer(["embed-container"]),a=document.createElement("iframe");a.src=`https://codepen.io/${r}/embed/${l}?height=265&theme-id=light&default-tab=js,result`,a.style.border="none",a.style.height="100%",a.style.width="100%",a.style.overflow="visible",a.setAttribute("sandbox","allow-scripts allow-same-origin"),s.appendChild(a),De.finalizeEmbed(s,["y-resizable"],t);const c=new ResizeObserver((e=>{for(let t of e){const{height:e}=t.contentRect;a.style.height=`${e}px`}})),d=s.closest(".johannes-content-element");d&&(d.classList.add("overflow-hidden"),c.observe(d))}static createEmbedContainer(e=[]){const t=document.createElement("figure");return t.classList.add(...e),t}static finalizeEmbed(e,t=[],n){const o=n.closest(`.${l.ContentElement}`);if(o){for(o.classList.add(...t);o.firstChild;)o.removeChild(o.firstChild);o.appendChild(e);const n=o.closest(".block"),i=n?.querySelector(".block-toolbar-wrapper");i?.remove()}}static determineEmbedType(e){const t=new URL(e),n=t.hostname.toLowerCase(),o=t.pathname.toLowerCase();if(/^(?:.*\.)?spotify\.com$/.test(n)){if(o.includes("/track"))return Se.SpotifyTrack;if(o.includes("/playlist"))return Se.SpotifyPlaylist;if(o.includes("/artist"))return Se.SpotifyArtist;if(o.includes("/episode"))return Se.SpotifyEpisode;if(o.includes("/show"))return Se.SpotifyShow}else if(/^(?:.*\.)?(youtube\.com|youtu\.be)$/.test(n)){if(o.includes("/watch"))return t.searchParams.has("list")?Se.YouTubePlaylist:Se.YouTubeVideo;if(o.includes("/playlist"))return Se.YouTubePlaylist;if(o.includes("/shorts"))return Se.YouTubeShort}else{if("vimeo.com"===n)return Se.VimeoVideo;if("docs.google.com"===n&&o.includes("/spreadsheets"))return Se.GoogleSheet;if("twitter.com"===n)return Se.Tweet;if("google.com"===n&&o.includes("/maps"))return Se.GoogleMap;if("gist.github.com"===n)return Se.GitHubGist;if("gitlab.com"===n&&o.includes("/snippets"))return Se.GitLabSnippet;if("codepen.io"===n)return Se.CodePen}return null}}!function(e){e.SpotifyTrack="track",e.SpotifyPlaylist="playlist",e.SpotifyArtist="artist",e.SpotifyEpisode="episode",e.SpotifyShow="show",e.YouTubeVideo="video",e.YouTubePlaylist="playlist",e.YouTubeShort="short",e.VimeoVideo="video",e.GoogleSheet="sheet",e.Tweet="tweet",e.GoogleMap="map",e.GitHubGist="gist",e.GitLabSnippet="snippet",e.CodePen="pen"}(Se||(Se={}));class Pe extends R{id;focusStack;constructor(){const e="mediaInputter";super({id:e}),this.id=e,this.focusStack=D.Instance.resolve("IFocusStack"),this.attachEvents()}init(){const e=document.createElement("div");e.id=this.props.id,e.classList.add("tab-container","soft-box-shadow"),e.style.display="none",e.style.zIndex=d.ExtremelyImportant;const t=document.createElement("ul");t.classList.add("nav","nav-underline");const n=this.createNavItem("uploadTab","Upload",!0),o=this.createNavItem("embedTab","Embed");t.appendChild(n),t.appendChild(o);const i=document.createElement("div");i.classList.add("tab-content");const r=this.createUploadContent(),l=this.createEmbedContent();return i.appendChild(r),i.appendChild(l),e.appendChild(t),e.appendChild(i),e}createNavItem(e,t,n=!1){const o=document.createElement("li");o.classList.add("nav-item"),o.id=e;const i=document.createElement("a");return i.classList.add("nav-link"),i.innerText=t,o.appendChild(i),o}createUploadContent(){const e=document.createElement("div");e.id="uploadContent",e.classList.add("upload-content","content-data");const t=document.createElement("label");t.classList.add("blue-button"),t.innerText="Upload file";const n=document.createElement("div");return n.classList.add("text-info"),n.innerText="Maximum file size: 5MB",e.appendChild(t),e.appendChild(n),e}createEmbedContent(){const e=document.createElement("div");e.id="embedContent",e.classList.add("content-data","embed-content");const t=document.createElement("input");t.type="text";const n=document.createElement("button");return n.classList.add("blue-button"),n.innerText="Embed",e.appendChild(t),e.appendChild(n),n.addEventListener(a.Click,(()=>this.embedGeneric(t))),t.addEventListener(a.Keydown,(e=>{e.key==A.Enter&&this.embedGeneric(t)})),t.addEventListener(a.Focusin,(()=>this.resetInputBgColor(t))),e}resetInputBgColor(e){e.style.backgroundColor=""}async embedGeneric(e){const t=e.value,n=this.focusStack.peek(),i=n?.closest(`.${l.ContentElement}`)?.getAttribute("data-content-type");try{const e=new URL(t);if(!H.isValidUrl(e.toString()))throw new Error("Invalid URL");if(!n)return void console.error("not element found");if(i==o.Image)await De.embedImage(t,n);else if(i==o.Iframe){const o=De.determineEmbedType(t);switch(o){case Se.YouTubeVideo:De.embedYouTubeVideoAsIframe(e,n);break;case Se.YouTubePlaylist:De.embedYouTubePlaylistAsIframe(e,n);break;case Se.YouTubeShort:De.embedYouTubeShortAsIframe(e,n);break;case Se.SpotifyTrack:case Se.SpotifyPlaylist:case Se.SpotifyArtist:case Se.SpotifyEpisode:case Se.SpotifyShow:case Se.SpotifyPlaylist:De.embedSpotifyContent(e,n,o);break;case Se.GitHubGist:De.embedGistAsScript(e,n);break;case Se.CodePen:De.embedCodepenAsIframe(e,n);break;default:throw new Error("Unsupported")}}this.hide()}catch(e){const t=document.querySelector("#embedContent input");t&&(t.style.backgroundColor="rgb(253, 222, 222)",t.classList.add("shake-animation"),setTimeout((()=>{t.classList.remove("shake-animation")}),1e3))}}set inputValue(e){const t=this.htmlElement.querySelector("input");t&&(t.value=e)}get display(){return"flex"}attachEvents(){const e=this.htmlElement.querySelector("#uploadTab");e?.addEventListener("click",(()=>{this.setActiveTab("uploadTab","uploadContent")}));const t=this.htmlElement.querySelector("#embedTab");t?.addEventListener("click",(()=>{this.setActiveTab("embedTab","embedContent")})),document.addEventListener(a.Keydown,this.handlerKeydownEvents.bind(this)),document.addEventListener(a.Click,this.handlerClickEvents.bind(this)),super.attachUIEvent()}handlerKeydownEvents(e){e.key==A.Escape&&this.canHide&&this.hide()}handlerClickEvents(e){this.hideMediaInputterOnExternalClick(e),this.showMediaInputterOnMediaInputterElementClick(e)}hideMediaInputterOnExternalClick(e){const t=P.findClickedElementOrAncestorById(e,this.id),n=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(!t&&!n&&this.isVisible)return e.stopImmediatePropagation(),void this.hide()}showMediaInputterOnMediaInputterElementClick(e){const t=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(t)return e.stopImmediatePropagation(),e.preventDefault(),this.focusStack.push(t),void(this.isVisible?this.hide():this.show())}findClassWithSuffix(e,t){const n=new RegExp(`.*${t}$`);for(let t of e.classList)if(n.test(t))return t;return null}getTab(e){return document.getElementById(e)}getContent(e){return document.getElementById(e)}setActiveTab(e,t){document.querySelectorAll(".nav-item").forEach((e=>{e.classList.remove("active")})),document.querySelectorAll(".content-data").forEach((e=>{e.classList.remove("active")})),this.getTab(e)?.classList.add("active"),this.getContent(t)?.classList.add("active")}show(){const e=this.focusStack.peek(),t=e?.querySelector(`.${l.ShowMediaInputOnClick}`)||e?.closest(`.${l.ShowMediaInputOnClick}`);if(t){const e=this.findClassWithSuffix(t,"-embed-placeholder-text");e&&this.setInputPlaceholder(e)}if(e){const t=e.querySelector(`.${l.ShowMediaInputUpload}`)||e.closest(`.${l.ShowMediaInputUpload}`),n=this.htmlElement.querySelector("#uploadTab"),o=this.htmlElement.querySelector("#embedTab"),i=this.htmlElement.querySelector("#uploadContent"),r=this.htmlElement.querySelector("#embedContent");t&&n&&i?(n.style.display="inline",n.classList.add("active"),i.classList.add("active"),r.classList.remove("active"),o.classList.remove("active")):(n.style.display="none",n.classList.remove("active"),i.classList.remove("active"),r.classList.add("active"),o.classList.add("active"))}this.htmlElement.style.visibility="visible",e&&this.changeToolbarPositionToBeClosedTo(e),super.show();const n=document.querySelector("#embedContent input");n&&this.isElementVisible(n)&&(n.style.backgroundColor="white",setTimeout((()=>{n.focus()}),100))}setInputPlaceholder(e){const t=document.querySelector("#embedContent input");"image-embed-placeholder-text"!=e?"youtube-embed-placeholder-text"!=e?"spotify-embed-placeholder-text"!=e?"github-gist-embed-placeholder-text"!=e?"codepen-embed-placeholder-text"!=e?t.setAttribute("placeholder","Paste URL here..."):t.setAttribute("placeholder","https://codepen.io/..."):t.setAttribute("placeholder","https://gist.github.com/..."):t.setAttribute("placeholder","https://open.spotify.com/..."):t.setAttribute("placeholder","https://www.youtube.com/..."):t.setAttribute("placeholder","https://example.com/image.jpg")}isElementVisible(e){if(null===e.offsetParent)return!1;const t=e.getBoundingClientRect();return t.width>0&&t.height>0}hide(){this.inputValue="",super.hide()}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";let n=t.left+window.scrollX+t.width/2-this.htmlElement.offsetWidth/2,o=t.bottom+window.scrollY+10;this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${o}px`}}class Fe{static build(){return new Pe}}class Ve{static build(){return $.getInstance(Ie.build(),He.build(),te.build(),Ce.build(),we.build(),Re.build(),Fe.build())}}class _e{static instance;editor;constructor(e){if(_e.instance)throw new Error;this.editor=e,_e.instance=this}static build(){return _e.instance?_e.instance:new _e(Ve.build())}start(){return this.insertIcons(),this.editor}insertIcons(){if(!document.querySelector(".svg-icons-container")){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- \r\n \r\n --\x3e\r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n',e.className="svg-icons-container",document.body.appendChild(e)}}}class je{static instance=null;blockOperationsService;tableOperationsService;textOperationsService;constructor(e,t,n){if(je.instance)throw new Error("Attempt to instantiate singleton `CommandDispatcher` more than once.");this.blockOperationsService=e,this.textOperationsService=t,this.tableOperationsService=n}static getInstance(){const e=D.Instance.resolve("IBlockOperationsService"),t=D.Instance.resolve("ITextOperationsService"),n=D.Instance.resolve("ITableOperationsService");return je.instance||(je.instance=new je(e,t,n)),je.instance}listen(){document.addEventListener(c.emittedCommand,this.handleCommandEvent),document.addEventListener(c.pressedEnterOnTitle,(()=>this.blockOperationsService.createANewParagraphFromTitle()))}handleCommandEvent=e=>{const{command:t,showUI:n,value:o,targetBlockType:i,block:r,scope:l}=e.detail;switch(t){case h.linkReadyToInsert:if(!o)throw new Error(`${h.linkReadyToInsert} requires value`);this.textOperationsService.execInsertLink(o);break;case h.toggleLink:this.textOperationsService.execToggleLink();break;case h.toggleBold:this.textOperationsService.execBold();break;case h.toggleInlineCode:this.textOperationsService.execInlineCode();break;case h.toggleItalic:this.textOperationsService.execItalic();break;case h.toggleUnderline:this.textOperationsService.execUnderline();break;case h.toggleStrikeThrough:this.textOperationsService.execStrikeThrough();break;case h.toggleHiliteColor:if(!o)throw new Error(`${h.toggleHiliteColor} requires a color value`);this.textOperationsService.execHiliteColor(o);break;case h.toggleForeColor:if(!o)throw new Error(`${h.toggleForeColor} requires a color value`);this.textOperationsService.execForeColor(o);break;case h.transformBlock:if(!o)throw new Error(`${h.transformBlock} requires a value that represents the target element type.`);this.blockOperationsService.transformBlock(o,r);break;case h.duplicateBlock:this.blockOperationsService.execDuplicateBlock(r);break;case h.deleteBlock:this.blockOperationsService.execDeleteBlock(r);break;case h.deleteBlockAndFocusOnPrevious:this.blockOperationsService.execDeleteFocusOnPrevious();break;case h.deleteBlockAndFocusOnNext:this.blockOperationsService.execDeleteAndFocusOnNext();break;case h.focusOnNextBlock:this.blockOperationsService.execFocusOnNext();break;case h.removeFormat:this.execRemoveFormat(t);break;case h.JustifyLeft:if(!r)throw new Error(`${h.JustifyLeft} requires a block to justify.`);this.blockOperationsService.justifyLeft(r);break;case h.JustifyCenter:if(!r)throw new Error(`${h.JustifyCenter} requires a block to justify.`);this.blockOperationsService.justifyCenter(r);break;case h.JustifyRight:if(!r)throw new Error(`${h.JustifyRight} requires a block to justify.`);this.blockOperationsService.justifyRight(r);break;case h.changeCodeBlockLanguage:if(!r)throw new Error(`${h.changeCodeBlockLanguage} requires a block to change a code block language.`);if(!o)throw new Error(`${h.changeCodeBlockLanguage} requires a value to change a code block language.`);this.blockOperationsService.changeCodeBlockLanguage(r,o);break;case h.createDefaultBlock:this.execCreateDefaultBlock(t);break;case h.insertNew:this.execInsertNew(t);break;case h.focusOnPreviousBlock:this.execFocusOnPreviousBlock(t);break;case h.mergeWithNextBlock:this.blockOperationsService.execMergeWithNextBlock();break;case h.mergeWithPreviousBlock:this.blockOperationsService.execMergeWithPreviousBlock();break;case h.insertTableColumnLeft:this.tableOperationsService.insertColumnLeft();break;case h.insertTableColumnRight:this.tableOperationsService.insertColumnRight(r||null);break;case h.insertTableRowAbove:this.tableOperationsService.insertRowAbove();break;case h.insertTableRowBelow:this.tableOperationsService.insertRowBelow(r||null);break;case h.toggleCellHiliteColor:if(!o)throw new Error(`${h.toggleCellHiliteColor} requires a value that represents the cell background color.`);this.tableOperationsService.execCellBackgroundColor(o);break;case h.changeCalloutBackgroundColor:if(!r)throw new Error(`${h.changeCalloutBackgroundColor} requires a block.`);if(!o)throw new Error(`${h.changeCalloutBackgroundColor} requires a value that represents the background color.`);this.blockOperationsService.execChangeCalloutBackground(r,o);break;case h.removeColumn:this.tableOperationsService.removeColumn();break;case h.removeRow:case h.removeRow:this.tableOperationsService.removeRow();break;case h.changeTableBorderColor:this.tableOperationsService.changeTableBorderColor(l,o);break;default:console.error(`No action defined for command: ${t}`)}};execRemoveFormat(e){const t=this.blockOperationsService.execCommand(e,!1),n=P.getActiveContentEditable();return n&&n.normalize(),t}execCreateDefaultBlock(e){return this.blockOperationsService.execCommand(e,!1)}execInsertNew(e){return this.blockOperationsService.createNewElementAndSplitContent()}execFocusOnPreviousBlock(e){return this.blockOperationsService.execCommand(e,!1)}}class ze{static instance=null;constructor(){if(ze.instance)throw new Error("Use ShortcutListeners.getInstance() to get instance.");this.listen()}startListen(){console.log("listening keyboard shortcuts")}static getInstance(){return ze.instance?ze.instance:new ze}listen(){document.addEventListener("keydown",(e=>{console.log(`Key: ${e.key}, Code: ${e.code}, Ctrl: ${e.ctrlKey}, Alt: ${e.altKey}, AltGr: ${"AltGraph"===e.key}, NumLock: ${e.getModifierState("NumLock")}`);const t=e.code.startsWith("Numpad"),n=e.getModifierState("NumLock");(e.ctrlKey||e.metaKey)&&e.shiftKey&&"Enter"===e.key?(e.preventDefault(),e.stopPropagation(),alert("converto para paragrafo"),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.PARAGRAPH}}))):!e.ctrlKey&&!e.metaKey||e.altKey||"Digit1"!==e.code&&"Numpad1"!==e.code?!e.ctrlKey&&!e.metaKey||e.shiftKey||"."!==e.key?!e.ctrlKey&&!e.metaKey||e.shiftKey||"/"!==e.key?e.ctrlKey&&e.altKey&&("Digit1"===e.code||t&&n&&"Numpad1"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_1}}))):e.ctrlKey&&e.altKey&&("Digit2"===e.code||t&&n&&"Numpad2"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_2}}))):e.ctrlKey&&e.altKey&&("Digit3"===e.code||t&&n&&"Numpad3"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_3}}))):e.ctrlKey&&e.altKey&&("Digit4"===e.code||t&&n&&"Numpad4"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_4}}))):e.ctrlKey&&e.altKey&&("Digit5"===e.code||t&&n&&"Numpad5"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_5}}))):e.ctrlKey&&e.altKey&&("Digit6"===e.code||t&&n&&"Numpad6"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_6}}))):"D"!==e.key&&"d"!==e.key||!e.ctrlKey?"Delete"!==e.key&&"Backspace"!==e.key||!e.shiftKey?"\\"===e.key&&(e.ctrlKey||e.metaKey)?document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.removeFormat}})):e.ctrlKey&&e.altKey&&"Digit1"===e.code&&e.preventDefault():(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.duplicateBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.NUMBERED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.BULLETED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.CHECK_LIST}})))}))}}class Ye{static instance=null;focusStack;shownElements=new Map;constructor(e){if(Ye.instance)throw new Error("Use TableEventListeners.getInstance() to get instance.");this.focusStack=e,this.listen()}startListen(){console.log("listening table clicks")}static getInstance(){const e=D.Instance.resolve("IFocusStack");return Ye.instance?Ye.instance:new Ye(e)}listen(){document.addEventListener("click",(e=>{let t=null;if(t=e.target.nodeType==Node.TEXT_NODE?e.target.parentElement:e.target,t?.closest(".add-table-column")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableColumnRight,block:t.closest(".block")}});document.dispatchEvent(e)}if(t?.closest(".add-table-row")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableRowBelow,block:t.closest(".block")}});document.dispatchEvent(e)}}))}}class Ue{static instance;stack;capacity=10;constructor(){this.stack=[]}static getInstance(){return Ue.instance||(Ue.instance=new Ue),Ue.instance}push(e){this.stack.length>=this.capacity&&this.stack.shift(),this.stack.push(e)}peek(){return this.stack[this.stack.length-1]}clear(){this.stack=[]}}class Ge{static instance;elementFactoryService;memento;focusStack;constructor(e,t,n){if(Ge.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.focusStack=t,this.memento=n,Ge.instance=this}execCommand(e,t,n=null){if(e==h.copySelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();navigator.clipboard.writeText(t).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==h.cutSelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();e.deleteFromDocument(),navigator.clipboard.writeText(t).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==h.past)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const t=document.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents(),n.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==h.transformBlock&&this.getCurrentSelectedBlock()&&n&&this.transformBlock(n),e==h.removeFormat)return document.execCommand(h.removeFormat,!1);if(e==h.createDefaultBlock){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==h.focusOnFirstBlock){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==h.deleteBlockAndFocusOnPrevious)throw new Error("Remove all reference to this code");if(e==h.deleteBlockAndFocusOnNext)throw new Error("Remove all reference to this code");return!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(){const e=D.Instance.resolve("IElementFactoryService"),t=D.Instance.resolve("IFocusStack"),n=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ge(e,t,n)),this.instance}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t.closest(".block")}throw new Error}execMergeWithPreviousBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getPreviousContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(t),setTimeout((()=>{const n=P.saveCaretPosition2d(t);if(t.innerHTML=t.innerHTML+e.innerHTML,e.closest("li")){const t=e.closest("li");t&&t.remove()}else{const t=e.closest(".block");t&&t.remove()}const o={charIndex:n.charIndex+t.textContent.length,horizontalPos:n.horizontalPos};P.restoreCaretPosition2d(t,o)}),10)})))}execMergeWithNextBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getNextContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(e),setTimeout((()=>{const n=P.saveCaretPosition2d(e);if(e.innerHTML=e.innerHTML+t.innerHTML,e.closest("li")){const e=t.closest("li");e&&e.remove()}else{const e=t.closest(".block");e&&e.remove()}P.restoreCaretPosition2d(e,n)}),10)})))}execDuplicateBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock());const t=e.cloneNode(!0);t.querySelectorAll(".exclude-from-clone").forEach((e=>e.remove()));const n=e.nextSibling;e.parentNode?.insertBefore(t,n),t.id=`b-${H.generateUniqueId()}`;const o=new CustomEvent(c.blockCloned,{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}execDeleteBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock()),this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e);const t=new CustomEvent(c.blockDeleted,{bubbles:!0,cancelable:!0});return document.dispatchEvent(t),!0}transformBlock(e,t){let n;n=t?t.closest(".block"):this.focusStack.peek()?.closest(".block")||null,t||(t=P.findClosestAncestorOfActiveElementByClass(".block"));let o=n.querySelector(".swittable");this.focusStack.peek()?.focus(),P.removeFilterText(),this.memento.saveState();let i,r=o?.innerText,l=null;switch(e){case O.ELEMENT_TYPES.PARAGRAPH:{i=this.elementFactoryService.create(O.ELEMENT_TYPES.PARAGRAPH);const e=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&(i.innerHTML=e.innerHTML);break}case O.ELEMENT_TYPES.HEADER_1:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_1),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_2:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_2),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_3:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_3),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_4:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_4),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_5:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_5),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_6:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_6),i.innerText=r;break;case O.ELEMENT_TYPES.CODE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.CODE);break;case O.ELEMENT_TYPES.QUOTE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.QUOTE);break;case O.ELEMENT_TYPES.BULLETED_LIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.BULLETED_LIST,r);break;case O.ELEMENT_TYPES.NUMBERED_LIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.NUMBERED_LIST,r);break;case O.ELEMENT_TYPES.CHECK_LIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.CHECK_LIST,r);break;case O.ELEMENT_TYPES.SEPARATOR:i=this.elementFactoryService.create(O.ELEMENT_TYPES.SEPARATOR);break;case O.ELEMENT_TYPES.TABLE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.TABLE,",,");break;case O.ELEMENT_TYPES.IMAGE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.IMAGE,r),l=i;break;case O.ELEMENT_TYPES.VIDEO:i=this.elementFactoryService.create(O.ELEMENT_TYPES.VIDEO,r),l=i;break;case O.ELEMENT_TYPES.SPOTIFY:i=this.elementFactoryService.create(O.ELEMENT_TYPES.SPOTIFY,r),l=i;break;case O.ELEMENT_TYPES.GITHUB_GIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.GITHUB_GIST,r),l=i;break;case O.ELEMENT_TYPES.GITLAB_SNIPPET:i=this.elementFactoryService.create(O.ELEMENT_TYPES.GITLAB_SNIPPET,r),l=i;break;case O.ELEMENT_TYPES.CODEPEN:i=this.elementFactoryService.create(O.ELEMENT_TYPES.CODEPEN,r),l=i;break;case O.ELEMENT_TYPES.CALLOUT:{i=this.elementFactoryService.create(O.ELEMENT_TYPES.CALLOUT);const e=i.querySelector(".callout-text"),t=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&t&&(e.innerHTML=t.innerHTML);break}default:return void console.error("Unsupported type")}if(!i)return;n.replaceChild(i,o);const s=i.closest(".focusable")||n.querySelector(".focusable");if(s&&(s.focus(),P.placeCursorAtEndOfEditableElement(s)),l&&this.focusStack.push(l),"image"==e||"video"==e||"spotify"==e||"github-gist"==e||"gitlab-snippet"==e||"codepen"==e){const e=l?.querySelector(".content-placeholder");e&&(console.log("opaaaaaa"),this.focusStack.push(e)),G.emitShowElementEvent("mediaInputter")}const a=n?.querySelector(".block-toolbar-wrapper");a&&a.remove()}createNewElement(e){this.memento.saveState();const t=e.target.closest(".johannes-content-element");t&&t.classList.contains("list")?this.createListItem(t):this.createDefaultBlock(t)}createListItem(e){this.memento.saveState();let t=null,n=(document.activeElement,e.closest(".johannes-content-element"));n.classList.contains("checkbox-list")?t=this.elementFactoryService.create("checkboxItem",""):n.classList.contains("list")&&(t=this.elementFactoryService.create("listItem",""))}createNewElementAndSplitContent(){this.memento.saveState();const e=P.getContentTypeFromActiveElement();if(e==o.Table)return!1;if(e==o.CheckList||e==o.BulletedList||e==o.NumberedList){const e=P.findClosestAncestorOfActiveElementByClass("list-item");if(e&&P.hasTextContent(e)){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),o=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,o)}}else if(e){const t=e.closest(".block");if(t){const n=t.querySelectorAll(".list-item").length,o=O.blockParagraph();P.insertAfter(o,t),e.remove(),1==n&&t.remove();const i=o.querySelector("p");P.placeCursorAtStartOfEditableElement(i)}}}else{const e=P.findClosestAncestorOfActiveElementByClass("block");if(e){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),i=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,i),this.transformBlock(o.Paragraph,t)}const n=t.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(n)}}return!0}createANewParagraphFromTitle(){this.memento.saveState();const e=document.querySelector("#johannesEditor .title h1"),t=P.cloneAndInsertAfter(e);t&&P.rearrangeContentAfterSplit(e,t);const n=this.elementFactoryService.create(O.ELEMENT_TYPES.BLOCK_PARAGRAPH,""),o=n.querySelector(`.${l.ContentElement}`);o&&(o.innerHTML=t?.innerHTML||"");const i=document.querySelector("#johannesEditor .content");if(i){i.prepend(n);const e=n.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(e)}t?.remove()}createDefaultBlock(e){this.memento.saveState();const t=this.elementFactoryService.create(O.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");return e&&e.closest(".block")?e.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus(),this.focusStack.push(t),t}execFocusOnNext(){let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),!0)}execDeleteFocusOnPrevious(){this.memento.saveState();const e=document.activeElement;return this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0}execDeleteAndFocusOnNext(){this.memento.saveState();let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0)}focusOnPrevious(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[e.length-1],void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n));i=i.previousElementSibling}}getPreviousFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.previousElementSibling;if(!n)return null;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.previousElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[e.length-1],t;o=o.previousElementSibling}return t}focusOnNext(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[0],t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n;i=i.nextElementSibling}return n}getNextFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.nextElementSibling;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.nextElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[0],t;o=o.nextElementSibling}return t}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const t=e.closest(".block"),n=e.closest(".deletable");n?.remove(),t&&0==t.querySelectorAll(".editable").length&&t.remove()}applyCursorXEndPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),n.removeAllRanges(),n.addRange(o),e.focus())}applyCursorXStartPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus())}adjustCursorOffset(e,t){let n=document.createRange(),o=e,i=0,r=1/0;for(let o=0;on.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".block")}justifyLeft(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-left")}justifyCenter(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-center")}justifyRight(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-right")}changeCodeBlockLanguage(e,t){this.memento.saveState();const n=e.querySelector("code");n&&(P.removeClassesWithPrefix(n,"language-"),n.classList.add(`language-${t}`),n.removeAttribute("data-highlighted"),hljs.highlightElement(n),G.emitCodeBlockLanguageChangedEvent("code-block-language-menu",e.id,t))}removeJustify(e){const t=e.classList;for(let e=0;e div");n&&(P.removeClassesWithPrefix(n,"callout-background-"),n.classList.add(t))}}class Ke{static instance;memento;textOperationService;constructor(e){if(Ke.instance)throw new Error("Use TextOperationService.getInstance() to get instance.");this.memento=e}static getInstance(){const e=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ke(e)),this.instance}execInsertLink(e){this.memento.saveState(),document.execCommand("createLink",!1,e),setTimeout((()=>{G.emitChangeComponentColorEvent(p.Link,u.IconActiveBlue),this.normalizeAnchors()}),50)}normalizeAnchors(){document.querySelectorAll("#johannesEditor .content a").forEach((e=>{e.hasAttribute("title")||e.setAttribute("title",e.href),e.normalize()}))}execToggleLink(){this.queryAnchorCommandState()?(document.execCommand("unlink",!1),G.emitChangeComponentColorEvent("linkButton",u.IconDefaultBlack)):G.emitShowElementEvent("linkBox")}execBold(){this.memento.saveState(),document.execCommand("bold")&&(document.queryCommandState("bold")?G.emitChangeComponentColorEvent(p.Bold,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Bold,u.IconDefaultBlack))}execInlineCode(){this.memento.saveState(),this.toggleInlineCode()&&(this.queryInlineCodeCommandState()?G.emitChangeComponentColorEvent(p.InlineCode,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.InlineCode,u.IconDefaultBlack))}toggleInlineCode(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0);let n=t.extractContents(),o=!1;const i=document.createElement("span");i.appendChild(n.cloneNode(!0)),i.querySelector("code")&&(o=!0,i.querySelectorAll("code").forEach((e=>{const t=document.createTextNode(e.textContent||"");e.parentNode?.replaceChild(t,e)})),n=i);let r=e.anchorNode;for(;r&&"CODE"!==r.nodeName&&"BODY"!==r.nodeName;)r=r.parentNode;if(r&&"CODE"===r.nodeName){o=!0;const e=document.createTextNode(r.textContent||"");r.parentNode?.replaceChild(e,r)}if(o)t.insertNode(i);else{const e=document.createElement("code");e.appendChild(n),t.insertNode(e)}e.removeAllRanges(),e.addRange(t);const l=P.getActiveContentEditable();return l&&(l.normalize(),P.mergeInlineElements(l)),!0}execItalic(){this.memento.saveState(),document.execCommand("italic")&&(document.queryCommandState("italic")?G.emitChangeComponentColorEvent(p.Italic,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Italic,u.IconDefaultBlack))}execStrikeThrough(){this.memento.saveState(),document.execCommand("strikeThrough")&&(document.queryCommandState("strikeThrough")?G.emitChangeComponentColorEvent(p.Strikethrough,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Strikethrough,u.IconDefaultBlack))}execUnderline(){this.memento.saveState(),document.execCommand("underline")&&setTimeout((()=>{document.queryCommandState("underline")?G.emitChangeComponentColorEvent(p.Underline,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Underline,u.IconDefaultBlack)}),10)}execHiliteColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("hiliteColor"),document.execCommand("hiliteColor",!1,e)&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")}execForeColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("foreColor"),document.execCommand("foreColor",!1,e)&&G.emitShowHideActiveElementEvent("foreColor",e,"show")}queryCommandState(e,t){return e===h.toggleLink?this.queryAnchorCommandState():e===h.toggleUnderline?this.queryUnderlineCommandState():e===h.toggleHiliteColor?this.queryHiliteColor(t):e===h.toggleForeColor?this.queryForeColor(t):e===h.toggleInlineCode?this.queryInlineCodeCommandState():document.queryCommandState(e)}queryAnchorCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0),n=t.startContainer,o=t.endContainer,i=e=>{for(;e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE&&"a"===e.tagName.toLowerCase())return!0;e=e.parentNode}return!1};return!(!i(n)&&!i(o))||t.cloneContents().querySelectorAll("a").length>0}queryInlineCodeCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("code"))return!0;t=t.parentNode}return!1}queryUnderlineCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("u"))return!0;t=t.parentNode}return!1}queryForeColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return H.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryHiliteColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("span[style*='background-color']")||n.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return H.rgbToHex(i).toUpperCase()===e.toUpperCase()}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const t=[];for(let n=0;no.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&t.push(r)}}return t}findClosestMatchingParent(e,t){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const n=e;if(n.tagName.toLowerCase()===t.nodeType.toLowerCase()&&(!t.classes||t.classes.every((e=>n.classList.contains(e)))))return n}e=e.parentElement}return null}extractSelectedText(e){const t=window.getSelection();if(!t||0===t.rangeCount)return"";const n=t.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return n.intersectsNode(e)?(n.startContainer===e?i=n.startOffset:n.startContainer.contains(e)&&(i=0),n.endContainer===e?r=n.endOffset:n.endContainer.contains(e)&&(r=o.length),i{t.style.backgroundColor=e})),G.emitShowHideActiveElementEvent("backgroundColor",e,"show")):console.error("cell not found")}static isCellBackgroundColor(e,t){if(!e||"TD"!==e.tagName||!e.hasAttribute("data-placeholder"))return!1;const n=window.getComputedStyle(e).getPropertyValue("background-color");return H.rgbToHex(n).toUpperCase()===t.toUpperCase()}queryStateCellBackgroundColor(e){const t=Ne.getActiveTableCell();if(t){const n=window.getComputedStyle(t).getPropertyValue("background-color");return H.rgbToHex(n).toUpperCase()===e.toUpperCase()}return!1}queryAllStateCellBackgroundColor(e,t){let n=!0;return t!=u.BackgroundColorNone&&(e.forEach((e=>{const o=window.getComputedStyle(e).backgroundColor;H.rgbToHex(o).toLocaleLowerCase()!==t.toLocaleLowerCase()&&(n=!1)})),n)}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ze(e,t)),this.instance}insertRowAbove(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No cell is focused");const t=e.parentElement;if(!t)return void console.error("No row is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=n.querySelector("tbody")||n,i=Array.from(o.children).indexOf(t);i<0?console.error("Row index not found"):(Ne.addRow(n,i),G.emitCloseElementEvent(Le.TableToolbar))}insertRowBelow(e){if(this.memento.saveState(),e){const t=e.querySelector("table");if(!t)return void console.error("Table does not exist");{const e=t.querySelector("tr:last-child");if(!e)return void console.error("No rows in the table");{const n=Array.from(t.children[0].children).indexOf(e)+1;Ne.addRow(t,n)}}}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.parentElement,o=t.closest("table");if(!o)return void console.error("Table does not exist");if(n){const e=Array.from(o.children[0].children).indexOf(n)+1;Ne.addRow(o,e),G.emitCloseElementEvent(Le.TableToolbar)}}}insertColumnLeft(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o),G.emitCloseElementEvent(Le.TableToolbar)}insertColumnRight(e){if(this.memento.saveState(),e){const t=e.querySelector("table");t&&Ne.addColumn(t)}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o+1),G.emitCloseElementEvent(Le.TableToolbar)}}showInsertLineElement(e){e.querySelector(".add-table-row").style.visibility="visible"}showInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="visible"}hideInsertRowElement(e){e.querySelector(".add-table-row").style.visibility="hidden"}hideInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="hidden"}changeTableBorderColor(e,t){const n=this.focusStack.peek()?.closest(g.TABLE);n&&Ne.changeCellBorderColor(n,e,t)}}class We{static query="#johannesEditor .content-wrapper";static instance;undoStack=[];redoStack=[];get content(){return document.querySelector(We.query)}constructor(){if(We.instance)throw new Error("Use Memento.getInstance() to get instance.");this.attachEvents(),this.saveState()}saveState(){if(this.content){const e=this.content.cloneNode(!0);setTimeout((()=>{const t=P.saveCaretPosition3d(this.content);e.querySelectorAll(`.${l.EditorOnly}`).forEach((e=>e.remove())),this.undoStack.push({html:e.innerHTML,caretPosition:t}),this.redoStack=[]}),10)}}undo(){if(this.undoStack.length>1){this.redoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.undoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}redo(){if(this.redoStack.length>0){this.undoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.redoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}attachEvents(){document.addEventListener("keydown",(e=>{e.ctrlKey&&"z"===e.key?(this.undo(),e.preventDefault()):e.ctrlKey&&"y"===e.key&&(this.redo(),e.preventDefault())})),document.addEventListener(a.Keyup,(e=>{e.key==A.Space&&this.saveState()}))}static getInstance(){return We.instance||(We.instance=new We),We.instance}}!function(e){e.First="First",e.Last="Last"}(Me||(Me={}));class $e{static instance;quickMenu;constructor(e){document.addEventListener("keydown",this.handleArrowKeys.bind(this)),this.quickMenu=e}listen(){console.log("EditableNavigation is now listening for key events.")}static getInstance(){if(!$e.instance){const e=D.Instance.resolve("IQuickMenu");$e.instance=new $e(e)}return $e.instance}handleArrowKeys(e){if(!this.quickMenu.isVisible&&e.key.startsWith("Arrow")&&!e.altKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const t=document.activeElement;if(t&&t.isContentEditable&&this.shouldSwitchEditable(t,e.key)){const n=this.findNextEditable(t,e.key);n&&(e.preventDefault(),e.stopImmediatePropagation(),e.key!=ye.ArrowUp&&e.key!=ye.ArrowDown||this.placeCaretInSimilarPosition(t,n),e.key==ye.ArrowLeft&&P.placeCursorAtEndOfEditableElement(n),e.key==ye.ArrowRight&&P.placeCursorAtStartOfEditableElement(n),n.focus())}}}shouldSwitchEditable(e,t){const n=window.getSelection();if(n&&n.rangeCount>0){let e=n.getRangeAt(0);if(e.endOffset!=e.startOffset)return!1}if(n&&n.rangeCount>0){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(e),i=this.isAtLineBoundary(e,Me.First),r=this.isAtLineBoundary(e,Me.Last);return!!(t===ye.ArrowLeft&&n||t===ye.ArrowRight&&o||t===ye.ArrowUp&&(n||i)||t===ye.ArrowDown&&(o||r))}return!1}isAtLineBoundary(e,t){if(""===e.textContent?.trim())return!0;const n=window.getSelection();if(!n||0===n.rangeCount)return!1;const o=n.getRangeAt(0).getClientRects()[0];if(!o)return!0;const i=e.getBoundingClientRect();return t===Me.First?Math.abs(o.top-i.top)<11:t===Me.Last&&Math.abs(o.bottom-i.bottom)<11}findNextEditable(e,t){const n=Array.from(document.querySelectorAll('[contenteditable="true"]')),o=n.indexOf(e);if(e.closest("td")){const n=e.closest("table"),o=e.closest("td");if(n&&o){const e=Ne.getNeighborCell(n,o,t);if(e)return e}}let i=-1;return i=t===ye.ArrowLeft||t===ye.ArrowRight?t===ye.ArrowLeft?o-1:o+1:this.findVerticalEditableIndex(e,n,t),i<0||i>=n.length?null:n[i]||null}findVerticalEditableIndex(e,t,n){let o=t.indexOf(e);return n===ye.ArrowUp?o--:n===ye.ArrowDown&&o++,o>=0&&o0){const e=n.getRangeAt(0).getBoundingClientRect();n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;if(l){do{if(r&&r.nodeValue){o.setStart(r,0),o.setEnd(r,r.nodeValue.length);for(let t=0;tWe.getInstance())),D.Instance.register("IShortcutListeners",(()=>ze.getInstance())),D.Instance.register("ITableListeners",(()=>Ye.getInstance())),D.Instance.register("IFocusStack",(()=>Ue.getInstance())),D.Instance.register("IElementFactoryService",(()=>O.getInstance())),D.Instance.register("ITextOperationsService",(()=>Ke.getInstance())),D.Instance.register("ITableOperationsService",(()=>Ze.getInstance())),D.Instance.register("IBlockOperationsService",(()=>Ge.getInstance())),D.Instance.register("IQuickMenu",(()=>Ee.getInstance())),D.Instance.register("ITableContextFloatingToolbar",(()=>Oe.getInstance())),D.Instance.register("IEditableNavigation",(()=>$e.getInstance())),_e.build().start(),je.getInstance().listen(),$e.getInstance().listen(),pe.getInstance().listen()}))})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SyxTQUFTLHVCQUF1QixJQUFNZ3lDLEdBQW1CdHdDLGdCQUV0RmtsQyxHQUFVN2pCLFFBQVE4akIsUUFFbEJHLEdBQWtCdGxDLGNBQWNpcUIsU0FDaENxbUIsR0FBbUJ0d0MsY0FBY2lxQixTQUNqQ2IsR0FBYXBwQixjQUFjaXFCLFFBRS9CLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9hc3NldHMvY3NzL21haW4uY3NzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2pvaGFubmVzL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Db250ZW50VHlwZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0ljb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9Ub29sYm94T3B0aW9ucy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ29tbW9uQ2xhc3Nlcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ3VzdG9tVUlFdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RlZmF1bHRKU0V2ZW50cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ3VzdG9tRXZlbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9aSW5kZXgudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0NvbG9ycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9Db21tYW5kcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0J1dHRvbklEcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vS2V5Ym9hcmRLZXlzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25JdGVtSURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9ET01FbGVtZW50cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0Ryb3Bkb3duTGlzdElEcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0Ryb3Bkb3duTWVudUlEcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9hc3NldHMvY3NzL21haW4uY3NzPzFmYmEiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdXRpbGl0aWVzL1V0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9jb21tb24vQmFzZVVJQ29tcG9uZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvRE9NVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL0Zsb2F0aW5nVG9vbGJhci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQ29sb3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL1Nob3dIaWRlQWN0aXZlQnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9SZXNldEFjdGl2ZUJ1dHRvbnMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL0Nsb3NlRWxlbWVudC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0VsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL0V2ZW50RW1pdHRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2xpbmstYm94L0lucHV0TGlua0JveC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94V3JhcHBlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2VkaXRvci9FZGl0b3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9TaXplcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0FkZEJsb2NrQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0Jhc2VEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9KTm9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9CbG9ja1Rvb2xib3hCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9CbG9ja1Rvb2xib3gudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51RW1wdHkudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRG91Ymx5TGlua2VkTGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51SXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9RdWlja01lbnVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvdGl0bGUvVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGl0bGVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9EaXJlY3Rpb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1NlbGVjdGlvbk1vZGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9FbWJlZFRvb2wudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9Ub29sYmFySURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Cb3VuZGFyaWVzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3V0aWxpdGllcy9UYWJsZVV0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29udGVudC9Db250ZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0NvbnRlbnRCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvTWVkaWFJbnB1dHRlckJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvRWRpdG9yQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9VSUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9TaG9ydGN1dExpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0ZvY3VzU3RhY2sudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvTWVtZW50by50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0VkaXRhYmxlTmF2aWdhdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyoqIGN1cnNvciBzdHlsZSAqL1xuW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0ge1xuICAgIGN1cnNvcjogdGV4dCAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcCAhaW1wb3J0YW50O1xufVxuXG5cblxuLyoqIENTUyByZXNldCAqL1xuXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5cblxuLyoqIGFkZCBibG9jayAqL1xuLmFkZC1ibG9jayB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbi5hZGQtYmxvY2std3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qKiBhbmQgYWRkIGJsb2NrICovXG5cblxuXG4vKiogTGlzdCAgKiovXG4ubGlzdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMTBweDtcblxufVxuXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XG4gICAgbWFyZ2luLXRvcDogMC41cmVtO1xufVxuXG4ubGlzdCBsaSBkaXYge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG59XG5cbm9sLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCxcbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtICFpbXBvcnRhbnQ7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk+YnV0dG9uIHtcbiAgICAvKiBkaXNwbGF5OiBub25lOyAqL1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIHRvcDogMDtcblxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG5cbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTpob3Zlcj5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxufVxuXG5wLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQrc3BhbiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xuICAgIHBhZGRpbmctbGVmdDogMS41cmVtICFpbXBvcnRhbnQ7XG59ICovXG5cbi8qKiBBZGQgbGluZSB0aHJvdWdoIHRleHQgZGVjb3JhdGlvbiB0byBjaGVja2VkIGNoZWNrYm94ZXMgdGV4dCBkaXYgKi9cbi5ibG9jayBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtkaXYge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xufVxuXG4vKiogUmVtb3ZlIHRoZSBkZWZhdWx0IGxpc3Qgc3R5bGUgYW5kIHJlcGxhY2UgYnkgYW5vdGhlciB0aGF0IHdvcmtzIHdpdGggZGlzcGxheSBmbGV4ICovXG4uYmxvY2sgb2wsXG4uYmxvY2sgdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5ibG9jayB1bCAubGlzdC1pdGVtLFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxufVxuXG4uYmxvY2sgb2wgbGkge1xuICAgIGNvdW50ZXItaW5jcmVtZW50OiBpdGVtO1xufVxuXG4uYmxvY2sgb2wgbGk6OmJlZm9yZSB7XG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcIi5cIjtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC8qIHdpZHRoOiAxOHB4OyAqL1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cblxuLmJsb2NrIHVsIGxpOm5vdCgubm8tbGlzdC1zdHlsZSk6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCLigKJcIjtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC8qIHdpZHRoOiAxOHB4OyAqL1xufVxuXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XG4gICAgLyogd2lkdGg6IDE4cHg7ICovXG4gICAgbWFyZ2luLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cblxuLyoqIGFuZCBsaXN0ICoqL1xuXG5cblxuLmRyYWctaGFuZGxlciB7XG4gICAgY29sb3I6ICM4NDg4OGQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGN1cnNvcjogZ3JhYjtcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kcmFnLWhhbmRsZXItd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMDtcbiAgICB3aWR0aDogMDtcbn1cblxuXG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXG59XG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHVzZSB7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cbn1cblxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG59XG5cbi5ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xufVxuXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzO1xufVxuXG4vKiAuYmxvY2s6aG92ZXIgLmJsb2NrLXRvb2xiYXIge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59ICovXG5cbi5kcm9wLWxpbmUge1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODQ4ODhkO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG5cbi50aXRsZSBoMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcbiAgICBsaW5lLWhlaWdodDogM3JlbTtcbn1cblxuXG5bY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpmb2N1cyB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuaDFbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhkICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmZvY3VzOmJlZm9yZSB7fVxuXG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmhvdmVyOmJlZm9yZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmNpdGVbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpmb2N1czpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5saS5kaXZbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpob3ZlcjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbmgxIHtcbiAgICBmb250LXNpemU6IDIuNXJlbTtcbiAgICBmb250LXdlaWdodDogYm9sZGVyICFpbXBvcnRhbnQ7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3Ige1xuICAgIHdpZHRoOiAxMDAlO1xuXG59XG5cbi5jb250ZW50IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cbn1cblxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cblxuXG4vKiBwcmUge1xuICAgIHdpZHRoOiAxMDAlO1xufSAqL1xuXG5bY29udGVudGVkaXRhYmxlXSB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuYm9keSB7XG4gICAgLyogbWluLWhlaWdodDogMjAwMHB4OyAqL1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuXG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJOb3RvIFNhbnNcIiwgXCJMaWJlcmF0aW9uIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFwiQXBwbGUgQ29sb3IgRW1vamlcIiwgXCJTZWdvZSBVSSBFbW9qaVwiLCBcIlNlZ29lIFVJIFN5bWJvbFwiLCBcIk5vdG8gQ29sb3IgRW1vamlcIjtcbn1cblxuXG5cbi5lZGl0b3Ige1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXRvcDogODBweDtcbn1cblxucCB7XG4gICAgY29sb3I6ICMyNDI0MjQ7XG59XG5cblxuLmJsb2NrLFxuLmJsb2NrICoge1xuICAgIHVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xufVxuXG5cbiNqb2hhbm5lc0VkaXRvciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgaHIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMnB4O1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYig1NSwgNTMsIDQ3KTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZSB7XG4gICAgcGFkZGluZy10b3A6IDFyZW0gIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cblxuLmpvaGFubmVzLWVkaXRvciBjaXRlOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICfigJQgJztcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuI2xpbmtCb3gge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7ICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbiNsaW5rQm94IC5oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIDtcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gICAgLyogZm9udC1zaXplOiAwLjc1cmVtOyAqL1xuICAgIC8qIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNik7ICovXG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xufVxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDFyZW07XG4gICAgcGFkZGluZzogMjBweDtcbn1cblxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwgaW5wdXQge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cblxuLmN0cmwtYWN0aXZlIC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgYSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5cblxuXG4vKiAjbGlua0JveCB7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcblxuXG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xufVxuXG5cbiNsaW5rQm94IGlucHV0IHtcbiAgICB3aWR0aDogMzE2cHg7XG4gICAgcGFkZGluZzogOHB4IDQwcHggOHB4IDE2cHg7XG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTQ5NDk0O1xuICAgIGhlaWdodDogMjRweDtcblxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5cbiNsaW5rQm94IGlucHV0OjpzZWxlY3Rpb24sXG4jbGlua0JveCBpbnB1dDpmb2N1cyB7XG4gICAgYm9yZGVyLXJhZGl1czogbm9uZTtcbn0gKi9cblxuLyoqIHNvZnQtYm94LXNoYWRvdyBjbGFzcyAqL1xuLnNvZnQtYm94LXNoYWRvdyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJveC1zaGFkb3c6XG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgyMTYsIDE5NiwgMTk2LCAwLjAyKSxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcblxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XG59XG5cbi8qKiBhbmQgc29mdC1ib3gtc2hhZG93ICovXG5cblxuLyoqIHNlbGVjdGlvbi13cmFwcGVyIGNsYXNzICovXG4uc2VsZWN0LXdyYXBwZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICAgIHBhZGRpbmctbGVmdDogNXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgICB0b3A6IDIuMnJlbTtcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuMzEyNXJlbTtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuLFxuLnNlbGVjdC13cmFwcGVyIGJ1dHRvbiBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcbiAgICB3aWR0aDogMS4zNzVyZW07XG4gICAgaGVpZ2h0OiAxLjM3NXJlbTtcbiAgICBjb2xvcjogIzI0MjQyNDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4uc2VsZWN0LXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xufVxuXG4uc2VsZWN0LXdyYXBwZXI+YnV0dG9uIHtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjg1KTtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpPmgzIHtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMzczNTJmYTY7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XG59XG5cbi8qKiBlbmQgc2VsZWN0aW9uIHdyYXBwZXIgKiovXG5cblxuXG4vKiogVGV4dCBmb3JtYXR0aW5nIEJhciAqKi9cblxuXG5cbi5mbG9hdGluZy10b29sYmFyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0ge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMTBweDtcbn1cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcblxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgc2VsZWN0IHtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1zZWxlY3QtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuI3R1cm5JbnRvQnV0dG9uIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcblxufVxuXG4jdHVybkludG9CdXR0b24gc3ZnIHVzZSB7XG4gICAgbWFyZ2luOiBhdXRvO1xufVxuXG4vKiBjb2RlOm5vdChwcmUgY29kZSkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVmNDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDFhO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn0gKi9cblxuXG5cblxuLyogYTpub3QoW2hyZWZdKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcbn0gKi9cblxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcbiAgICBjb2xvcjogIzIzODJlMjtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICMyMzgyZTIgIWltcG9ydGFudDtcbn1cblxuXG5cbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ubW9yZVRleHRPcHRpb25XcmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuLmJnYy1yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRERFREU7XG59XG5cbi5iZ2MtZ3JlZW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XG59XG5cbi5iZ2MtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbn1cblxuLmJnYy15ZWxsb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQUY0RDE7XG59XG5cbi5iZ2MtZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcbn1cblxucCxcbm1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG4jdHVybkludG9TZWxlY3QgLm9wdGlvbi1pbWFnZSB7XG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xufVxuXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbn1cblxuXG5cblxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMzczNTJmYTY7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjMxMjVyZW07XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb24ge1xuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcbiAgICBtYXJnaW46IDAuMzEyNXJlbSAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG4gICAgZ2FwOiAwLjZyZW07XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuLm9wdGlvbi1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcbi5kYW5nZXItb3B0aW9uLm9wdGlvbi1mb2N1c2VkIHN2ZyB7XG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcbn1cblxuXG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuLyogLm9wdGlvbi1ob3Zlcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xufSAqL1xuXG4vKiAuc2VsZWN0LXdyYXBwZXI+YnV0dG9uLCAqL1xuXG4vKiAjdHVybkludG9CdXR0b24sXG4jY29sb3JUZXh0QnV0dG9uIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcbn0gKi9cblxuI2NvbG9yVGV4dEJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuNjI1cmVtO1xufVxuXG4jdHVybkludG9CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuI2NvbG9yVGV4dEJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXG4jbW9yZVRleHRPcHRpb25CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xufVxuXG5cblxuLm9wdGlvbltmb2N1c2VkPVwidHJ1ZVwiXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcbn1cblxuLm9wdGlvbi1pbWFnZSB7XG4gICAgd2lkdGg6IDIuODc1cmVtO1xuICAgIGhlaWdodDogMi44NzVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5vcHRpb24taW1hZ2UgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDIuODc1cmVtO1xuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xufVxuXG4ub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcGFkZGluZzogMC42MjVyZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG4ub3B0aW9uLXRleHQgKiB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbn1cblxuLm9wdGlvbi10ZXh0IC5ibG9jay10aXRsZSB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xufVxuXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXG5cblxuXG4vKiAjZGVsZXRlQmxvY2tCdXR0b246aG92ZXIgc3ZnLFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHtcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xufSAqL1xuXG5cblxuLmpvaGFubmVzLWVkaXRvciAqOjpzZWxlY3Rpb24ge1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxMCA3NSUgNTAlIC8gMSk7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXG4uam9oYW5uZXMtZWRpdG9yICo6bm90KGgxKSB7XG4gICAgbGluZS1oZWlnaHQ6IDEuNSAhaW1wb3J0YW50O1xufVxuXG4ub3B0aW9uIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbi50ZXh0LW9wdGlvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xufVxuXG5cblxuXG46cm9vdCB7XG4gICAgLyogZm9udC1zaXplOiAxNnB4OyAqL1xuICAgIC8qIFRhbWFuaG8gcGFkcsOjbyAqL1xufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBkZW5zaWRhZGUgbcOpZGlhICovXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDJkcHB4KSB7XG4gICAgOnJvb3Qge1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgIC8qIEF1bWVudGEgbyB0YW1hbmhvIGRhIGZvbnRlIHBhcmEgdGVsYXMgZGUgYWx0YSBkZW5zaWRhZGUgKi9cbiAgICB9XG59XG5cbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDNkcHB4KSB7XG4gICAgOnJvb3Qge1xuICAgICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICAgIC8qIEFpbmRhIG1haW9yIHBhcmEgdGVsYXMgZGUgZGVuc2lkYWRlIG11aXRvIGFsdGEgKi9cbiAgICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIG1heC13aWR0aDogaW5oZXJpdDtcbiAgICB3aWR0aDogYXV0bztcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbn1cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcbiAgICBtaW4taGVpZ2h0OiAyMHB4O1xufVxuXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XG4gICAgcGFkZGluZzogOHB4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xuICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgIG1heC13aWR0aDogMjAwcHg7XG4gICAgLyogYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OyAqL1xuXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xuXG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZC5zZWxlY3RlZCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZDpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggIzc0YjZkYiBpbnNldDtcbiAgICBib3JkZXI6IDFweCBkb3VibGUgIzc0YjZkYjtcblxufVxuXG50ZCB7XG4gICAgbWluLWhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxuXG50ZDo6cGxhY2Vob2xkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG50ZDplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi50YWJsZS13cmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRhYmxlLWNvbnRyb2xsZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbi5hZGQtdGFibGUtcm93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAxcmVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYWRkLXRhYmxlLWNvbHVtbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAtMS4zMTI1cmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XG4gICAgd2lkdGg6IDFyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFyZW0gLSA1cHgpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uYWRkLXRhYmxlLXJvdzpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLnRhYmxlLXNoZWxsIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cblxuXG4udGFibGUtb3B0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuXG4vKiogQ2FsbG91dCAqKi9cblxuLmNhbGxvdXQtd3JhcHBlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbn1cblxuLmNhbGxvdXQ6aG92ZXIgLm9wdGlvbnMtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4uY2FsbG91dCBwIHtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xuICAgIGJvcmRlci1jb2xvcjogI2U0YzhjODtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmVlbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcbiAgICBib3JkZXItY29sb3I6ICNjMmRlYzY7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbiAgICBib3JkZXItY29sb3I6ICNjM2Q1ZGQ7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQteWVsbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2RmO1xuICAgIGJvcmRlci1jb2xvcjogI2ZiZjVkNjtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmV5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2VjO1xuICAgIGJvcmRlci1jb2xvcjogI2U3ZTZlNjtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ub25lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XG5cbn1cblxuLyoqIGVuZCBjYWxsb3V0ICovXG5cblxuLyoqIG1lZGlhSW5wdXR0ZXIgKiovXG4ubWVkaWFJbnB1dHRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi8qKiBtZWRpYUlucHV0dGVyICoqL1xuXG5cbi5uby1zZWxlY3Rpb24ge1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5wb2ludGVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cblxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cblxuLnRhYi1jb250YWluZXIge1xuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xuXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XG5cblxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG5cbn1cblxuLm5hdi11bmRlcmxpbmUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi1yaWdodDogMTVweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1saW5rIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC41KTtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG59XG5cblxuLm5hdi1pdGVtLmFjdGl2ZSAubmF2LWxpbmsge1xuICAgIGNvbG9yOiAjMDAwO1xufVxuXG4udGFiLWNvbnRlbnQgLmNvbnRlbnQtZGF0YSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xufVxuXG4udGFiLWNvbnRlbnQgLmNvbnRlbnQtZGF0YS5hY3RpdmUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZ2FwOiAxcmVtO1xufVxuXG4udGFiLWNvbnRlbnQgLnRleHQtaW5mbyB7XG4gICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNik7XG59XG5cbi5uYXYtdW5kZXJsaW5lIC5uYXYtaXRlbSB7XG4gICAgZGlzcGxheTogaW5saW5lO1xufVxuXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG4gICAgaGVpZ2h0OiAxLjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmctbGVmdDogMTBweDtcbn1cblxuXG4udXBsb2FkLWNvbnRlbnQgbGFiZWwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogNHB4O1xuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAvKiB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7ICovXG59XG5cbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuLyogRXN0aWxvIHBhcmEgYXMgYWzDp2FzIGRlIHJlZGltZW5zaW9uYW1lbnRvICovXG4ucmVzaXplLWhhbmRsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbiAgICAvKiBDdXJzb3IgZGUgcmVkaW1lbnNpb25hbWVudG8gZGlhZ29uYWwgKi9cbn1cblxuLnJlc2l6ZS1oYW5kbGUuc2Uge1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbn1cblxuLnNwb3RpZnktZW1iZWQge1xuICAgIG1pbi1oZWlnaHQ6IDE1MnB4O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogLjc1cmVtICFpbXBvcnRhbnQ7XG59XG5cbi5naXN0LWVtYmVkIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLnNuaXBwZXQtZW1iZWQge1xuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogMTUwcHggIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uZW1iZWQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5lbWJlZC1jb250YWluZXIgaWZyYW1lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG5cbi5pZnJhbWUtd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG5cblxuLnZpZGVvLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG4gICAgaGVpZ2h0OiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi52aWRlby1jb250YWluZXIgaWZyYW1lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG5cblxuXG5cblxuXG4ueC1yZXNpemFibGUge1xuICAgIHJlc2l6ZTogaG9yaXpvbnRhbDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBjdXJzb3I6IG5lc3ctcmVzaXplO1xuICAgIG1pbi13aWR0aDogMjUwcHg7XG59XG5cbi55LXJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiB2ZXJ0aWNhbDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcbiAgICBtaW4taGVpZ2h0OiAxNTBweDtcbn1cblxuLmJhY2tncm91bmQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlN2U2ZTM7XG59XG5cblxuLmZpdC1jb250ZW50IHtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAuZW1iZWQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5tb3JlLW9wdGlvbnMtYnV0dG9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG5cbn1cblxuLmNvbnRleHQtbWVudSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMjBweDtcbiAgICByaWdodDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIHotaW5kZXg6IDEwO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5tb3JlLW9wdGlvbnMtYnV0dG9uOmFjdGl2ZSArIC5jb250ZXh0LW1lbnUsXG4ubW9yZS1vcHRpb25zLWJ1dHRvbjpmb2N1cyArIC5jb250ZXh0LW1lbnUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5cbi5iYmJ1dG9ue1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbn0gKi9cblxuXG4vKiogQmxvY2tUb29sYmFyIGNvbXBvbmVudCAqKi9cbi5ibG9jay10b29sYmFyLXdyYXBwZXIge1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgXG59XG5cbi5ibG9jay10b29sYmFyIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBnYXA6IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICAgIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4ycztcblxuICAgIHRvcDogNXB4O1xuICAgIHJpZ2h0OiA1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uYmxvY2stdG9vbGJhciAuaXRlbSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5ibG9jay10b29sYmFyIC5pdGVtIGJ1dHRvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLmJsb2NrLXRvb2xiYXIgYnV0dG9uIHtcbiAgICBjb2xvcjogYmxhY2s7XG59XG5cbi5ibG9jay10b29sYmFyIC5jb2xvci1pbnRlcmFjdGl2ZS1idXR0b24ge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4vKiogRW5kIEJsb2NrVG9vbGJhciBjb21wb25lbnQgKiovXG5cblxuXG4uanVzdGlmeS1sZWZ0IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG59XG5cbi5qdXN0aWZ5LWNlbnRlciB7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5qdXN0aWZ5LXJpZ2h0IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHJpZ2h0O1xufVxuXG5cbi5oaWRkZW4ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50O1xufVxuXG5cblxuXG5maWd1cmUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG5cbi5vdmVyZmxvdy1oaWRkZW4ge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qKiBJbmxpbmUgQ29kZSAqKi9cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgY29kZTpub3QocHJlIGNvZGUpIHtcbiAgICBmb250LXNpemU6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzdhO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xufVxuXG4vKiogQ29udGVudCBwbGFjZWhvbGRlciAqL1xuXG4uY29udGVudC1wbGFjZWhvbGRlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IDVweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmNvbnRlbnQtcGxhY2Vob2xkZXIgLmljb24td3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbi1yaWdodDogOHB4O1xufVxuXG5cbi8qIGVuZCBDb250ZW50IHBsYWNlaG9sZGVyICovXG5cblxuXG4vKiogQ29kZSAqKi9cblxucHJlIHtcbiAgICBtYXJnaW46IDA7XG59XG5cbnByZSBjb2RlIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5pZ25vcmUtZXZlbnRzIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jb2RlLWJsb2NrIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jb2RlLWJsb2NrIHNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uY29kZS1ibG9jayBzZWxlY3Qge1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcGFkZGluZzogNHB4IDhweDtcbiAgICBmb250OiBpbmhlcml0O1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMTBweCBjZW50ZXI7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5jb2RlLWJsb2NrOmhvdmVyIHNlbGVjdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cblxuXG4uY29kZS1ibG9jayBjb2RlIHtcbiAgICBmb250LXNpemU6IDFyZW07XG5cbn1cblxuXG5cbkBrZXlmcmFtZXMgc2hha2Uge1xuXG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgICB9XG5cbiAgICAyNSUsXG4gICAgNzUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01cHgpO1xuICAgIH1cblxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1cHgpO1xuICAgIH1cbn1cblxuLnNoYWtlLWFuaW1hdGlvbiB7XG4gICAgYW5pbWF0aW9uOiBzaGFrZSAwLjZzIGN1YmljLWJlemllciguMzYsIC4wNywgLjE5LCAuOTcpIGJvdGg7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgcGVyc3BlY3RpdmU6IDEwMDBweDtcbn1cblxuLmJsdWUtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIiMyMzgzZTJcIjtcbiAgICBjb2xvcjogXCJ3aGl0ZVwiO1xuICAgIGJvcmRlcjogXCJub25lXCI7XG4gICAgcGFkZGluZzogXCIzcHhcIjtcbiAgICBib3JkZXItcmFkaXVzOiBcIjVweFwiO1xuICAgIGZvbnQtd2VpZ2h0OiBcIjUwMFwiO1xufVxuXG5cbi5ibG9jay1zZWxlY3RlZCB7XG4gICAgLyogYm9yZGVyOiAycHggZGFzaGVkIHJlZDsgKi9cbn1cblxuLnNlcGFyYXRvciB7XG4gICAgLyogcGFkZGluZzogMTBweCAwOyAqL1xufVxuXG5cbi5zZXBhcmF0b3Itd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC8qIGhlaWdodDogNTBweDsgKi9cbn1cblxuLnNlcGFyYXRvciB7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbn1cblxuLyogLnNlcGFyYXRvcjo6YmVmb3JlLFxuLnNlcGFyYXRvcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZmxleC1ncm93OiAxO1xufSAqL1xuXG5cblxuLnNlcGFyYXRvci13cmFwcGVyIGhyIHtcbiAgICAvKiBPdXRyb3MgZXN0aWxvcyAqL1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICAvKiBSZW1vdmEgZXN0YSBsaW5oYSBzZSBlc3RpdmVyIHByZXNlbnRlICovXG59XG5cbi5zZXBhcmF0b3Itd3JhcHBlciBocjpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uc2VwYXJhdG9yLXNlbGVjdGVkIHtcbiAgICAvKiBvdXRsaW5lOiAycHggc29saWQgYmx1ZTsgKi9cbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxMCA3NSUgNTAlIC8gMSk7XG59XG5cblxuLnNlcGFyYXRvci1zZWxlY3RlZCBociB7XG4gICAgLyogb3V0bGluZTogMnB4IHNvbGlkIGJsdWU7ICovXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgd2hpdGUgIWltcG9ydGFudDsgKi9cblxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpOyAqL1xuICAgIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcblxuXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvYXNzZXRzL2Nzcy9tYWluLmNzc1wi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QUFFQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0lBQ3hCLHNDQUFzQztBQUMxQzs7O0FBR0E7SUFDSSw2QkFBNkI7SUFDN0Isd0NBQXdDOztJQUV4Qyw0Q0FBNEM7SUFDNUMsdUJBQXVCO0lBQ3ZCLDhCQUE4Qjs7O0FBR2xDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKiBjdXJzb3Igc3R5bGUgKi9cXG5bY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl0ge1xcbiAgICBjdXJzb3I6IHRleHQgIWltcG9ydGFudDtcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbi8qKiBDU1MgcmVzZXQgKi9cXG5cXG4uYnV0dG9uLXJlc2V0IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICBmb250OiBpbmhlcml0O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBpbmhlcml0O1xcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogaW5oZXJpdDtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbn1cXG5cXG5cXG5cXG4vKiogYWRkIGJsb2NrICovXFxuLmFkZC1ibG9jayB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbn1cXG5cXG4uYWRkLWJsb2NrLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcXG59XFxuXFxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4vKiogYW5kIGFkZCBibG9jayAqL1xcblxcblxcblxcbi8qKiBMaXN0ICAqKi9cXG4ubGlzdCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGdhcDogMTBweDtcXG5cXG59XFxuXFxuLmxpc3QtaXRlbS1jaGVja2FibGUgaW5wdXQge1xcbiAgICBtYXJnaW4tdG9wOiAwLjVyZW07XFxufVxcblxcbi5saXN0IGxpIGRpdiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50LFxcbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIHRvcDogMDtcXG5cXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcblxcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcblxcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOjpiZWZvcmUge1xcbiAgICBtYXJnaW4tbGVmdDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOmhvdmVyPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXFxufVxcblxcbnAuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB1bC5jaGVja2JveC1saXN0IGlucHV0W3R5cGU9XFxcImNoZWNrYm94XFxcIl06Y2hlY2tlZCtzcGFuIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxcbm9sLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpIHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxLjVyZW0gIWltcG9ydGFudDtcXG59ICovXFxuXFxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xcbi5ibG9jayBpbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdOmNoZWNrZWQrZGl2IHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cXG4uYmxvY2sgb2wsXFxuLmJsb2NrIHVsIHtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuXFxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXG5cXG59XFxuXFxuLmJsb2NrIG9sIGxpIHtcXG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGl0ZW07XFxufVxcblxcbi5ibG9jayBvbCBsaTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcXFwiLlxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xcbn1cXG5cXG4uYmxvY2sgdWwgbGk6bm90KC5uby1saXN0LXN0eWxlKTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIuKAolxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG59XFxuXFxuLmxpc3QtaXRlbS1jaGVja2FibGUgaW5wdXQge1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG4gICAgbWFyZ2luLXJpZ2h0OiAwLjMxMjVyZW07XFxufVxcblxcblxcbi8qKiBhbmQgbGlzdCAqKi9cXG5cXG5cXG5cXG4uZHJhZy1oYW5kbGVyIHtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gICAgY3Vyc29yOiBncmFiO1xcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcXG4gICAgcGFkZGluZy10b3A6IDAuMzNyZW07XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLmRyYWctaGFuZGxlci13cmFwcGVyIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIHdpZHRoOiAwO1xcbn1cXG5cXG5cXG5cXG4uZHJhZy1oYW5kbGVyIHN2ZyB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlciBzdmcgdXNlIHtcXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEuMjVyZW0gIWltcG9ydGFudDtcXG59XFxuXFxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxufVxcblxcbi8qIC5ibG9jazpob3ZlciAuYmxvY2stdG9vbGJhciB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxufSAqL1xcblxcbi5kcm9wLWxpbmUge1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NDg4OGQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG4udGl0bGUgaDEge1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbiAgICBsaW5lLWhlaWdodDogM3JlbTtcXG59XFxuXFxuXFxuW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOmVtcHR5OmZvY3VzIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuaDFbZGF0YS1wbGFjZWhvbGRlcl06Zm9jdXM6YmVmb3JlIHt9XFxuXFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuY2l0ZVtjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmZvY3VzOmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmxpLmRpdltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuaDEge1xcbiAgICBmb250LXNpemU6IDIuNXJlbTtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuXFxufVxcblxcbi5jb250ZW50IHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcXG4gICAgb3ZlcmZsb3cteDogYXV0bztcXG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xcbn1cXG5cXG5cXG4vKiBwcmUge1xcbiAgICB3aWR0aDogMTAwJTtcXG59ICovXFxuXFxuW2NvbnRlbnRlZGl0YWJsZV0ge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG5ib2R5IHtcXG4gICAgLyogbWluLWhlaWdodDogMjAwMHB4OyAqL1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG5cXG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBcXFwiTm90byBTYW5zXFxcIiwgXFxcIkxpYmVyYXRpb24gU2Fuc1xcXCIsIEFyaWFsLCBzYW5zLXNlcmlmLCBcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgU3ltYm9sXFxcIiwgXFxcIk5vdG8gQ29sb3IgRW1vamlcXFwiO1xcbn1cXG5cXG5cXG5cXG4uZWRpdG9yIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgbWFyZ2luLXRvcDogODBweDtcXG59XFxuXFxucCB7XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbn1cXG5cXG5cXG4uYmxvY2ssXFxuLmJsb2NrICoge1xcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xcbn1cXG5cXG5cXG4jam9oYW5uZXNFZGl0b3Ige1xcbiAgICB3aWR0aDogNjAlO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGhyIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMnB4O1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGJsb2NrcXVvdGUge1xcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgcmdiKDU1LCA1MywgNDcpO1xcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGNpdGUge1xcbiAgICBwYWRkaW5nLXRvcDogMXJlbSAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcblxcbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJ+KAlCAnO1xcbn1cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4jbGlua0JveCB7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxufVxcblxcbiNsaW5rQm94IC5oZWFkZXIge1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgO1xcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxuICAgIC8qIGZvbnQtc2l6ZTogMC43NXJlbTsgKi9cXG4gICAgLyogY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTsgKi9cXG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xcbn1cXG5cXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBnYXA6IDFyZW07XFxuICAgIHBhZGRpbmc6IDIwcHg7XFxufVxcblxcblxcbiNsaW5rQm94IC5saW5rLWJveC1zaGVsbCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4uY3RybC1hY3RpdmUgLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBhIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5cXG5cXG5cXG4vKiAjbGlua0JveCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgcGFkZGluZzogMjBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG5cXG5cXG4gICAgYm94LXNoYWRvdzpcXG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcXG5cXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICB6LWluZGV4OiA5OTk5OTk7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XFxufVxcblxcblxcbiNsaW5rQm94IGlucHV0IHtcXG4gICAgd2lkdGg6IDMxNnB4O1xcbiAgICBwYWRkaW5nOiA4cHggNDBweCA4cHggMTZweDtcXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk0OTQ5NDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcblxcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuXFxuI2xpbmtCb3ggaW5wdXQ6OnNlbGVjdGlvbixcXG4jbGlua0JveCBpbnB1dDpmb2N1cyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XFxufSAqL1xcblxcbi8qKiBzb2Z0LWJveC1zaGFkb3cgY2xhc3MgKi9cXG4uc29mdC1ib3gtc2hhZG93IHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XFxuICAgIGJveC1zaGFkb3c6XFxuICAgICAgICAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpLFxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDIxNiwgMTk2LCAxOTYsIDAuMDIpLFxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxcbiAgICAgICAgMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7XFxuXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XFxufVxcblxcbi8qKiBhbmQgc29mdC1ib3gtc2hhZG93ICovXFxuXFxuXFxuLyoqIHNlbGVjdGlvbi13cmFwcGVyIGNsYXNzICovXFxuLnNlbGVjdC13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xcbiAgICB0b3A6IDIuMnJlbTtcXG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcXG4gICAgcGFkZGluZy1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDAuNjI1cmVtO1xcbiAgICBwYWRkaW5nOiAwLjE4NzVyZW0gMC4zMTI1cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAwLjE4NzVyZW07XFxuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHNwYW4sXFxuLnNlbGVjdC13cmFwcGVyIGJ1dHRvbiBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDEuMzc1cmVtO1xcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgY29sb3I6ICM0ZjRmNGY7XFxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiB7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuODUpO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbn1cXG5cXG4vKiogZW5kIHNlbGVjdGlvbiB3cmFwcGVyICoqL1xcblxcblxcblxcbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xcblxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG5cXG4uZmxvYXRpbmctdG9vbGJhciAuaXRlbSB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMTBweDtcXG59XFxuXFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcXG5cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHNlbGVjdCB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b24gc3BhbiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAwLjlyZW07XFxuXFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcXG4gICAgbWFyZ2luOiBhdXRvO1xcbn1cXG5cXG4vKiBjb2RlOm5vdChwcmUgY29kZSkge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZjQ7XFxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAxYTtcXG4gICAgcGFkZGluZzogMCAzcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn0gKi9cXG5cXG5cXG5cXG5cXG4vKiBhOm5vdChbaHJlZl0pIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcXG59ICovXFxuXFxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcXG4gICAgY29sb3I6ICMyMzgyZTI7XFxufVxcblxcbi50ZXh0LWZvcm1hdHRpbmctY2lyY2xlLWFjdGl2ZSB7XFxuICAgIGJvcmRlci1jb2xvcjogIzIzODJlMiAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4jbW9yZVRleHRPcHRpb25TZWxlY3Qge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5tb3JlVGV4dE9wdGlvbldyYXBwZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcblxcbi5iZ2MtcmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZEREVERTtcXG59XFxuXFxuLmJnYy1ncmVlbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XFxufVxcblxcbi5iZ2MtYmx1ZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEOUVERjY7XFxufVxcblxcbi5iZ2MteWVsbG93IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZBRjREMTtcXG59XFxuXFxuLmJnYy1ncmV5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcXG59XFxuXFxucCxcXG5tYXJrIHtcXG4gICAgbGluZS1oZWlnaHQ6IDE7XFxufVxcblxcbiN0dXJuSW50b1NlbGVjdCAub3B0aW9uLWltYWdlIHtcXG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xcbn1cXG5cXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xcbiAgICB3aWR0aDogMjRweDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbn1cXG5cXG5cXG5cXG5cXG4vKiogQmxvY2sgT3B0aW9ucyAqKi9cXG5cXG4uYmxvY2stb3B0aW9ucy13cmFwcGVyIHtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMge1xcbiAgICBwYWRkaW5nOiAwIDAuNjI1cmVtO1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XFxuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcXG4gICAgbWFyZ2luOiAwLjMxMjVyZW0gMDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxuICAgIGdhcDogMC42cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuICAgIGJvcmRlcjogaW5oZXJpdDtcXG59XFxuXFxuLm9wdGlvbi1mb2N1c2VkIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBub25lO1xcbn1cXG5cXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xcbiAgICBjb2xvcjogI0VCNTc1NyAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufSAqL1xcblxcbi8qIC5zZWxlY3Qtd3JhcHBlcj5idXR0b24sICovXFxuXFxuLyogI3R1cm5JbnRvQnV0dG9uLFxcbiNjb2xvclRleHRCdXR0b24ge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcXG59ICovXFxuXFxuI2NvbG9yVGV4dEJ1dHRvbiB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcXG59XFxuXFxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jY29sb3JUZXh0QnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jbW9yZVRleHRPcHRpb25CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcblxcbi5vcHRpb25bZm9jdXNlZD1cXFwidHJ1ZVxcXCJdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcXG59XFxuXFxuLm9wdGlvbi1pbWFnZSB7XFxuICAgIHdpZHRoOiAyLjg3NXJlbTtcXG4gICAgaGVpZ2h0OiAyLjg3NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIGltZyB7XFxuICAgIG1heC13aWR0aDogMi44NzVyZW07XFxuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHN2ZyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgcGFkZGluZzogMC42MjVyZW07XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAqIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLXRpdGxlIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbn1cXG5cXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuXFxuXFxuLyogI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHN2ZyxcXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIge1xcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xcbn0gKi9cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXFxuLmpvaGFubmVzLWVkaXRvciAqOm5vdChoMSkge1xcbiAgICBsaW5lLWhlaWdodDogMS41ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5vcHRpb24ge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbi50ZXh0LW9wdGlvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMC42MjVyZW07XFxufVxcblxcblxcblxcblxcbjpyb290IHtcXG4gICAgLyogZm9udC1zaXplOiAxNnB4OyAqL1xcbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cXG59XFxuXFxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgICAgLyogQXVtZW50YSBvIHRhbWFuaG8gZGEgZm9udGUgcGFyYSB0ZWxhcyBkZSBhbHRhIGRlbnNpZGFkZSAqL1xcbiAgICB9XFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXFxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xcbiAgICA6cm9vdCB7XFxuICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXFxuICAgIH1cXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gICAgbWF4LXdpZHRoOiBpbmhlcml0O1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcXG4gICAgbWluLWhlaWdodDogMjBweDtcXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxuICAgIC8qIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsgKi9cXG5cXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xcblxcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQuc2VsZWN0ZWQsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM3NGI2ZGIgaW5zZXQ7XFxuICAgIGJvcmRlcjogMXB4IGRvdWJsZSAjNzRiNmRiO1xcblxcbn1cXG5cXG50ZCB7XFxuICAgIG1pbi1oZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgbGluZS1oZWlnaHQ6IDFyZW07XFxufVxcblxcbnRkOjpwbGFjZWhvbGRlciB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG50ZDplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG5cXG4udGFibGUtd3JhcHBlciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udGFibGUtY29udHJvbGxlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4uYWRkLXRhYmxlLXJvdyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogLTEuMzEyNXJlbTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjA2KTtcXG4gICAgd2lkdGg6IDFyZW07XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICB0b3A6IDA7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNXB4KTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmFkZC10YWJsZS1yb3c6aG92ZXIge1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGFibGUtc2hlbGwge1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcblxcblxcbi50YWJsZS1vcHRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgcGFkZGluZzogOHB4IDE2cHg7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcblxcbi8qKiBDYWxsb3V0ICoqL1xcblxcbi5jYWxsb3V0LXdyYXBwZXIge1xcbiAgICBwYWRkaW5nOiAxcmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxufVxcblxcbi5jYWxsb3V0OmhvdmVyIC5vcHRpb25zLWJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XFxufVxcblxcbi5jYWxsb3V0IHAge1xcbiAgICBtYXJnaW46IDA7XFxufVxcblxcbi5jYWxsb3V0LWJhY2tncm91bmQtcmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZEREVERTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZTRjOGM4O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLWdyZWVuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcXG4gICAgYm9yZGVyLWNvbG9yOiAjYzJkZWM2O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLWJsdWUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDlFREY2O1xcbiAgICBib3JkZXItY29sb3I6ICNjM2Q1ZGQ7XFxufVxcblxcbi5jYWxsb3V0LWJhY2tncm91bmQteWVsbG93IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdkZjtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZmJmNWQ2O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2VjO1xcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XFxufVxcblxcbi5jYWxsb3V0LWJhY2tncm91bmQtbm9uZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XFxuXFxufVxcblxcbi8qKiBlbmQgY2FsbG91dCAqL1xcblxcblxcbi8qKiBtZWRpYUlucHV0dGVyICoqL1xcbi5tZWRpYUlucHV0dGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxufVxcblxcbi8qKiBtZWRpYUlucHV0dGVyICoqL1xcblxcblxcbi5uby1zZWxlY3Rpb24ge1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4ucG9pbnRlciB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuXFxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cXG5cXG4udGFiLWNvbnRhaW5lciB7XFxuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcblxcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG5cXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XFxuXFxuXFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG5cXG59XFxuXFxuLm5hdi11bmRlcmxpbmUge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtaXRlbSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIG1hcmdpbi1yaWdodDogMTVweDtcXG59XFxuXFxuLm5hdi11bmRlcmxpbmUgLm5hdi1saW5rIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNSk7XFxuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcXG59XFxuXFxuXFxuLm5hdi1pdGVtLmFjdGl2ZSAubmF2LWxpbmsge1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBib3JkZXItdG9wOiBub25lO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcbi50YWItY29udGVudCAuY29udGVudC1kYXRhLmFjdGl2ZSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZ2FwOiAxcmVtO1xcbn1cXG5cXG4udGFiLWNvbnRlbnQgLnRleHQtaW5mbyB7XFxuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTtcXG59XFxuXFxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcXG4gICAgZGlzcGxheTogaW5saW5lO1xcbn1cXG5cXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4udXBsb2FkLWNvbnRlbnQgbGFiZWwge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogMjByZW07XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICAvKiB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7ICovXFxufVxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qIEVzdGlsbyBwYXJhIGFzIGFsw6dhcyBkZSByZWRpbWVuc2lvbmFtZW50byAqL1xcbi5yZXNpemUtaGFuZGxlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XFxuICAgIGN1cnNvcjogbndzZS1yZXNpemU7XFxuICAgIC8qIEN1cnNvciBkZSByZWRpbWVuc2lvbmFtZW50byBkaWFnb25hbCAqL1xcbn1cXG5cXG4ucmVzaXplLWhhbmRsZS5zZSB7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgcmlnaHQ6IDA7XFxufVxcblxcbi5zcG90aWZ5LWVtYmVkIHtcXG4gICAgbWluLWhlaWdodDogMTUycHg7XFxuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgICBib3JkZXItcmFkaXVzOiAuNzVyZW0gIWltcG9ydGFudDtcXG59XFxuXFxuLmdpc3QtZW1iZWQge1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgICBtaW4taGVpZ2h0OiAxNTBweCAhaW1wb3J0YW50O1xcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xcbn1cXG5cXG4uc25pcHBldC1lbWJlZCB7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5lbWJlZC1jb250YWluZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbn1cXG5cXG4uZW1iZWQtY29udGFpbmVyIGlmcmFtZSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG5cXG4uaWZyYW1lLXdyYXBwZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcblxcblxcbi52aWRlby1jb250YWluZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi52aWRlby1jb250YWluZXIgaWZyYW1lIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcbi54LXJlc2l6YWJsZSB7XFxuICAgIHJlc2l6ZTogaG9yaXpvbnRhbDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XFxuICAgIG1pbi13aWR0aDogMjUwcHg7XFxufVxcblxcbi55LXJlc2l6YWJsZSB7XFxuICAgIHJlc2l6ZTogdmVydGljYWw7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcXG4gICAgbWluLWhlaWdodDogMTUwcHg7XFxufVxcblxcbi5iYWNrZ3JvdW5kIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTZlMztcXG59XFxuXFxuXFxuLmZpdC1jb250ZW50IHtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBoZWlnaHQ6IGZpdC1jb250ZW50O1xcbn1cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4vKiAuZW1iZWQtY29udGFpbmVyIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4ubW9yZS1vcHRpb25zLWJ1dHRvbiB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICByaWdodDogMDtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuXFxufVxcblxcbi5jb250ZXh0LW1lbnUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMjBweDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxuICAgIHBhZGRpbmc6IDVweDtcXG4gICAgei1pbmRleDogMTA7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5tb3JlLW9wdGlvbnMtYnV0dG9uOmFjdGl2ZSArIC5jb250ZXh0LW1lbnUsXFxuLm1vcmUtb3B0aW9ucy1idXR0b246Zm9jdXMgKyAuY29udGV4dC1tZW51IHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcblxcbi5iYmJ1dG9ue1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG59ICovXFxuXFxuXFxuLyoqIEJsb2NrVG9vbGJhciBjb21wb25lbnQgKiovXFxuLmJsb2NrLXRvb2xiYXItd3JhcHBlciB7XFxuICAgIHdpZHRoOiAwO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZGlzcGxheTogY29udGVudHM7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBcXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XFxuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBnYXA6IDEwcHg7XFxuICAgIHBhZGRpbmc6IDVweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxuXFxuICAgIHRvcDogNXB4O1xcbiAgICByaWdodDogNXB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIHtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIGJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIGJ1dHRvbiB7XFxuICAgIGNvbG9yOiBibGFjaztcXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIgLmNvbG9yLWludGVyYWN0aXZlLWJ1dHRvbiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG59XFxuXFxuLyoqIEVuZCBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xcblxcblxcblxcbi5qdXN0aWZ5LWxlZnQge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxufVxcblxcbi5qdXN0aWZ5LWNlbnRlciB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG5cXG4uanVzdGlmeS1yaWdodCB7XFxuICAgIGp1c3RpZnktY29udGVudDogcmlnaHQ7XFxufVxcblxcblxcbi5oaWRkZW4ge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuXFxuZmlndXJlIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG5cXG4ub3ZlcmZsb3ctaGlkZGVuIHtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLyoqIElubGluZSBDb2RlICoqL1xcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgY29kZTpub3QocHJlIGNvZGUpIHtcXG4gICAgZm9udC1zaXplOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjN2E7XFxuICAgIHBhZGRpbmc6IDAgM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxufVxcblxcbi8qKiBDb250ZW50IHBsYWNlaG9sZGVyICovXFxuXFxuLmNvbnRlbnQtcGxhY2Vob2xkZXIge1xcbiAgICBwYWRkaW5nOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBnYXA6IDVweDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uY29udGVudC1wbGFjZWhvbGRlciAuaWNvbi13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XFxufVxcblxcblxcbi8qIGVuZCBDb250ZW50IHBsYWNlaG9sZGVyICovXFxuXFxuXFxuXFxuLyoqIENvZGUgKiovXFxuXFxucHJlIHtcXG4gICAgbWFyZ2luOiAwO1xcbn1cXG5cXG5wcmUgY29kZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLmlnbm9yZS1ldmVudHMge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5jb2RlLWJsb2NrIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uY29kZS1ibG9jayBzZWxlY3Qge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5jb2RlLWJsb2NrIHNlbGVjdCB7XFxuICAgIGFwcGVhcmFuY2U6IG5vbmU7XFxuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBwYWRkaW5nOiA0cHggOHB4O1xcbiAgICBmb250OiBpbmhlcml0O1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMTBweCBjZW50ZXI7XFxuICAgIGNvbG9yOiB3aGl0ZTtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmNvZGUtYmxvY2s6aG92ZXIgc2VsZWN0IHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcblxcblxcbi5jb2RlLWJsb2NrIGNvZGUge1xcbiAgICBmb250LXNpemU6IDFyZW07XFxuXFxufVxcblxcblxcblxcbkBrZXlmcmFtZXMgc2hha2Uge1xcblxcbiAgICAwJSxcXG4gICAgMTAwJSB7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxuICAgIH1cXG5cXG4gICAgMjUlLFxcbiAgICA3NSUge1xcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01cHgpO1xcbiAgICB9XFxuXFxuICAgIDUwJSB7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNXB4KTtcXG4gICAgfVxcbn1cXG5cXG4uc2hha2UtYW5pbWF0aW9uIHtcXG4gICAgYW5pbWF0aW9uOiBzaGFrZSAwLjZzIGN1YmljLWJlemllciguMzYsIC4wNywgLjE5LCAuOTcpIGJvdGg7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XFxuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcXG4gICAgcGVyc3BlY3RpdmU6IDEwMDBweDtcXG59XFxuXFxuLmJsdWUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogXFxcIiMyMzgzZTJcXFwiO1xcbiAgICBjb2xvcjogXFxcIndoaXRlXFxcIjtcXG4gICAgYm9yZGVyOiBcXFwibm9uZVxcXCI7XFxuICAgIHBhZGRpbmc6IFxcXCIzcHhcXFwiO1xcbiAgICBib3JkZXItcmFkaXVzOiBcXFwiNXB4XFxcIjtcXG4gICAgZm9udC13ZWlnaHQ6IFxcXCI1MDBcXFwiO1xcbn1cXG5cXG5cXG4uYmxvY2stc2VsZWN0ZWQge1xcbiAgICAvKiBib3JkZXI6IDJweCBkYXNoZWQgcmVkOyAqL1xcbn1cXG5cXG4uc2VwYXJhdG9yIHtcXG4gICAgLyogcGFkZGluZzogMTBweCAwOyAqL1xcbn1cXG5cXG5cXG4uc2VwYXJhdG9yLXdyYXBwZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICAvKiBoZWlnaHQ6IDUwcHg7ICovXFxufVxcblxcbi5zZXBhcmF0b3Ige1xcbiAgICBmbGV4LWdyb3c6IDE7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG59XFxuXFxuLyogLnNlcGFyYXRvcjo6YmVmb3JlLFxcbi5zZXBhcmF0b3I6OmFmdGVyIHtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIGZsZXgtZ3JvdzogMTtcXG59ICovXFxuXFxuXFxuXFxuLnNlcGFyYXRvci13cmFwcGVyIGhyIHtcXG4gICAgLyogT3V0cm9zIGVzdGlsb3MgKi9cXG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgICAvKiBSZW1vdmEgZXN0YSBsaW5oYSBzZSBlc3RpdmVyIHByZXNlbnRlICovXFxufVxcblxcbi5zZXBhcmF0b3Itd3JhcHBlciBocjpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlcGFyYXRvci1zZWxlY3RlZCB7XFxuICAgIC8qIG91dGxpbmU6IDJweCBzb2xpZCBibHVlOyAqL1xcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTtcXG59XFxuXFxuXFxuLnNlcGFyYXRvci1zZWxlY3RlZCBociB7XFxuICAgIC8qIG91dGxpbmU6IDJweCBzb2xpZCBibHVlOyAqL1xcbiAgICAvKiBib3JkZXI6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyAqL1xcblxcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTsgKi9cXG4gICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcXG5cXG5cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImV4cG9ydCBlbnVtIENvbnRlbnRUeXBlcyB7XHJcbiAgICBQYXJhZ3JhcGggPSBcInBcIixcclxuICAgIEhlYWRpbmdfMSA9IFwiaDFcIixcclxuICAgIEhlYWRpbmdfMiA9IFwiaDJcIixcclxuICAgIEhlYWRpbmdfMyA9IFwiaDNcIixcclxuICAgIEhlYWRpbmdfNCA9IFwiaDRcIixcclxuICAgIEhlYWRpbmdfNSA9IFwiaDVcIixcclxuICAgIEhlYWRpbmdfNiA9IFwiaDZcIixcclxuICAgIENoZWNrTGlzdCA9IFwiY2hlY2tMaXN0XCIsXHJcbiAgICBCdWxsZXRlZExpc3QgPSBcImJ1bGxldGVkTGlzdFwiLFxyXG4gICAgTnVtYmVyZWRMaXN0ID0gXCJudW1iZXJlZExpc3RcIixcclxuICAgIExpc3QgPSBcImxpc3RcIixcclxuICAgIFRhYmxlID0gXCJ0YWJsZVwiLFxyXG4gICAgSW1hZ2UgPSBcImltYWdlXCIsXHJcbiAgICBTY3JpcHQgPSBcInNjcmlwdFwiLFxyXG4gICAgSWZyYW1lID0gXCJpZnJhbWVcIlxyXG59IiwiZXhwb3J0IGVudW0gSWNvbnMge1xyXG4gICAgTGluayA9IFwiaWNvbi1tYXRlcmlhbC1saW5rXCIsXHJcbiAgICBCb2xkID0gXCJpY29uLXdvcmRwcmVzcy1ib2xkXCIsXHJcbiAgICBJdGFsaWMgPSBcImljb24tbWF0ZXJpYWwtaXRhbGljXCIsXHJcbiAgICBVbmRlcmxpbmUgPSBcImljb24tbWF0ZXJpYWwtdW5kZXJsaW5lXCIsXHJcbiAgICBJbmxpbmVDb2RlID0gXCJpY29uLW1hdGVyaWFsLWNvZGUtaW5saW5lXCIsXHJcbiAgICBTdHJpa2VUaHJvdWdoID0gXCJpY29uLXdvcmRwcmVzcy1zdHJpa2UtdGhyb3VnaFwiLFxyXG4gICAgUGx1cyA9IFwiaWNvbi1wbHVzXCIsXHJcbiAgICBDb2x1bW5SaWdodCA9IFwiaWNvbi1tYXRlcmlhbC1jb2x1bW4tcmlnaHRcIixcclxuICAgIENvbHVtbkxlZnQgPSBcImljb24tbWF0ZXJpYWwtY29sdW1uLWxlZnRcIixcclxuICAgIFJvd0Fib3ZlID0gXCJpY29uLW1hdGVyaWFsLXJvdy1hYm92ZVwiLFxyXG4gICAgUm93QmVsb3cgPSBcImljb24tbWF0ZXJpYWwtcm93LWJlbG93XCIsXHJcbiAgICBkZWxldGVTd2VlcCA9IFwiaWNvbi1tYXRlcmlhbC1kZWxldGUtc3dlZXBcIixcclxuICAgIFRyYXNoID0gXCJpY29uLW1hdGVyaWFsLXRyYXNoXCIsXHJcbiAgICBDbG9zZUNpcmNsZSA9IFwiaWNvbi1pb25pYy1jbG9zZS1jaXJjbGVcIixcclxuICAgIEVtcHR5ID0gXCJFbXB0eVwiLFxyXG4gICAgQ2FsbG91dCA9IFwiaWNvbi1tYXRlcmlhbC1jYWxsb3V0XCIsXHJcbiAgICBJbWFnZSA9IFwiaWNvbi1tYXRlcmlhbC1pbWFnZVwiLFxyXG4gICAgSW1hZ2UyID0gXCJpY29uLWJvb3RzdHJhcC1pbWFnZVwiLFxyXG4gICAgVmlkZW8gPSBcImljb24tbWF0ZXJpYWwtdmlkZW9cIixcclxuICAgIEp1c3RpZnlTdGFydCA9ICBcImljb24tbWF0ZXJpYWwtanVzdGlmeS1zdGFydFwiLFxyXG4gICAgSnVzdGlmeUNlbnRlciA9IFwiaWNvbi1tYXRlcmlhbC1qdXN0aWZ5LWNlbnRlclwiLFxyXG4gICAgSnVzdGlmeUVuZCA9IFwiaWNvbi1tYXRlcmlhbC1qdXN0aWZ5LWVuZFwiLFxyXG4gICAgRHVwbGljYXRlID0gXCJpY29uLW1hdGVyaWFsLWR1cGxpY2F0ZVwiLFxyXG4gICAgU3BvdGlmeSA9IFwiaWNvbi1ib290c3RyYXAtc3BvdGlmeVwiLFxyXG4gICAgR2l0SHViID0gXCJpY29uLWJvb3RzdHJhcC1naXRodWJcIixcclxuICAgIEdpdExhYiA9IFwiaWNvbi1ib290c3RyYXAtZ2l0bGFiXCIsXHJcbiAgICBDb2RlUGVuID0gXCJpY29uLWNvZGVwZW5cIixcclxuICAgIFlvdVR1YmUgPSBcImljb24tYm9vdHN0cmFwLXlvdXR1YmVcIlxyXG5cclxufSIsIi8qKlxyXG4gKiBFbnVtIGZvciBDU1MgY2xhc3MgbmFtZXMgdGhhdCBhY3RpdmF0ZSBzcGVjaWZpYyBmdW5jdGlvbmFsaXRpZXMgaW4gdGhlIEJsb2NrVG9vbGJveC5cclxuICogRWFjaCBvcHRpb24gY29ycmVzcG9uZHMgdG8gYSBjbGFzcyB0aGF0LCB3aGVuIGFwcGxpZWQsIGVuYWJsZXMgcGFydGljdWxhciBmZWF0dXJlcyBcclxuICogcmVsYXRlZCB0byBjb250ZW50IGVkaXRpbmcgYW5kIHN0eWxpbmcgd2l0aGluIGEgYmxvY2suXHJcbiAqXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBUb29sYm94T3B0aW9ucyB7XHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdGhhdCBhY3RpdmF0ZXMgdGhlIGJsb2NrIHRvb2xiYXIgZm9yIGNvbnRlbnQgaW50ZXJhY3Rpb24uXHJcbiAgICAgKiBUaGlzIGNsYXNzIGluY2x1ZGVzIHRoZSB0b29sYmFyIGFuZCBlbmFibGVzIGJhc2ljIGludGVyYWN0aW9uIGNhcGFiaWxpdGllcy5cclxuICAgICAqL1xyXG4gICAgSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzID0gXCJpbmNsdWRlLWJsb2NrLXRvb2xiYXJcIiwgLy9ibG9jay10b29sYmFyLCBibG9jay10b29sYmFyLCBjb250ZW50LWludGVyYWN0aXZlXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdGhhdCBhY3RpdmF0ZXMgdGhlIGFsaWdubWVudCB0b29scyB3aXRoaW4gdGhlIHRvb2xib3guXHJcbiAgICAgKiBUaGlzIGNsYXNzIGVuYWJsZXMgZnVuY3Rpb25hbGl0aWVzIGZvciBhbGlnbmluZyB0aGUgY29udGVudCB3aXRoaW4gYSBibG9jay5cclxuICAgICAqL1xyXG4gICAgQWxpZ25Ub29sQ2xhc3MgPSBcImFsaWduLXRvb2xcIiwgLy9pbnRlcmFjdGl2ZS1hbGlnblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzcyBuYW1lIHRoYXQgZW5hYmxlcyBjb2xvciBlZGl0aW5nIHRvb2xzIHdpdGhpbiB0aGUgdG9vbGJveC5cclxuICAgICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgb3B0aW9ucyBmb3IgY2hhbmdpbmcgdGhlIGNvbG9yIG9mIHRleHQgYW5kIGJhY2tncm91bmQuXHJcbiAgICAgKi9cclxuICAgIENvbG9yVG9vbENsYXNzID0gXCJjb2xvci10b29sXCIsIC8vaW50ZXJhY3RpdmUtY29sb3JcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB0aGF0IGFjdGl2YXRlcyBhZGRpdGlvbmFsIG9wdGlvbnMgd2l0aGluIHRoZSB0b29sYm94LlxyXG4gICAgICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSB0b29sYm94IHdpdGggbW9yZSBhZHZhbmNlZCBzZXR0aW5ncyBhbmQgZnVuY3Rpb25hbGl0aWVzLCBsaWtlIERlbGV0ZSBhbmQgRHVwbGljYXRlXHJcbiAgICAgKi9cclxuICAgIEV4dHJhT3B0aW9uc0NsYXNzID0gXCJleHRyYS1vcHRpb25zXCIsIC8vaW50ZXJhY3RpdmUtbW9yZVxyXG4gICAgTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MgPSBcImxhbmd1YWdlLXNlbGVjdGlvbi10b29sXCIgLy9pbnRlcmFjdGl2ZS1tb3JlXHJcbn0iLCJleHBvcnQgZW51bSBDb21tb25DbGFzc2VzIHtcclxuICAgIC8qKiBcclxuICAgICAqIENsYXNzIG5hbWUgZm9yIHRoZSBtYWluIGNvbnRlbnQgZWxlbWVudHMgd2l0aGluIGJsb2Nrcy4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluZGljYXRlXHJcbiAgICAgKiB3aGljaCBlbGVtZW50cyBjb250YWluIHRoZSBhY3R1YWwgY29udGVudCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBvcGVyYXRpb25zIGxpa2VcclxuICAgICAqIHN0eWxpbmcgb3IgaW50ZXJhY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIENvbnRlbnRFbGVtZW50ID0gXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIixcclxuICAgICAvKipcclxuICAgICogQ2xhc3MgbmFtZSBmb3IgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBkdXJpbmcgc2F2ZSBvciBleHBvcnQgb3BlcmF0aW9ucy5cclxuICAgICogQXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gZWRpdGluZyBVSSBjb21wb25lbnRzIHdpdGhpbiB0aGUgYC5jb250ZW50YCBlbGVtZW50IHRvIGVuc3VyZVxyXG4gICAgKiB0aGV5IGFyZSBub3QgcHJlc2VydmVkIGluIHRoZSBzYXZlZCBvciBleHBvcnRlZCBvdXRwdXQuIEVsZW1lbnRzIG91dHNpZGUgdGhlIGAuY29udGVudGBcclxuICAgICogc2hvdWxkIG5vdCByZWNlaXZlIHRoaXMgY2xhc3MgYXMgaXQgd291bGQgbGVhZCB0byB0aGUgbG9zcyBvZiBldmVudCBsaXN0ZW5lcnMgdXBvbiBhY3Rpb25zXHJcbiAgICAqIGxpa2UgdW5kbyBvciByZWRvLCB3aGljaCByZWx5IG9uIHRoZXNlIGVsZW1lbnRzIGJlaW5nIGNvbnNpc3RlbnRseSBhdmFpbGFibGUuXHJcbiAgICAqIEVsZW1lbnRzIG1hcmtlZCB3aXRoIGBFZGl0b3JPbmx5YCBpbnNpZGUgdGhlIGNvbnRlbnQgZG8gbm90IHJldGFpbiBwZXJzaXN0ZW50IGxpc3RlbmVycztcclxuICAgICogdGhleSBleGlzdCBvbmx5IHRyYW5zaWVudGx5IGR1cmluZyB0aGUgZWRpdCBzZXNzaW9uLCBzdWNoIGFzIHRoZSBgQmxvY2tUb29sYm94YCwgd2hpY2hcclxuICAgICogaXMgcmVjcmVhdGVkIHJhdGhlciB0aGFuIHNhdmVkLlxyXG4gICAgKi9cclxuICAgIEVkaXRvck9ubHkgPSBcImVkaXRvci1vbmx5XCIsXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdXNlZCB0byBkZWZpbmUgYSBjb250ZW50IGJsb2NrLiBCbG9ja3MgYXJlIGZ1bmRhbWVudGFsIHN0cnVjdHVyYWwgZWxlbWVudHNcclxuICAgICAqIGluIHRoZSBsYXlvdXQgdGhhdCBtYXkgY29udGFpbiB0ZXh0LCBpbWFnZXMsIG9yIG90aGVyIHR5cGVzIG9mIGNvbnRlbnQuIFRoaXMgY2xhc3NcclxuICAgICAqIGhlbHBzIGluIGFwcGx5aW5nIGNvbnNpc3RlbnQgc3R5bGluZyBhbmQgYmVoYXZpb3IgdG8gY29udGVudCBibG9ja3MuXHJcbiAgICAgKi9cclxuICAgIEJsb2NrID0gXCJibG9ja1wiLFxyXG4gICAgLyoqXHJcbiAgICAqIENsYXNzIG5hbWUgdXNlZCB0byB0cmlnZ2VyIHRoZSBkaXNwbGF5IG9mIHRoZSBNZWRpYUlucHV0dGVyIGNvbXBvbmVudCB1cG9uIGEgY2xpY2sgZXZlbnQuXHJcbiAgICAqIFdoZW4gYW4gZWxlbWVudCB3aXRoIHRoaXMgY2xhc3MgaXMgY2xpY2tlZCwgdGhlIE1lZGlhSW5wdXR0ZXIgbGlzdGVucyBmb3IgdGhlIGV2ZW50XHJcbiAgICAqIGFuZCBhY3RpdmF0ZXMsIHByb3ZpZGluZyBhIHVzZXIgaW50ZXJmYWNlIGZvciBlbnRlcmluZyBhIFVSTCBmb3IgYW4gZW1iZWQgb3IgdXBsb2FkaW5nIGEgZmlsZS5cclxuICAgICpcclxuICAgICogVGhpcyBjbGFzcyBmYWNpbGl0YXRlcyB1c2VyIGludGVyYWN0aW9uIGZvciBlbWJlZGRpbmcgbWVkaWEgY29udGVudCBkaXJlY3RseSBpbnRvIHRoZSBkb2N1bWVudCxcclxuICAgICogc3RyZWFtbGluaW5nIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBtdWx0aW1lZGlhIGVsZW1lbnRzIGxpa2UgaW1hZ2VzLCB2aWRlb3MsIG9yIG90aGVyIGVtYmVkZGVkIGNvbnRlbnQuXHJcbiAgICAqL1xyXG4gICAgU2hvd01lZGlhSW5wdXRPbkNsaWNrID0gXCJzaG93LW1lZGlhLWlucHV0LW9uLWNsaWNrXCIsXHJcbiAgICBTaG93TWVkaWFJbnB1dFVwbG9hZCA9ICBcInNob3ctbWVkaWEtaW5wdXQtdXBsb2FkXCIsXHJcbiAgICBTaG93TWVkaWFJbnB1dEVtYmVkID0gIFwic2hvdy1tZWRpYS1pbnB1dC1lbWJlZFwiLFxyXG59IiwiZXhwb3J0IGVudW0gQ3VzdG9tVUlFdmVudHMge1xyXG4gICAgXHJcbiAgICBDb2xvckNoYW5nZVJlcXVlc3QgPSBcIkNvbG9yQ2hhbmdlUmVxdWVzdFwiLFxyXG4gICAgU2hvd0hpZGVBY3RpdmVCdXR0b24gPSBcIlNob3dIaWRlQWN0aXZlQnV0dG9uXCIsXHJcbiAgICBSZXNldEFjdGl2ZUJ1dHRvbnMgPSBcIlJlc2V0QWN0aXZlQnV0dG9uc1wiLFxyXG4gICAgQ2xvc2VFbGVtZW50ID0gXCJIaWRlQ29tcG9uZW50XCIsXHJcbiAgICBTaG93RWxlbWVudCA9IFwiU2hvd0VsZW1lbnRcIixcclxuICAgIENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlID0gXCJDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZVwiXHJcbiAgICBcclxufSIsIi8qKlxyXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGV2ZW50cyBmb3IgbW91c2UsIGtleWJvYXJkLCBhbmQgZm9jdXMgYWN0aW9ucy5cclxuICogVGhpcyBlbnVtZXJhdGlvbiBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgc3RyaW5ncyBmb3IgYXR0YWNoaW5nIGV2ZW50IGxpc3RlbmVycyB0byBET00gZWxlbWVudHMuXHJcbiAqIFVzZSB0aGVzZSBlbnVtIHZhbHVlcyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYW5kIGF2b2lkIHR5cG9zIGluIGV2ZW50IG5hbWVzIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi5cclxuICovXHJcbmV4cG9ydCBlbnVtIERlZmF1bHRKU0V2ZW50cyB7XHJcbiAgICBMb2FkID0gIFwibG9hZFwiLFxyXG4gICAgTW91c2VlbnRlciA9IFwibW91c2VlbnRlclwiLFxyXG4gICAgTW91c2VsZWF2ZSA9IFwibW91c2VsZWF2ZVwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIGRvd24uICovXHJcbiAgICBNb3VzZWRvd24gPSBcIm1vdXNlZG93blwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIG1vdXNlIGlzIG1vdmVkIG92ZXIgYW4gZWxlbWVudC4gKi9cclxuICAgIE1vdXNlbW92ZSA9IFwibW91c2Vtb3ZlXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkLiAqL1xyXG4gICAgTW91c2V1cCA9IFwibW91c2V1cFwiLFxyXG4gICAgTW91c2VvdmVyID0gXCJtb3VzZW92ZXJcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGEga2V5IGlzIHJlbGVhc2VkIG9uIHRoZSBrZXlib2FyZC4gKi9cclxuICAgIEtleXVwID0gXCJrZXl1cFwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBkb3duIG9uIHRoZSBrZXlib2FyZC4gKi9cclxuICAgIEtleWRvd24gPSBcImtleWRvd25cIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGFuIGVsZW1lbnQgbG9zZXMgZm9jdXMuICovXHJcbiAgICBCbHVyID0gXCJibHVyXCIsXHJcbiAgICBTZWxlY3RTdGFydCA9IFwic2VsZWN0c3RhcnRcIixcclxuICAgIFNlbGVjdGlvbkNoYW5nZSA9IFwic2VsZWN0aW9uY2hhbmdlXCIsXHJcbiAgICBDbGljayA9IFwiY2xpY2tcIixcclxuICAgIEZvY3VzaW4gPSBcImZvY3VzaW5cIixcclxuICAgIEZvY3Vzb3V0ID0gXCJmb2N1c291dFwiLFxyXG4gICAgRE9NQ29udGVudExvYWRlZCA9IFwiRE9NQ29udGVudExvYWRlZFwiLFxyXG4gICAgSW5wdXQgPSBcImlucHV0XCIsXHJcbiAgICBCYmxDbGljayA9IFwiZGJsY2xpY2tcIlxyXG59IiwiZXhwb3J0IGVudW0gQ3VzdG9tRXZlbnRzIHtcclxuICAgIC8vQ29tcG9uZW50IGV2ZW50c1xyXG4gICAgZmxvYXRpbmdUb29sYmFyRGlzcGxheWVkID0gXCJmbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWRcIixcclxuXHJcbiAgICAvL1RleHQgY2xpY2sgZWRpdCBldmVudHNcclxuICAgIGFuY2hvckJ1dHRvbkNsaWNrZWQgPSBcImFuY2hvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGJvbGRCdXR0b25DbGlja2VkID0gXCJib2xkQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaXRhbGljQnV0dG9uQ2xpY2tlZCA9IFwiaXRhbGljQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgdW5kZXJsaW5lQnV0dG9uQ2xpY2tlZCA9IFwidW5kZXJsaW5lQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaW5saW5lQ29kZUJ1dHRvbkNsaWNrZWQgPSBcImlubGluZUNvZGVCdXR0b25DbGlja2VkXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoQnV0dG9uQ2xpY2tlZCA9IFwic3RyaWtlVGhyb3VnaEJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGhpbGl0ZUNvbG9yQnV0dG9uQ2xpY2tlZCA9IFwiaGlsaXRlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBmb3JlQ29sb3JCdXR0b25DbGlja2VkID0gXCJmb3JlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBcclxuICAgIGJ1dHRvbkdyb3VwSXRlbUNsaWNrZWQgPSBcImJ1dHRvbkdyb3VwSXRlbUNsaWNrZWRcIixcclxuICAgIGZvY3VzT25GaXJzdFJlcXVlc3RlZCA9IFwiZm9jdXNPbkZpcnN0UmVxdWVzdGVkXCIsXHJcbiAgICBwcmVzc2VkRW50ZXJPblRpdGxlID0gXCJwcmVzc2VkRW50ZXJPblRpdGxlXCIsXHJcbiAgICBcclxuICAgIHRyYW5zZm9ybUJsb2NrUmVxdWVzdGVkID0gXCJ0cmFuc2Zvcm1CbG9ja1JlcXVlc3RlZFwiLFxyXG4gICAgZHVwbGljYXRlQmxvY2tSZXF1ZXN0ZWQgPSBcImR1cGxpY2F0ZUJsb2NrUmVxdWVzdGVkXCIsXHJcblxyXG4gICAgLy9UZXh0IGVkaXQgZXZlbnRzXHJcbiAgICBhbmNob3IgPSBcImFuY2hvclwiLFxyXG4gICAgYm9sZCA9IFwiYm9sZFwiLFxyXG4gICAgaXRhbGljID0gXCJpdGFsaWNcIixcclxuICAgIHVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICBpbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICBoaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcblxyXG5cclxuICAgIHRleHRGb3JtYXRDaGFuZ2VkID0gXCJ0ZXh0Rm9ybWF0Q2hhbmdlZFwiLFxyXG4gICAgZW1pdHRlZENvbW1hbmQgPSBcImVtaXR0ZWRDb21tYW5kXCIsXHJcbiAgICBibG9ja1R5cGVDaGFuZ2VkID0gXCJibG9ja1R5cGVDaGFuZ2VkXCIsXHJcbiAgICBibG9ja0RlbGV0ZWQgPSBcImJsb2NrRGVsZXRlZFwiLFxyXG4gICAgYmxvY2tDbG9uZWQgPSBcImJsb2NrQ2xvbmVkXCIsXHJcbiAgICB0YWJsZUNlbGxDaGFuZ2VkID0gXCJ0YWJsZUNlbGxDaGFuZ2VkXCIsXHJcblxyXG5cclxuXHJcbiAgICAvL0Jsb2NrIGNvbW1hbmRzXHJcbiAgICBcclxufSIsImV4cG9ydCBlbnVtIFpJbmRleCB7XHJcbiAgICBMb3dJbXBvcnRhbmNlID0gXCIxMDBcIiwgXHJcbiAgICBTbGlnaHRseUltcG9ydGFudCA9IFwiMjAwXCIsXHJcbiAgICBOZXV0cmFsID0gXCIzMDBcIixcclxuICAgIE1vZGVyYXRlbHlJbXBvcnRhbnQgPSBcIjQwMFwiLFxyXG4gICAgVmVyeUltcG9ydGFudCA9IFwiNTAwXCIsIFxyXG4gICAgRXh0cmVtZWx5SW1wb3J0YW50ID0gXCI2MDBcIlxyXG59IiwiZXhwb3J0IGVudW0gQ29sb3JzIHtcclxuXHJcbiAgICBIaWxpdGVDb2xvclJlZCA9IFwiI0ZEREVERVwiLFxyXG4gICAgSGlsaXRlQ29sb3JHcmVlbiA9IFwiI0Q3RjdEQ1wiLFxyXG4gICAgSGlsaXRlQ29sb3JCbHVlID0gXCIjRDlFREY2XCIsXHJcbiAgICBIaWxpdGVDb2xvclllbGxvdyA9IFwiI0ZBRjREMVwiLFxyXG4gICAgSGlsaXRlQ29sb3JHcmV5ID0gXCIjRTFFMEUwXCIsXHJcbiAgICBIaWxpdGVDb2xvck5vbmUgPSBcInRyYW5zcGFyZW50XCIsXHJcblxyXG4gICAgRm9yZUNvbG9yUmVkID0gXCIjRDQ0QzQ3XCIsXHJcbiAgICBGb3JlQ29sb3JHcmVlbiA9IFwiIzQ0ODM2MVwiLFxyXG4gICAgRm9yZUNvbG9yQmx1ZSA9IFwiIzMzN0VBOVwiLFxyXG4gICAgRm9yZUNvbG9yWWVsbG93ID0gXCIjQ0I5MTJGXCIsXHJcbiAgICBGb3JlQ29sb3JHcmV5ID0gXCIjNzg3Nzc0XCIsXHJcbiAgICBGb3JlQ29sb3JJbml0aWFsID0gXCJpbml0aWFsXCIsXHJcblxyXG4gICAgQmFja2dyb3VuZENvbG9yUmVkID0gXCIjRkRERURFXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JHcmVlbiA9IFwiI0Q3RjdEQ1wiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQmx1ZSA9IFwiI0Q5RURGNlwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yWWVsbG93ID0gXCIjRkFGNEQxXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JHcmV5ID0gXCIjRTFFMEUwXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JOb25lID0gXCJ0cmFuc3BhcmVudFwiLFxyXG5cclxuICAgIEljb25BY3RpdmVCbHVlID0gXCIjMjM4MmUyXCIsXHJcbiAgICBJY29uRGVmYXVsdEJsYWNrID0gXCJyZ2JhKDU1LCA1MywgNDcsIDAuODUpXCIsXHJcbiAgICBSZWQgPSBcInJlZFwiLFxyXG4gICAgVG9tYXRvID0gXCIjRUI1NzU3XCIsXHJcbiAgICBPcmlnaW5hbFRhYmxlQ29sb3IgPSBcIiM4NDg4OGRcIlxyXG5cclxufVxyXG5cclxuZXhwb3J0IGVudW0gQ29sb3JzTmFtZXMge1xyXG4gICAgQ2FsbG91dEJhY2tncm91bmRSZWQgPSBcImNhbGxvdXQtYmFja2dyb3VuZC1yZWRcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JlZW4gPSBcImNhbGxvdXQtYmFja2dyb3VuZC1ncmVlblwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRCbHVlID0gXCJjYWxsb3V0LWJhY2tncm91bmQtYmx1ZVwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRZZWxsb3cgPSBcImNhbGxvdXQtYmFja2dyb3VuZC15ZWxsb3dcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JleSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kTm9uZSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLW5vbmVcIixcclxufSIsImV4cG9ydCBlbnVtIENvbW1hbmRzIHtcclxuICAgIC8qKiBUZXh0IG9wZXJhdGlvbnMgY29tbWFuZHMgKi9cclxuICAgIHRvZ2dsZUJvbGQgPSBcImJvbGRcIixcclxuICAgIHRvZ2dsZUl0YWxpYyA9IFwiaXRhbGljXCIsXHJcbiAgICB0b2dnbGVIaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IgPSBcImNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3JcIixcclxuICAgIHRvZ2dsZUZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcbiAgICB0b2dnbGVJbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICB0b2dnbGVMaW5rID0gXCJjcmVhdGVMaW5rXCIsXHJcbiAgICBsaW5rUmVhZHlUb0luc2VydCA9IFwibGlua1JlYWR5VG9JbnNlcnRcIixcclxuICAgIHRvZ2dsZVVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICB0b2dnbGVTdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICByZW1vdmVGb3JtYXQgPSBcInJlbW92ZUZvcm1hdFwiLFxyXG4gICAgY29weVNlbGVjdGVkID0gXCJjb3B5U2VsZWN0ZWRcIixcclxuICAgIGN1dFNlbGVjdGVkID0gXCJjdXRTZWxlY3RlZFwiLFxyXG4gICAgcGFzdCA9IFwicGFzdFwiLFxyXG5cclxuICAgIC8qKiBCbG9jayBvcGVyYXRpb25zIGNvbW1hbmRzICovXHJcbiAgICB0cmFuc2Zvcm1CbG9jayA9IFwidHJhbnNmb3JtQmxvY2tcIixcclxuICAgIGR1cGxpY2F0ZUJsb2NrID0gXCJkdXBsaWNhdGVCbG9ja1wiLFxyXG4gICAgZGVsZXRlQmxvY2sgPSBcImRlbGV0ZUJsb2NrXCIsXHJcbiAgICBjcmVhdGVEZWZhdWx0QmxvY2sgPSBcImNyZWF0ZURlZmF1bHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbk5leHRCbG9jayA9IFwiZm9jdXNPbk5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPblByZXZpb3VzQmxvY2sgPSBcImZvY3VzT25QcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhQcmV2aW91c0Jsb2NrID0gXCJtZXJnZVdpdGhQcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhOZXh0QmxvY2sgPSBcIm1lcmdlV2l0aE5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbkZpcnN0QmxvY2sgPSBcImZvY3VzT25GaXJzdEJsb2NrXCIsXHJcbiAgICBkZWxldGVCbG9ja0FuZEZvY3VzT25QcmV2aW91cyA9IFwiZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXNcIixcclxuICAgIGRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQgPSBcImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHRcIixcclxuXHJcbiAgICBKdXN0aWZ5TGVmdCA9IFwianVzdGlmeUxlZnRcIixcclxuICAgIEp1c3RpZnlDZW50ZXIgPSBcImp1c3RpZnlDZW50ZXJcIixcclxuICAgIEp1c3RpZnlSaWdodCA9IFwianVzdGlmeVJpZ2h0XCIsXHJcblxyXG4gICAgXHJcbiAgICAvKiogd2lsZGNhcmQgY29tbWFuZCBjb250ZXh0IGJhc2VkKi9cclxuICAgIGluc2VydE5ldyA9IFwiaW5zZXJ0TmV3XCIsXHJcblxyXG4gICAgLyoqIHRhYmxlIGNvbW1hbmRzICovXHJcbiAgICBpbnNlcnRUYWJsZVJvd0Fib3ZlID0gXCJpbnNlcnRUYWJsZVJvd0Fib3ZlXCIsXHJcbiAgICBpbnNlcnRUYWJsZVJvd0JlbG93ID0gXCJpbnNlcnRUYWJsZVJvd0JlbG93XCIsXHJcbiAgICBpbnNlcnRUYWJsZUNvbHVtbkxlZnQgPSBcImluc2VydFRhYmxlQ29sdW1uTGVmdFwiLFxyXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5SaWdodCA9IFwiaW5zZXJ0VGFibGVDb2x1bW5SaWdodFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlUm93RWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlUm93RWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgdG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yID0gXCJ0b2dnbGVDZWxsSGlsaXRlQ29sb3JcIixcclxuICAgIHJlbW92ZUNvbHVtbiA9IFwicmVtb3ZlQ29sdW1uXCIsXHJcbiAgICByZW1vdmVSb3cgPSBcInJlbW92ZVJvd1wiLFxyXG4gICAgY2hhbmdlVGFibGVCb3JkZXJDb2xvciA9IFwiY2hhbmdlVGFibGVCb3JkZXJDb2xvclwiLFxyXG5cclxuXHJcblxyXG4gICAgY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UgPSBcImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlXCJcclxufSIsImV4cG9ydCBlbnVtIEJ1dHRvbklEcyB7XHJcbiAgICBMaW5rID0gXCJsaW5rQnV0dG9uXCIsXHJcbiAgICBCb2xkID0gXCJib2xkQnV0dG9uXCIsXHJcbiAgICBJdGFsaWMgPSBcIml0YWxpY0J1dHRvblwiLFxyXG4gICAgVW5kZXJsaW5lID0gXCJ1bmRlcmxpbmVCdXR0b25cIixcclxuICAgIElubGluZUNvZGUgPSBcImlubGluZUNvZGVCdXR0b25cIixcclxuICAgIFN0cmlrZXRocm91Z2ggPSBcInN0cmlrZXRocm91Z2hCdXR0b25cIixcclxuXHJcbiAgICBBbGlnbkxlZnQgPSBcImFsaWduTGVmdFwiLFxyXG4gICAgQWxpZ25DZW50ZXIgPSBcImFsaWduQ2VudGVyXCIsXHJcbiAgICBBbGlnblJpZ2h0ID0gXCJhbGlnblJpZ2h0XCJcclxufSIsImV4cG9ydCBlbnVtIEtleWJvYXJkS2V5cyB7XHJcbiAgICBTaGlmdCA9IFwiU2hpZnRcIixcclxuICAgIEVudGVyID0gXCJFbnRlclwiLFxyXG4gICAgRXNjYXBlID0gXCJFc2NhcGVcIixcclxuICAgIEJhY2tzcGFjZSA9IFwiQmFja3NwYWNlXCIsXHJcbiAgICBDb250cm9sID0gXCJDb250cm9sXCIsXHJcbiAgICBTcGFjZSA9IFwiIFwiLFxyXG4gICAgRGVsZXRlID0gXCJEZWxldGVcIlxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25JdGVtSURzIHtcclxuICAgIEJhY2tncm91bmRPcHRpb25SZWQgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmVlbiA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiLFxyXG4gICAgQmFja2dyb3VuZE9wdGlvbkJsdWUgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25ZZWxsb3cgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmV5ID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uTm9uZSA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiXHJcbn0iLCJleHBvcnQgZW51bSBET01FbGVtZW50cyB7XHJcbiAgICBURCA9IFwidGRcIixcclxuICAgIFRBQkxFID0gXCJ0YWJsZVwiXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bkxpc3RJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uU2VsZWN0ID0gXCJjb2xvclRleHRPcHRpb25TZWxlY3RcIixcclxuXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bk1lbnVJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uc01lbnUgPSBcImNvbG9yVGV4dE9wdGlvbnNNZW51XCJcclxufSIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21haW4uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgICBzdGF0aWMgZ2VuZXJhdGVVbmlxdWVJZCgpIHtcbiAgICAgICAgY29uc3QgdGltZVBhcnQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgY29uc3QgcmFuZG9tQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoMSk7XG4gICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbUFycmF5KTtcbiAgICAgICAgY29uc3QgcmFuZG9tUGFydCA9IHJhbmRvbUFycmF5WzBdLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgcmV0dXJuIHRpbWVQYXJ0ICsgcmFuZG9tUGFydDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmdiVG9IZXgocmdiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZ2JBcnJheSA9IHJnYi5tYXRjaCgvXFxkKy9nKSEubWFwKE51bWJlcik7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHJnYkFycmF5Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IHgudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNWYWxpZFVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKGh0dHBzPzpcXFxcL1xcXFwvKScgK1xuICAgICAgICAgICAgJyg/IS0pW2EtekEtWlxcXFxkLV17MSw2M30oPzwhLSlcXFxcLicgK1xuICAgICAgICAgICAgJyhbYS16QS1aXFxcXGQtXStcXFxcLikqW2EtekEtWl17Mix9JyArXG4gICAgICAgICAgICAnKFxcXFw6XFxcXGR7MSw1fSk/JyArXG4gICAgICAgICAgICAnKFxcXFwvWy1hLXpBLVpcXFxcZCVfLn4rXSopKicgK1xuICAgICAgICAgICAgJyhcXFxcP1stYS16QS1aXFxcXGQlXy5+Kz0mXSopPycgK1xuICAgICAgICAgICAgJygjWy1hLXpBLVpcXFxcZF9dKik/JCcsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICBcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnLi4vJykgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJyUyZSUyZScpIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCclMDAnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodXJsKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgQ29udGVudFR5cGVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbnRlbnRUeXBlc1wiO1xuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuL0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xuaW1wb3J0IHsgVG9vbGJveE9wdGlvbnMgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0b3Ige1xuICAgIChjb250ZW50OiBzdHJpbmcgfCBudWxsKTogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgY3JlYXRvcnM6IHsgW3R5cGU6IHN0cmluZ106IEVsZW1lbnRDcmVhdG9yIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5U2VydmljZTtcblxuICAgIHN0YXRpYyBFTEVNRU5UX1RZUEVTID0ge1xuICAgICAgICBCTE9DS19QQVJBR1JBUEg6IFwiYmxvY2stcFwiLFxuICAgICAgICBQQVJBR1JBUEg6IFwicFwiLFxuICAgICAgICBDSEVDS0JPWF9JVEVNOiBcImNoZWNrYm94SXRlbVwiLFxuICAgICAgICBMSVNUX0lURU06IFwibGlzdEl0ZW1cIixcbiAgICAgICAgQ09ERTogXCJjb2RlXCIsXG4gICAgICAgIFFVT1RFOiBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgQlVMTEVURURfTElTVDogXCJ1bFwiLFxuICAgICAgICBOVU1CRVJFRF9MSVNUOiBcIm9sXCIsXG4gICAgICAgIENIRUNLX0xJU1Q6IFwiY2hlY2tMaXN0c1wiLFxuICAgICAgICBIRUFERVJfMTogXCJoMVwiLFxuICAgICAgICBIRUFERVJfMjogXCJoMlwiLFxuICAgICAgICBIRUFERVJfMzogXCJoM1wiLFxuICAgICAgICBIRUFERVJfNDogXCJoNFwiLFxuICAgICAgICBIRUFERVJfNTogXCJoNVwiLFxuICAgICAgICBIRUFERVJfNjogXCJoNlwiLFxuICAgICAgICBEUkFHX0hBTkRMRV9CVVRUT046IFwiZHJhZy1oYW5kbGUtYnV0dG9uXCIsXG4gICAgICAgIFRBQkxFOiBcInRhYmxlXCIsXG4gICAgICAgIElNQUdFOiBcImltYWdlXCIsXG4gICAgICAgIFZJREVPOiBcInZpZGVvXCIsXG4gICAgICAgIFNQT1RJRlk6IFwic3BvdGlmeVwiLFxuICAgICAgICBHSVRIVUJfR0lTVDogXCJnaXRodWItZ2lzdFwiLFxuICAgICAgICBHSVRMQUJfU05JUFBFVDogXCJnaXRsYWItc25pcHBldFwiLFxuICAgICAgICBDT0RFUEVOOiBcImNvZGVwZW5cIixcbiAgICAgICAgQ0FMTE9VVDogXCJjYWxsb3V0XCIsXG4gICAgICAgIFNFUEFSQVRPUjogXCJzZXBhcmF0b3JcIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5UQUJMRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnRhYmxlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSW1hZ2UsIEljb25zLkltYWdlMiwgXCJVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2VcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRVcGxvYWQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJpbWFnZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU8sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuWW91VHViZSwgXCJFbWJlZCBhIFlvdVR1YmUgdmlkZW9cIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJ5b3V0dWJlLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIl0pKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TUE9USUZZLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGxhY2Vob2xkZXJDcmVhdG9yKENvbnRlbnRUeXBlcy5JZnJhbWUsIEljb25zLlNwb3RpZnksIFwiRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrXCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWQsIFwic3BvdGlmeS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUSFVCX0dJU1QsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuR2l0SHViLCBcIkVtYmVkIGEgR2l0SHViIEdpc3RcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJnaXRodWItZ2lzdC1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIC8vdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRMQUJfU05JUFBFVCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuU2NyaXB0LCBJY29ucy5HaXRMYWIsIFwiRW1iZWQgYSBzbmlwcGV0XCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWRdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERVBFTiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSWZyYW1lLCBJY29ucy5Db2RlUGVuLCBcIkVtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtb1wiLCBbQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dEVtYmVkLCBcImNvZGVwZW4tZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiXSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jYWxsb3V0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5zZXBhcmF0b3JDcmVhdG9yKCkpO1xuXG5cbiAgICAgICAgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLl9pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEVsZW1lbnRGYWN0b3J5U2VydmljZSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgRWxlbWVudEZhY3RvcnlTZXJ2aWNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIGNyZWF0b3I6IEVsZW1lbnRDcmVhdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3JlYXRvcnNbdHlwZV0gPSBjcmVhdG9yO1xuICAgIH1cblxuICAgIGNyZWF0ZSh0eXBlOiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JzW3R5cGVdO1xuXG4gICAgICAgIGlmICghY3JlYXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gY3JlYXRvciByZWdpc3RlcmVkIGZvciB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3JlYXRvcihjb250ZW50IHx8IFwiXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJsb2NrUGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGgoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGFyYWdyYXBoKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmdDcmVhdG9yKGxldmVsOiBudW1iZXIpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuaGVhZGluZyhsZXZlbCwgY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tib3hJdGVtQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tib3hJdGVtKGNvbnRlbnQgfHwgXCJcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbGlzdEl0ZW1DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcblxuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhZ0hhbmRsZUJ1dHRvbkNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmRyYWdIYW5kbGVCdXR0b24oKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb2RlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJpZ25vcmUtZXZlbnRzXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgY29kZUJsb2NrLmNsYXNzTGlzdC5hZGQoXCJjb2RlLWJsb2NrXCIsIFwiaWdub3JlLXF1aWNrLW1lbnVcIiwgXCJpZ25vcmUtdGV4dC1mbG9hdGluZy10b29sYmFyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgIHByZS5jbGFzc0xpc3QuYWRkKFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MsIFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcblxuICAgICAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgICAgICAgIGNvZGUuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICBjb2RlLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCIvKiBDb2RlIHNuaXBwZXQgKi9cIik7XG4gICAgICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgY29kZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb2RlJywgXCJmb2N1c2FibGVcIiwgXCJobGpzXCIsIFwibGFuZ3VhZ2UtcGxhaW50ZXh0XCIpO1xuICAgICAgICAgICAgY29kZS5zZXRBdHRyaWJ1dGUoXCJzcGVsbENoZWNrXCIsIFwiZmFsc2VcIik7XG5cbiAgICAgICAgICAgIHByZS5hcHBlbmRDaGlsZChjb2RlKTtcblxuICAgICAgICAgICAgY29kZS5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29kZS5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWhpZ2hsaWdodGVkXCIpO1xuICAgICAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBjb2RlQmxvY2suYXBwZW5kQ2hpbGQobGFuZ3VhZ2VTZWxlY3Rvcik7XG4gICAgICAgICAgICBjb2RlQmxvY2suYXBwZW5kQ2hpbGQocHJlKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb2RlQmxvY2spO1xuXG4gICAgICAgICAgICBobGpzLmhpZ2hsaWdodEVsZW1lbnQoY29kZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIsIFwic3dpdHRhYmxlXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBibG9ja3F1b3RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJsb2NrcXVvdGVcIik7XG4gICAgICAgICAgICBibG9ja3F1b3RlLmNsYXNzTGlzdC5hZGQoXCJmb2N1c2FibGVcIik7XG4gICAgICAgICAgICBibG9ja3F1b3RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgYmxvY2txdW90ZS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0UmFuZG9tUXVvdGUoKSk7XG5cbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGJsb2NrcXVvdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gY29udGVudEVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFJhbmRvbVF1b3RlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHF1b3RhdGlvbnMgPSBbXG4gICAgICAgICAgICBcIlRhbGsgaXMgY2hlYXAuIFNob3cgbWUgdGhlIGNvZGUuIC0gTGludXMgVG9ydmFsZHNcIixcbiAgICAgICAgICAgIFwiUHJlbWF0dXJlIG9wdGltaXphdGlvbiBpcyB0aGUgcm9vdCBvZiBhbGwgZXZpbC4gLSBEb25hbGQgS251dGhcIixcbiAgICAgICAgICAgIFwiVGhlIG1vc3QgZGFuZ2Vyb3VzIHBocmFzZSBpbiB0aGUgbGFuZ3VhZ2UgaXMsICdXZSd2ZSBhbHdheXMgZG9uZSBpdCB0aGlzIHdheS4nIC0gR3JhY2UgSG9wcGVyXCIsXG4gICAgICAgICAgICBcIlNpbXBsaWNpdHkgaXMgcHJlcmVxdWlzaXRlIGZvciByZWxpYWJpbGl0eS4gLSBFZHNnZXIgVy4gRGlqa3N0cmFcIixcbiAgICAgICAgICAgIFwiQW55IGZvb2wgY2FuIHdyaXRlIGNvZGUgdGhhdCBhIGNvbXB1dGVyIGNhbiB1bmRlcnN0YW5kLiBHb29kIHByb2dyYW1tZXJzIHdyaXRlIGNvZGUgdGhhdCBodW1hbnMgY2FuIHVuZGVyc3RhbmQuIC0gTWFydGluIEZvd2xlclwiLFxuICAgICAgICAgICAgXCJGaXJzdCwgc29sdmUgdGhlIHByb2JsZW0uIFRoZW4sIHdyaXRlIHRoZSBjb2RlLiAtIEpvaG4gSm9obnNvblwiLFxuICAgICAgICAgICAgXCJJbiBwcm9ncmFtbWluZywgdGhlIGhhcmQgcGFydCBpc24ndCBzb2x2aW5nIHByb2JsZW1zLCBidXQgZGVjaWRpbmcgd2hhdCBwcm9ibGVtcyB0byBzb2x2ZS4gLSBQYXVsIEdyYWhhbVwiLFxuICAgICAgICAgICAgXCJDb2RlIGlzIGxpa2UgaHVtb3IuIFdoZW4geW91IGhhdmUgdG8gZXhwbGFpbiBpdCwgaXQncyBiYWQuIC0gQ29yeSBIb3VzZVwiLFxuICAgICAgICAgICAgXCJNYWtlIGl0IHdvcmssIG1ha2UgaXQgcmlnaHQsIG1ha2UgaXQgZmFzdC4gLSBLZW50IEJlY2tcIixcbiAgICAgICAgICAgIFwiQmVmb3JlIHNvZnR3YXJlIGNhbiBiZSByZXVzYWJsZSBpdCBmaXJzdCBoYXMgdG8gYmUgdXNhYmxlLiAtIFJhbHBoIEpvaG5zb25cIlxuICAgICAgICBdO1xuICAgIFxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHF1b3RhdGlvbnMubGVuZ3RoKTsgICAgXG4gICAgICAgIHJldHVybiBxdW90YXRpb25zW2luZGV4XTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja0xpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgLy8gdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtbGlzdCcpO1xuICAgICAgICAgICAgdWwuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLkNoZWNrTGlzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWxsZXRlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5CdWxsZXRlZExpc3QpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QnKTtcblxuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEl0ZW0gPSBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1fMihjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGluaXRpYWxJdGVtKTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbnVtYmVyZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuTnVtYmVyZWRMaXN0KTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGFibGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVNoZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRhYmxlU2hlbGwuY2xhc3NMaXN0LmFkZChcInRhYmxlLXNoZWxsXCIsIFwiaWdub3JlLXF1aWNrLW1lbnVcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlQ29udHJvbGxlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuY2xhc3NMaXN0LmFkZChcInRhYmxlLWNvbnRyb2xsZXJcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0YWJsZVdyYXBwZXIuY2xhc3NMaXN0LmFkZChcInRhYmxlLXdyYXBwZXJcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTtcbiAgICAgICAgICAgIHRhYmxlLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgXCJ0YWJsZVwiLCBUb29sYm94T3B0aW9ucy5JbmNsdWRlQmxvY2tUb29sYmFyQ2xhc3MsIFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzLCBUb29sYm94T3B0aW9ucy5FeHRyYU9wdGlvbnNDbGFzcyk7XG4gICAgICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuVGFibGUpO1xuXG4gICAgICAgICAgICB0YWJsZVNoZWxsLmFwcGVuZENoaWxkKHRhYmxlQ29udHJvbGxlcik7XG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuYXBwZW5kQ2hpbGQodGFibGVXcmFwcGVyKTtcbiAgICAgICAgICAgIHRhYmxlV3JhcHBlci5hcHBlbmRDaGlsZCh0YWJsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcblxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGNvbnRlbnQgPyBjb250ZW50LnNwbGl0KCcsJykgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICByb3dEYXRhLmZvckVhY2goY2VsbENvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBjZWxsQ29udGVudDtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgICAgICAgY29uc3QgYWRkUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFkZFJvdy5jbGFzc0xpc3QuYWRkKFwiYWRkLXRhYmxlLXJvd1wiKTtcbiAgICAgICAgICAgIGFkZFJvdy5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjFyZW1cIiBoZWlnaHQ9XCIxcmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLXBsdXNcIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmNsYXNzTGlzdC5hZGQoXCJhZGQtdGFibGUtY29sdW1uXCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMXJlbVwiIGhlaWdodD1cIjFyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tcGx1c1wiPjwvdXNlPjwvc3ZnPmA7XG5cbiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5hcHBlbmRDaGlsZChhZGRSb3cpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmFwcGVuZENoaWxkKGFkZENvbHVtbik7XG5cbiAgICAgICAgICAgIHJldHVybiB0YWJsZVNoZWxsO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBsYWNlaG9sZGVyQ3JlYXRvcihjb250ZW50VHlwZTogQ29udGVudFR5cGVzLCBpY29uOiBJY29ucywgdGV4dDogc3RyaW5nLCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKENvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnQsIFwic3dpdHRhYmxlXCIsIFwibm8tc2VsZWN0aW9uXCIsIFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgY29udGVudFR5cGUpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZChcImNvbnRlbnQtcGxhY2Vob2xkZXJcIiwgQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2ssIC4uLmNsYXNzZXMpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlckljb24gPSB0aGlzLmNyZWF0ZUljb24oaWNvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0LmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XG4gICAgICAgICAgICBwbGFjZWhvbGRlclRleHQuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJJY29uKTtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyVGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50RWxlbWVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjYWxsb3V0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGpvaGFubmVzQ2FsbG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgam9oYW5uZXNDYWxsb3V0LmNsYXNzTGlzdC5hZGQoXCJpZ25vcmUtcXVpY2stbWVudVwiLCBcImNhbGxvdXRcIiwgXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgVG9vbGJveE9wdGlvbnMuSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzLCBUb29sYm94T3B0aW9ucy5Db2xvclRvb2xDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuXG4gICAgICAgICAgICBjb25zdCBjYWxsb3V0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjYWxsb3V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIiwgXCJjYWxsb3V0LXdyYXBwZXJcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlR5cGUgc29tZXRoaW5nLi4uXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC10ZXh0XCIsIFwiZWRpdGFibGVcIiwgXCJmb2N1c2FibGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxvdXRXcmFwcGVyLmFwcGVuZENoaWxkKHRleHRBcmVhKTtcbiAgICAgICAgICAgIGpvaGFubmVzQ2FsbG91dC5hcHBlbmRDaGlsZChjYWxsb3V0V3JhcHBlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBqb2hhbm5lc0NhbGxvdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2VwYXJhdG9yQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcblxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJzZXBhcmF0b3Itd3JhcHBlclwiKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKTtcbiAgICAgICAgICAgIHNlcGFyYXRvci5jbGFzc0xpc3QuYWRkKCdzZXBhcmF0b3InKTtcbiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgcC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIHAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1dyaXRlIHNvbWV0aGluZyBvciB0eXBlIC8gKHNsYXNoKSB0byBjaG9vc2UgYSBibG9jay4uLicpO1xuXG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmcobGV2ZWw6IG51bWJlciwgY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBoJHtsZXZlbH1gKTtcblxuICAgICAgICBoLmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgaC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudC10eXBlJywgYGgke2xldmVsfWApO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGguY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCBgSGVhZGluZyAke2xldmVsfWApO1xuXG4gICAgICAgIHJldHVybiBoO1xuICAgIH1cblxuICAgIHN0YXRpYyBjaGVja2JveEl0ZW0oY29udGVudDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGlkID0gVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpO1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGVsZXRhYmxlXCIsIFwibm8tbGlzdC1zdHlsZVwiLCBcImxpc3QtaXRlbVwiLCBcImxpc3QtaXRlbS1jaGVja2FibGVcIik7XG5cbiAgICAgICAgLy8gaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICBsZXQgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBjaGVja2JveC5pZCA9IGlkO1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcbiAgICAgICAgLy8gY2hlY2tib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG5cbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1RvLWRvJyk7XG4gICAgICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiZm9yXCIsIGlkKTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuXG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtKHRleHQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcblxuICAgIC8vICAgICBsZXQgaW5pdGlhbEl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuXG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgIC8vICAgICBpbml0aWFsSXRlbS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0l0ZW0nKTtcblxuICAgIC8vICAgICByZXR1cm4gaW5pdGlhbEl0ZW07XG5cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbV8yKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGxldCBpbml0aWFsSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGRpdi5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmFwcGVuZENoaWxkKGRpdik7XG5cblxuICAgICAgICBkaXYuaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuXG4gICAgICAgIC8vIGluaXRpYWxJdGVtLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxJdGVtO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGJsb2NrUGFyYWdyYXBoKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG5cbiAgICAgICAgbGV0IG5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBuZXdEaXYuaWQgPSBgYi0ke1V0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKX1gO1xuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5wYXJhZ3JhcGgoY29udGVudCk7XG5cbiAgICAgICAgLy8gbGV0IGRyYWdIYW5kbGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICAvLyBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3QnV0dG9uKTtcbiAgICAgICAgbmV3RGl2LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdibG9jaycpO1xuICAgICAgICBuZXdEaXYuY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmNsYXNzTGlzdC5hZGQoJ2RyYWctaGFuZGxlcicpO1xuICAgICAgICAvLyBkcmFnSGFuZGxlci5jbGFzc0xpc3QuYWRkKCdidXR0b24tcmVzZXQnKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgIH1cblxuICAgIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uKCkge1xuXG4gICAgICAgIGNvbnN0IGRyYWdIYW5kbGVyV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRyYWdIYW5kbGVyV3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiZHJhZy1oYW5kbGVyLXdyYXBwZXJcIiwgQ29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5KTtcblxuICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGJ1dHRvbi5pbm5lckhUTUwgPSAnPHN2ZyB3aWR0aD1cIjEuMzc1cmVtXCIgaGVpZ2h0PVwiMS4zNzVyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSBocmVmPVwiI2ljb24tbWF0ZXJpYWwtZHJhZ1wiPjwvdXNlPjwvc3ZnPic7XG5cbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoQ29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5LCBcImRyYWctaGFuZGxlclwiLCBcImJ1dHRvbi1yZXNldFwiKTtcbiAgICAgICAgYnV0dG9uLmRyYWdnYWJsZSA9IHRydWU7XG5cblxuICAgICAgICBkcmFnSGFuZGxlcldyYXBwZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgICByZXR1cm4gZHJhZ0hhbmRsZXJXcmFwcGVyO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVJY29uKGljb25JZDogc3RyaW5nKSB7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaWNvbi13cmFwcGVyXCIpO1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjJHtpY29uSWR9XCI+PC91c2U+PC9zdmc+YDtcblxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVVJQ29tcG9uZW50PFQgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XHJcblxyXG4gICAgaWQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9jYW5IaWRlOiBib29sZWFuO1xyXG5cclxuICAgIGNsYXNzTGlzdDogc3RyaW5nW10gPSBbXTtcclxuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gICAgaHRtbEVsZW1lbnQ6IFQ7XHJcbiAgICBwYXJlbnQ/OiBCYXNlVUlDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50ID0gdGhpcy5pbml0KCkgYXMgVDtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYW4gSFRNTEVsZW1lbnQgdXNpbmcgdGhlIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgQVBJLlxyXG4gICAgKiBUaGlzIGFic3RyYWN0IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZlxyXG4gICAgKiBIVE1MRWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBwb3NzaWJseSBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMgb3Igc3R5bGVzLlxyXG4gICAgKiBEZXBlbmRlbmNpZXMgbmVlZGVkIGJ5IHRoZSBzdWJjbGFzc2VzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IgYW5kXHJcbiAgICAqIGFyZSB0eXBpY2FsbHkgbWFkZSBhdmFpbGFibGUgdmlhIHRoaXMucHJvcHMgZm9yIHVzZSB3aXRoaW4gdGhpcyBtZXRob2QuXHJcbiAgICAqXHJcbiAgICAqIEBhYnN0cmFjdFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBFeGFtcGxlIHN1YmNsYXNzIHRoYXQgdXNlcyBhIGRlcGVuZGVuY3kgcGFzc2VkIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAgKiBjbGFzcyBUb29sYmFyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuICAgICogICAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY3kpIHtcclxuICAgICogICAgICAgICBzdXBlcih7ZGVwZW5kZW5jeTogZGVwZW5kZW5jeX0pO1xyXG4gICAgKiAgICAgICAgIHRoaXMuZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3k7XHJcbiAgICAqICAgICB9XHJcbiAgICAqXHJcbiAgICAqICAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICogICAgICAgICBjb25zdCB0b29sYmFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmNsYXNzTmFtZSA9ICd0b29sYmFyJztcclxuICAgICogICAgICAgICAvLyBVc2luZyB0aGUgZGVwZW5kZW5jeVxyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmF0dHJpYnV0ZShcImN1c3RvbURlcGVuZGVuY3lCYXNlZFwiLCB0aGlzLmRlcGVuZGVuY3kuZGF0YSk7XHJcbiAgICAqICAgXHJcbiAgICAqICAgICAgICAgcmV0dXJuIHRvb2xiYXJFbGVtZW50O1xyXG4gICAgKiAgICAgfVxyXG4gICAgKiB9XHJcbiAgICAqXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgSFRNTEVsZW1lbnQuXHJcbiAgICAqL1xyXG4gICAgYWJzdHJhY3QgaW5pdCgpOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnYmxvY2snO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElkKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENzc0NsYXNzKC4uLnRva2Vuczogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5wdXNoKC4uLnRva2Vucyk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLnRva2Vucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGVuZHMgdGhpcyBjb21wb25lbnQncyBIVE1MIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgY29tcG9uZW50J3MgSFRNTCBlbGVtZW50LlxyXG4gICAgKiBUaGlzIG1ldGhvZCBlc3RhYmxpc2hlcyBhIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgaW4gdGhlIERPTSBieSBhcHBlbmRpbmcgdGhpcyBpbnN0YW5jZSdzXHJcbiAgICAqIGVsZW1lbnQgYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50J3MgZWxlbWVudC4gSXQgYWxzbyB1cGRhdGVzIHRoZSBwYXJlbnQgcHJvcGVydHkgb2YgdGhpc1xyXG4gICAgKiBpbnN0YW5jZSB0byByZWZlciB0byB0aGUgcHJvdmlkZWQgcGFyZW50IGNvbXBvbmVudC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtCYXNlVUlDb21wb25lbnR9IHBhcmVudCBUaGUgcGFyZW50IGNvbXBvbmVudCB0byB3aGljaCB0aGlzIGNvbXBvbmVudCdzIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZC5cclxuICAgICogVGhpcyBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgQmFzZVVJQ29tcG9uZW50IG9yIGFueSBvZiBpdHMgc3ViY2xhc3NlcywgZW5zdXJpbmcgdGhhdCBpdCBoYXMgYW4gaHRtbEVsZW1lbnQgcHJvcGVydHkuXHJcbiAgICAqL1xyXG4gICAgYXBwZW5kVG8ocGFyZW50OiBCYXNlVUlDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICBwYXJlbnQuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmh0bWxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCAhZG9jdW1lbnQuY29udGFpbnMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIC8vIHRoaXMuX2NhbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICAvLyB9LCAxMDApO1xyXG5cclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIC8vIGlmICghdGhpcy5fY2FuSGlkZSkge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc29sZS53YXJuKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gICAgIC8vIHJldHVybjtcclxuICAgICAgICAvLyAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcblxyXG4gICAgbG9ja0hpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5fY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja0hpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5fY2FuSGlkZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhbkhpZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkhpZGUgJiYgdGhpcy5pc1Zpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhbkhpZGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUNvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQ29sb3IoKSB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiaW5oZXJpdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4oKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcGxheSA9IHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFZpc2liaWxpdHkgPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbERpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuaHRtbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgc2NyZWVuV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKG9yaWdpbmFsRGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IG9yaWdpbmFsRGlzcGxheTtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gb3JpZ2luYWxWaXNpYmlsaXR5O1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSaWdodEVkZ2UgPSBlbGVtZW50UmVjdC5yaWdodDtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnRSaWdodEVkZ2UgPiBzY3JlZW5XaWR0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50UmVjdC5sZWZ0IDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVWaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlbGV2YW50Q29udGFpbmVyID0gdGhpcy5odG1sRWxlbWVudC5jbG9zZXN0KCdzZWxlY3QsIHVsJyk7XHJcblxyXG4gICAgICAgIGlmIChyZWxldmFudENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICdzdGFydCcgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdBdHRlbXB0ZWQgdG8gbWFrZSBhIG5vbi1yZWxldmFudCBpdGVtIHZpc2libGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuaWQgPT0gZGV0YWlscy50YXJnZXRJZCEpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTaG93RWxlbWVudEV2ZW50KGV2ZW50OiBFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPjtcclxuICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBpZiAoZGV0YWlscy50YXJnZXRJZCA9PSB0aGlzLmlkKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9CYXNpYyBVSSBldmVudHNcclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHRoaXMuaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93RWxlbWVudCwgdGhpcy5oYW5kbGVTaG93RWxlbWVudEV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIERlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IERlcGVuZGVuY3lDb250YWluZXIgPSBuZXcgRGVwZW5kZW5jeUNvbnRhaW5lcigpO1xyXG4gICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXM6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IERlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiBEZXBlbmRlbmN5Q29udGFpbmVyLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlcihrZXk6IHN0cmluZywgY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNba2V5XSA9IGNvbnN0cnVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNvbHZlPFQ+KGtleTogc3RyaW5nKTogVCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRlcGVuZGVuY2llc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwZW5kZW5jeSAke2tleX0gbm90IGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXNba2V5XSgpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBET01VdGlscyB7XHJcblxyXG5cclxuICAgIHN0YXRpYyBpc1NlbGVjdGlvbkluVGFibGVDZWxsKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24/LnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcclxuICAgICAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS50YWdOYW1lID09PSAnVEQnIHx8IChub2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUgPT09ICdUSCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIFRoZSBzZWxlY3Rpb24gc3RhcnRzIGluc2lkZSBhIHRhYmxlIGNlbGxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOyAgLy8gTW92ZSB1cCBpbiB0aGUgRE9NIHRyZWVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gU2VsZWN0aW9uIGlzIG5vdCBpbnNpZGUgYSB0YWJsZSBjZWxsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50LlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGFwdGVkIGZyb20gYSBTdGFja092ZXJmbG93IGFuc3dlci5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgdG8gY2hlY2suXHJcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHR3byBib29sZWFuIHByb3BlcnRpZXM6IGBhdFN0YXJ0YCBhbmQgYGF0RW5kYC5cclxuICAgICpcclxuICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzQ1MTQ2OC9jb250ZW50ZWRpdGFibGUtZGl2LWhvdy1jYW4taS1kZXRlcm1pbmUtaWYtdGhlLWN1cnNvci1pcy1hdC10aGUtc3RhcnQtb3ItZW5kLW8jYW5zd2VyLTc0Nzg0MjB8U3RhY2tPdmVyZmxvdyBSZXNwb25zZX1cclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gUmV0dXJucyB7IGF0U3RhcnQ6IHRydWUsIGF0RW5kOiBmYWxzZSB9IGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LCBidXQgbm90IGF0IHRoZSBlbmQuXHJcbiAgICAqIGNvbnN0IHJlc3VsdCA9IGdldFNlbGVjdGlvblRleHRJbmZvKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0YWJsZScpKTtcclxuICAgICovXHJcbiAgICBzdGF0aWMgZ2V0U2VsZWN0aW9uVGV4dEluZm8oZWw6IEhUTUxFbGVtZW50KTogeyBhdFN0YXJ0OiBib29sZWFuOyBhdEVuZDogYm9vbGVhbiB9IHtcclxuXHJcbiAgICAgICAgbGV0IGF0U3RhcnQgPSBmYWxzZSwgYXRFbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ID09IFwiXCIpIHtcclxuICAgICAgICAgICAgYXRTdGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7IGF0U3RhcnQsIGF0RW5kIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzZWxSYW5nZTogUmFuZ2UsIHRlc3RSYW5nZTogUmFuZ2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBzZWxSYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICB0ZXN0UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZXRFbmQoc2VsUmFuZ2Uuc3RhcnRDb250YWluZXIsIHNlbFJhbmdlLnN0YXJ0T2Zmc2V0KTtcclxuICAgICAgICAgICAgYXRTdGFydCA9IHRlc3RSYW5nZS50b1N0cmluZygpID09PSBcIlwiO1xyXG5cclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZXRTdGFydChzZWxSYW5nZS5lbmRDb250YWluZXIsIHNlbFJhbmdlLmVuZE9mZnNldCk7XHJcbiAgICAgICAgICAgIGF0RW5kID0gdGVzdFJhbmdlLnRvU3RyaW5nKCkgPT09IFwiXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBhdFN0YXJ0LCBhdEVuZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJbnNlcnRzIGEgbmV3IG5vZGUgaW50byB0aGUgRE9NIGltbWVkaWF0ZWx5IGFmdGVyIGEgc3BlY2lmaWVkIHJlZmVyZW5jZSBub2RlLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGR5bmFtaWNhbGx5IG1vZGlmeWluZyB0aGUgZG9jdW1lbnQgc3RydWN0dXJlIGJ5IGFkZGluZyBuZXcgY29udGVudFxyXG4gICAgKiBvciBjb21wb25lbnRzIGluIHJlbGF0aW9uIHRvIGV4aXN0aW5nIGVsZW1lbnRzLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBUaGUgbmV3IG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxyXG4gICAgKiBAcGFyYW0ge05vZGV9IHJlZmVyZW5jZU5vZGUgLSBUaGUgbm9kZSBhZnRlciB3aGljaCB0aGUgbmV3IG5vZGUgc2hvdWxkIGJlIGluc2VydGVkLlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgcGVyZm9ybXMgYSBET00gbWFuaXB1bGF0aW9uIG9wZXJhdGlvbi5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gU3VwcG9zZSB5b3Ugd2FudCB0byBpbnNlcnQgYSBuZXcgcGFyYWdyYXBoIGFmdGVyIGFuIGV4aXN0aW5nIGRpdiBlbGVtZW50OlxyXG4gICAgKiBjb25zdCBuZXdQYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAqIG5ld1BhcmFncmFwaC50ZXh0Q29udGVudCA9ICdIZWxsbywgd29ybGQhJztcclxuICAgICogY29uc3QgcmVmZXJlbmNlRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215RGl2Jyk7XHJcbiAgICAqIGluc2VydEFmdGVyKG5ld1BhcmFncmFwaCwgcmVmZXJlbmNlRGl2KTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSByZWZlcmVuY2VOb2RlIGhhcyBhIHBhcmVudCBub2RlLiBJZiBhIHBhcmVudCBub2RlIGV4aXN0cywgaXQgdXNlc1xyXG4gICAgKiBgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKWAgdG8gaW5zZXJ0IHRoZSBuZXdOb2RlIGludG8gdGhlIERPTSByaWdodCBhZnRlciB0aGUgcmVmZXJlbmNlTm9kZS5cclxuICAgICogVGhpcyBpcyBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nIGByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nYCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgaW5zZXJ0QmVmb3JlKClgLFxyXG4gICAgKiB3aGljaCBlZmZlY3RpdmVseSBwbGFjZXMgdGhlIG5ld05vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZmVyZW5jZU5vZGUgaW4gdGhlIGRvY3VtZW50J3Mgc3RydWN0dXJlLlxyXG4gICAgKiBJZiB0aGUgcmVmZXJlbmNlTm9kZSBoYXMgbm8gcGFyZW50LCB0aGUgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCBhcyBpbnNlcnRpb24gaXMgbm90IHBvc3NpYmxlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBpbnNlcnRBZnRlcihuZXdOb2RlOiBOb2RlLCByZWZlcmVuY2VOb2RlOiBOb2RlKSB7XHJcbiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICByZWZlcmVuY2VOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gRE9NIE5vZGUgaGFzIGFueSB2aXNpYmxlIHRleHQgY29udGVudC4gVGhlIGZ1bmN0aW9uIGNvbnNpZGVycyB0ZXh0IGNvbnRlbnQgZGlyZWN0bHkgd2l0aGluIHRoZSBub2RlXHJcbiAgICAqIGFzIHdlbGwgYXMgcmVjdXJzaXZlbHkgY2hlY2tpbmcgYWxsIGNoaWxkIG5vZGVzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBvciBhbnkgcGFydCBvZiBhIHN1YnRyZWVcclxuICAgICogaGFzIHRleHR1YWwgc2lnbmlmaWNhbmNlLCB3aGljaCBtaWdodCBhZmZlY3QgZGlzcGxheSBsb2dpYywgdmFsaWRhdGlvbiwgb3IgcHJvY2Vzc2luZy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIHRvIGNoZWNrIGZvciB0ZXh0IGNvbnRlbnQuXHJcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBub2RlIGl0c2VsZiBvciBhbnkgb2YgaXRzIGNoaWxkcmVuIGhhcyBub24tZW1wdHkgdGV4dCBjb250ZW50LCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFN1cHBvc2UgeW91IHdhbnQgdG8gY2hlY2sgaWYgYSBwYXJhZ3JhcGggZWxlbWVudCBpcyBlbXB0eSBvciBub3Q6XHJcbiAgICAqIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlUGFyYWdyYXBoJyk7XHJcbiAgICAqIGNvbnN0IGhhc0NvbnRlbnQgPSBoYXNUZXh0Q29udGVudChwYXJhZ3JhcGgpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnRG9lcyB0aGUgcGFyYWdyYXBoIGhhdmUgY29udGVudD8nLCBoYXNDb250ZW50KTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2hlY2tzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUgaXRzZWxmLiBJZiB0aGUgbm9kZSdzIHRleHRDb250ZW50LCB3aGVuIHRyaW1tZWQsIGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcsXHJcbiAgICAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUsIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHZpc2libGUgdGV4dC4gSWYgdGhlIGluaXRpYWwgY2hlY2sgZmFpbHMsIHRoZSBmdW5jdGlvbiB0aGVuIHJlY3Vyc2l2ZWx5XHJcbiAgICAqIGNoZWNrcyBlYWNoIGNoaWxkIG5vZGUgdG8gZGV0ZXJtaW5lIGlmIGFueSBjaGlsZCBjb250YWlucyB2aXNpYmxlIHRleHQuIFRoaXMgcmVjdXJzaW9uIGVuc3VyZXMgdGhhdCBldmVuIGRlZXBseSBuZXN0ZWQgdGV4dCBub2Rlc1xyXG4gICAgKiB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIHZpc2libGUgY29udGVudCBhcmUgYWNjb3VudGVkIGZvci4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBhdCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgZmluZGluZyB2aXNpYmxlIHRleHQsXHJcbiAgICAqIG9wdGltaXppbmcgdGhlIHNlYXJjaCBwcm9jZXNzIHdpdGhpbiBwb3RlbnRpYWxseSBsYXJnZSBET00gc3RydWN0dXJlcy5cclxuICAgICovXHJcbiAgICBzdGF0aWMgaGFzVGV4dENvbnRlbnQobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBub2RlLnRleHRDb250ZW50Py50cmltKCkgIT09ICcnIHx8XHJcbiAgICAgICAgICAgIChub2RlLmhhc0NoaWxkTm9kZXMoKSAmJiBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2Rlcykuc29tZShjaGlsZE5vZGUgPT4gdGhpcy5oYXNUZXh0Q29udGVudChjaGlsZE5vZGUpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENsb25lcyBhIHNwZWNpZmllZCBIVE1MRWxlbWVudCBhbmQgaW5zZXJ0cyB0aGUgY2xvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaW4gdGhlIERPTS5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGR1cGxpY2F0aW5nIGludGVyYWN0aXZlIGNvbXBvbmVudHMgb3IgY29udGVudCBibG9ja3Mgd2l0aGluIGEgZHluYW1pYyBpbnRlcmZhY2UuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgSFRNTEVsZW1lbnQgdG8gYmUgY2xvbmVkIGFuZCByZWluc2VydGVkLlxyXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgY2xvbmVkIEhUTUxFbGVtZW50IGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgbnVsbCBpZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWUgeW91IGhhdmUgYSBsaXN0IGl0ZW0gdGhhdCB5b3Ugd2FudCB0byBkdXBsaWNhdGU6XHJcbiAgICAqIGNvbnN0IGxpc3RJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGkubXktaXRlbScpO1xyXG4gICAgKiBjb25zdCBuZXdMaXN0SXRlbSA9IGNsb25lQW5kSW5zZXJ0QWZ0ZXIobGlzdEl0ZW0pO1xyXG4gICAgKiBpZiAobmV3TGlzdEl0ZW0pIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdJdGVtIHdhcyBjbG9uZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgKiB9XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGF0dGVtcHRzIHRvIGNsb25lIHRoZSBwcm92aWRlZCBgZWxlbWVudGAgdXNpbmcgYGNsb25lTm9kZSh0cnVlKWAsIHdoaWNoIGVuc3VyZXMgdGhhdCBhbGwgY2hpbGQgbm9kZXMgYW5kIGF0dHJpYnV0ZXMgYXJlIGNvcGllZC5cclxuICAgICogVGhlIGZ1bmN0aW9uIHRoZW4gY2hlY2tzIGlmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGhhcyBhIHBhcmVudCBub2RlLiBJZiBpdCBkb2VzIG5vdCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBzaW5jZSBpbnNlcnRpb24gY2Fubm90IHByb2NlZWQuXHJcbiAgICAqIElmIGEgcGFyZW50IG5vZGUgZXhpc3RzLCB0aGUgY2xvbmVkIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgYHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKClgLlxyXG4gICAgKiBUaGlzIGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gZWZmZWN0aXZlbHkgZHVwbGljYXRlIGFuZCBwbGFjZSB0aGUgbmV3IGVsZW1lbnQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gd2l0aGluIHRoZSBET00gdHJlZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgY2xvbmVBbmRJbnNlcnRBZnRlcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgY2xvbmVkRWxlbWVudCA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShjbG9uZWRFbGVtZW50LCBlbGVtZW50Lm5leHRTaWJsaW5nKTtcclxuXHJcbiAgICAgICAgaWYgKGNsb25lZEVsZW1lbnQuaWQpIHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjbG9uZWRFbGVtZW50LmlkLm1hdGNoKC9eKC4rPyktLyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdO1xyXG4gICAgICAgICAgICAgICAgY2xvbmVkRWxlbWVudC5pZCA9IHByZWZpeCArICctJyArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNsb25lZEVsZW1lbnQuaWQgPSBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZWRFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICogU2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIENTUyBjbGFzcy5cclxuICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdXAgZnJvbSB0aGUgYWN0aXZlIGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlIGFuZCBjaGVja3MgZWFjaCBhbmNlc3RvciB0byBzZWUgaWYgaXQgbWF0Y2hlc1xyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBUaGUgY2xhc3MgbmFtZSB0byBtYXRjaCBhZ2FpbnN0IGFuY2VzdG9yIGVsZW1lbnRzLlxyXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcywgb3IgbnVsbCBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGZpbmQgdGhlIGNsb3Nlc3QgZm9ybSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGlucHV0IGZpZWxkOlxyXG4gICAgKiBjb25zdCBjbG9zZXN0Rm9ybSA9IGZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKCdteS1mb3JtLWNsYXNzJyk7XHJcbiAgICAqIGNvbnNvbGUubG9nKGNsb3Nlc3RGb3JtKTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IHVzaW5nIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YC5cclxuICAgICogSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGVsZW1lbnQsIG9yIHRoZSBhY3RpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBhbmNlc3RvciB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MsXHJcbiAgICAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwuIE90aGVyd2lzZSwgaXQgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgYW5jZXN0b3JzIG9mIHRoZSBhY3RpdmUgZWxlbWVudCB1bnRpbCBpdCBmaW5kc1xyXG4gICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBvciByZWFjaGVzIHRoZSByb290IG9mIHRoZSBkb2N1bWVudC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGNvbXBsZXhcclxuICAgICogZm9ybXMgb3IgaW50ZXJhY3RpdmUgYXJlYXMgd2hlcmUgY29udGV4dC1iYXNlZCBhY3Rpb25zIGRlcGVuZCBvbiBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgRE9NIHN0cnVjdHVyZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQ6IE5vZGUgfCBudWxsID0gYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJlxyXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSB0ZXh0IG5vZGUsIGl0IGNsaW1icyB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCB0aGUgY2xvc2VzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY29udGV4dC1zZW5zaXRpdmUgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gZG9jdW1lbnQgZWRpdGluZyBvciBwcm9jZXNzaW5nIGVudmlyb25tZW50cy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIFRoZSBjbGFzcyBuYW1lIHRvIHNlYXJjaCBmb3IgaW4gYW5jZXN0b3IgZWxlbWVudHMuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudCBpcyBmb3VuZC5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgc2VsZWN0aW9uIGFuZCBpZiBpdCBoYXMgYXQgbGVhc3Qgb25lIHJhbmdlXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIHNlbGVjdGlvblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudDogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBhIHRleHQgbm9kZSwgc3RhcnQgZnJvbSBpdHMgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBjbG9zZXN0IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZWFycmFuZ2UgY29udGVudCBhcm91bmQgdGhlIHNwbGl0IHBvaW50IGJhc2VkIG9uIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJvY2VzcyBvZiBzcGxpdHRpbmcgdGhlIGNvbnRlbnQgYXQgdGhlIGN1cnNvcixcclxuICAgICogdGhlbiByZWFycmFuZ2luZyB0aGUgY29udGVudCBieSBkZWxldGluZyBhcHByb3ByaWF0ZSBwYXJ0cyBpbiB0aGUgb3JpZ2luYWxcclxuICAgICogYW5kIGNsb25lZCBub2Rlcy4gSXQgZW5zdXJlcyB0aGF0IGFmdGVyIHRoZSBzcGxpdCwgdGhlIG9yaWdpbmFsIG5vZGUgY29udGFpbnNcclxuICAgICogb25seSB0aGUgY29udGVudCBiZWZvcmUgdGhlIGN1cnNvciBhbmQgdGhlIGNsb25lZCBub2RlIGNvbnRhaW5zIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIEltcG9ydGFudGx5LCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyB0aGUgdmFsaWRpdHkgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgYWZ0ZXIgbW9kaWZpY2F0aW9ucyxcclxuICAgICogcHJldmVudGluZyBhbnkgZGlzcnVwdGlvbnMgaW4gZG9jdW1lbnQgc3RydWN0dXJlIHRoYXQgY291bGQgYWZmZWN0IHJlbmRlcmluZyBvciBmdXJ0aGVyIHNjcmlwdGluZy5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gY3VycmVudE5vZGUgLSBUaGUgbm9kZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBjb250ZW50IGJlZm9yZSB0aGUgc3BsaXQuXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIFRoZSBjbG9uZWQgbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29udGVudCBhZnRlciB0aGUgc3BsaXQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBtb2RpZmllcyBET00gbm9kZXMgZGlyZWN0bHkuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyBjdXJyZW50Tm9kZSBpcyBhbiBlbGVtZW50IHdpdGggdGV4dCBjb250ZW50IGFuZCBhIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gaXQsXHJcbiAgICAqIC8vIGFuZCBuZXdOb2RlIGlzIGl0cyBjbG9uZWQgY291bnRlcnBhcnQ6XHJcbiAgICAqIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlLCBuZXdOb2RlKTtcclxuICAgICogXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgcGFydCBvZiBhbiBlZGl0aW5nIHN5c3RlbSB3aGVyZSBjb250ZW50IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5XHJcbiAgICAqIHNwbGl0IGFuZCByZWFycmFuZ2VkLiBJdCB1c2VzIGEgY3Vyc29yLWJhc2VkIGFwcHJvYWNoIHRvIGRldGVybWluZSB0aGUgc3BsaXQgcG9pbnQsXHJcbiAgICAqIHJlbW92ZXMgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGNsb25lIGJhc2VkIG9uIHRoZSBjdXJzb3IncyBwb3NpdGlvbixcclxuICAgICogYW5kIHNldHMgdXAgdGhlIG5vZGVzIGZvciBzdWJzZXF1ZW50IHVzZXIgaW50ZXJhY3Rpb25zLiBUaGUgRE9NIHJlbWFpbnMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLFxyXG4gICAgKiBlbnN1cmluZyB0aGF0IHN1YnNlcXVlbnQgb3BlcmF0aW9ucywgc3VjaCBhcyBmdXJ0aGVyIHNwbGl0cyBvciBzdHlsZSBjaGFuZ2VzLCBjYW4gYmUgcGVyZm9ybWVkXHJcbiAgICAqIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3Mgb3IgY29ycmVjdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlOiBOb2RlLCBuZXdOb2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBET01VdGlscy5nZXRDdXJzb3JQb3NpdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZXMxID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbFxyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMVsxXSk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIGNsb25lXHJcbiAgICAgICAgaWYgKG5ld05vZGUgJiYgY3Vyc29yUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3JQb3NpdGlvbihuZXdOb2RlLCBjdXJzb3JQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZXMyID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihuZXdOb2RlIGFzIE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMlswXSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5kZWxldGVGcm9tRG9jdW1lbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhbGN1bGF0ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBub2RlLiBUaGUgcG9zaXRpb24gaXMgZGV0ZXJtaW5lZFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBub2RlIHRvIHRoZSBjdXJzb3IncyBsb2NhdGlvbiB3aXRoaW4gdGhlIG5vZGUuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgZXNzZW50aWFsIGZvciBzY2VuYXJpb3Mgd2hlcmUgcHJlY2lzZSB0ZXh0IG1hbmlwdWxhdGlvbiBpcyByZXF1aXJlZCwgc3VjaCBhc1xyXG4gICAgKiB0ZXh0IGVkaXRvcnMgb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvbnRlbnQgZmllbGRzLlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgd2l0aGluIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLlxyXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gVGhlIHplcm8tYmFzZWQgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IncyBwb3NpdGlvbiB3aXRoaW4gdGhlIG5vZGUsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgb3IgaWYgdGhlcmUgYXJlIGFueSBpc3N1ZXNcclxuICAgICogcmV0cmlldmluZyB0aGUgc2VsZWN0aW9uLlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBhbmQgdGhlIGN1cnNvciBpcyBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IHBvc2l0aW9uID0gZ2V0Q3Vyc29yUG9zaXRpb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215LWVkaXRhYmxlLWRpdicpKTtcclxuICAgICogY29uc29sZS5sb2coJ0N1cnNvciBwb3NpdGlvbjonLCBwb3NpdGlvbik7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgcmFuZ2UgYW5kIGRldGVybWluZXMgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZVxyXG4gICAgKiBnaXZlbiBub2RlLiBJZiBhbiBpbnRlcnNlY3Rpb24gaXMgZm91bmQsIGl0IHVzZXMgYSBUcmVlV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSB0ZXh0IG5vZGVzIHVuZGVyXHJcbiAgICAqIHRoZSBnaXZlbiBub2RlLCBjb3VudGluZyBjaGFyYWN0ZXJzIHVudGlsIGl0IHJlYWNoZXMgdGhlIHN0YXJ0IGNvbnRhaW5lciBvZiB0aGUgcmFuZ2UuXHJcbiAgICAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYW4gYWNjdXJhdGUgY2hhcmFjdGVyIGluZGV4IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIG5lc3RlZCBlbGVtZW50c1xyXG4gICAgKiBvciBtaXhlZCBjb250ZW50ICh0ZXh0IGNvbWJpbmVkIHdpdGggZWxlbWVudHMpLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDdXJzb3JQb3NpdGlvbihub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiBub2RlID0+IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGNoYXJDb3VudCA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgPT09IHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnQgKz0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hhckNvdW50ICs9IGN1cnJlbnROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2hhckNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gd2l0aGluIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBiYXNlZCBvbiBhIGNoYXJhY3RlciBpbmRleC5cclxuICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHJhbmdlIGFuZCB1c2VzIGEgVHJlZVdhbGtlciB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSB0ZXh0IG5vZGVzXHJcbiAgICAqIHdpdGhpbiB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBleGFjdCBsb2NhdGlvbiB0byBzZXQgdGhlIGN1cnNvci4gVGhlIHBvc2l0aW9uIGlzIHNldFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIFRoZSB6ZXJvLWJhc2VkIGNoYXJhY3RlciBpbmRleCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwb3NpdGlvbmVkLlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbW9kaWZpZXMgdGhlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBwYXJhZ3JhcGggZWxlbWVudCBhbmQgeW91IHdhbnQgdG8gc2V0IHRoZSBjdXJzb3IgYXQgdGhlIDEwdGggY2hhcmFjdGVyOlxyXG4gICAgKiBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktcGFyYWdyYXBoJyk7XHJcbiAgICAqIHNldEN1cnNvclBvc2l0aW9uKHBhcmFncmFwaCwgMTApO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoZSBmdW5jdGlvbiBjbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMsIGNhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdGV4dCBub2RlIGFuZCBvZmZzZXQgd2l0aGluIHRoYXQgbm9kZSxcclxuICAgICogYW5kIHRoZW4gc2V0cyBhIG5ldyByYW5nZSBhdCB0aGF0IHBvc2l0aW9uLiBJdCBlbnN1cmVzIHRoYXQgdGhlIGN1cnNvciBpcyBtb3ZlZCBhY2N1cmF0ZWx5LCBldmVuIHdpdGhpblxyXG4gICAgKiBjb21wbGV4IG5lc3RlZCBjb250ZW50IHN0cnVjdHVyZXMuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgdGV4dCBlZGl0aW5nIGFwcGxpY2F0aW9ucyBhbmQgZHluYW1pY1xyXG4gICAgKiBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtcyB3aGVyZSBwcmVjaXNlIGN1cnNvciBjb250cm9sIGlzIHJlcXVpcmVkLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50OiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiAoKSA9PiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICBsZXQgY3VycmVudFBvcyA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvcyArIHRleHRMZW5ndGggPj0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGN1cnJlbnROb2RlLCBwb3NpdGlvbiAtIGN1cnJlbnRQb3MpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50UG9zICs9IHRleHRMZW5ndGg7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgYXR0cmlidXRlIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGVudCBibG9jayBpbiB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWQgaW4gY29udGV4dHMgd2hlcmUgZGlmZmVyZW50IGFjdGlvbnMgb3IgYmVoYXZpb3JzIGFyZSBjb25kaXRpb25lZFxyXG4gICAgKiB1cG9uIHRoZSB0eXBlIG9mIGNvbnRlbnQgdGhlIHVzZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aC5cclxuICAgICpcclxuICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSB2YWx1ZSBvZiB0aGUgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSBjb250ZW50IGVsZW1lbnQsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBkb2VzIG5vdCBleGlzdC5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gSWYgeW91IG5lZWQgdG8gYXBwbHkgc3BlY2lmaWMgbG9naWMgYmFzZWQgb24gdGhlIHR5cGUgb2YgY29udGVudCBjdXJyZW50bHkgYmVpbmcgZWRpdGVkOlxyXG4gICAgKiBjb25zdCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQoKTtcclxuICAgICogaWYgKGNvbnRlbnRUeXBlID09PSAncCcpIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdFZGl0aW5nIGEgdGV4dCBibG9jaycpO1xyXG4gICAgKiB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnaDEnKSB7XHJcbiAgICAqICAgICBjb25zb2xlLmxvZygnRWRpdGluZyBhbiBoZWFkaW5nJyk7XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IGNhbGxpbmcgYGdldEN1cnJlbnRBY3RpdmVCbG9jaygpYCwgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBibG9jayBlbGVtZW50XHJcbiAgICAqIGluIHRoZSBVSS4gSXQgdGhlbiBzZWFyY2hlcyBmb3IgYW4gZWxlbWVudCB3aXRoaW4gdGhpcyBibG9jayB3aXRoIHRoZSBjbGFzcyAnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcsXHJcbiAgICAqIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGNhcnJ5IGEgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjb250ZW50IChlLmcuLCAndGV4dCcsICdpbWFnZScsIGV0Yy4pLlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gcmV0cmlldmVzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50LlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDb250ZW50VHlwZUZyb21BY3RpdmVFbGVtZW50KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFjb250ZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiKTtcclxuICAgICAgICByZXR1cm4gY29udGVudFR5cGUgfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU3BsaXRzIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcm9vdCBub2RlIGludG8gdHdvIHJhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0d28gcmFuZ2VzOiBvbmUgZm9yIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCBvbmUgZm9yIHRoZSBjb250ZW50IGFmdGVyLlxyXG4gICAgKiBUaGUgb3BlcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHByb3ZpZGVkIHJvb3Qgbm9kZSwgZW5zdXJpbmcgdGhhdCB0aGUgZGl2aXNpb24gcmVzcGVjdHNcclxuICAgICogdGhlIHN0cnVjdHVyYWwgaW50ZWdyaXR5IG9mIHRoZSBjb250ZW50IHdpdGhpbiB0aGF0IG5vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IHJvb3ROb2RlIC0gVGhlIHJvb3Qgbm9kZSB3aXRoaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgdG8gYmUgc3BsaXQuIFRoaXMgbm9kZSBzZXRzIHRoZSBib3VuZGFyeSBmb3IgdGhlIHNwbGl0IG9wZXJhdGlvbi5cclxuICAgICogQHJldHVybnMge1JhbmdlW119IEFuIGFycmF5IG9mIHR3byBgUmFuZ2VgIG9iamVjdHM6IHRoZSBmaXJzdCBjb250YWluaW5nIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yLCBhbmQgdGhlIHNlY29uZCBjb250YWluaW5nIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWUgdGhlcmUgaXMgYSBkaXYgZWxlbWVudCB3aXRoIGNvbnRlbnQgYW5kIGEgY3Vyc29yIHBvc2l0aW9uIHNvbWV3aGVyZSBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudERpdicpO1xyXG4gICAgKiBjb25zdCByYW5nZXMgPSBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjb250ZW50RGl2KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYmVmb3JlIGN1cnNvcjonLCByYW5nZXNbMF0uY2xvbmVDb250ZW50cygpLnRleHRDb250ZW50KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYWZ0ZXIgY3Vyc29yOicsIHJhbmdlc1sxXS5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQpO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbidzIHJhbmdlIGFuZCBjaGVja3MgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCByb290Tm9kZS5cclxuICAgICogSWYgc28sIGl0IGNvbnN0cnVjdHMgdHdvIG5ldyByYW5nZXMgdXNpbmcgdGhlIHJvb3ROb2RlIGFzIHRoZSBjb250ZXh0OlxyXG4gICAgKiAtIFRoZSBmaXJzdCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBzdGFydCBvZiByb290Tm9kZSB1cCB0byB0aGUgY3Vyc29yJ3Mgc3RhcnQuXHJcbiAgICAqIC0gVGhlIHNlY29uZCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBjdXJzb3IncyBlbmQgdG8gdGhlIGVuZCBvZiByb290Tm9kZSwgb3B0aW9uYWxseSBleHRlbmRpbmcgdG8gdGhlIGxhc3QgY2hpbGQgb2Ygcm9vdE5vZGUgaWYgbmVjZXNzYXJ5LlxyXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGludm9sdmluZyByaWNoIHRleHQgZWRpdGluZyBvciBhbnkgc2NlbmFyaW8gd2hlcmUgY29udGVudCBuZWVkcyB0byBiZSBzZWdtZW50ZWQgYXJvdW5kIGEgdXNlcidzIHBvaW50IG9mIGZvY3VzLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihyb290Tm9kZTogTm9kZSk6IFJhbmdlW10ge1xyXG4gICAgICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiByYW5nZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUJlZm9yZS5zZWxlY3ROb2RlQ29udGVudHMocm9vdE5vZGUpO1xyXG4gICAgICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZUFmdGVyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhyb290Tm9kZSk7XHJcbiAgICAgICAgcmFuZ2VBZnRlci5zZXRTdGFydChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCk7XHJcbiAgICAgICAgaWYgKHJvb3ROb2RlLmxhc3RDaGlsZCkge1xyXG4gICAgICAgICAgICByYW5nZUFmdGVyLnNldEVuZEFmdGVyKHJvb3ROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByYW5nZXMucHVzaChyYW5nZUJlZm9yZSk7XHJcbiAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2VBZnRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiBhIHNwZWNpZmllZCBlZGl0YWJsZSBIVE1MIGVsZW1lbnQuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIFxyXG4gICAgKiBjb250ZW50LWVkaXRhYmxlLCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIHVzZXIgaW50ZXJmYWNlc1xyXG4gICAgKiB3aGVyZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzIGFyZSBkeW5hbWljYWxseSBlbmFibGVkLCBhbmQgaW1tZWRpYXRlIHVzZXIgaW50ZXJhY3Rpb24gaXMgZXhwZWN0ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVkaXRhYmxlRWxlbWVudCAtIFRoZSBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIHN0YXJ0LlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbWFuaXB1bGF0ZXMgdGhlIERPTSBhbmQgc2VsZWN0aW9uIHN0YXRlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGNvbnRlbnQtZWRpdGFibGUgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudDpcclxuICAgICogY29uc3QgZWRpdGFibGVQYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGVQYXJhZ3JhcGgnKTtcclxuICAgICogcGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZWRpdGFibGVQYXJhZ3JhcGgpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgaWYgdGhlIGBlZGl0YWJsZUVsZW1lbnRgIGlzIGNvbnRlbnQtZWRpdGFibGUuIElmIGl0IGlzIG5vdCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cclxuICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZWRpdGFibGUsIGl0OlxyXG4gICAgKiAxLiBTZXRzIGZvY3VzIG9uIHRoZSBlbGVtZW50IHRvIGVuc3VyZSB0aGF0IGl0IGlzIHJlYWR5IGZvciB1c2VyIGlucHV0LlxyXG4gICAgKiAyLiBDcmVhdGVzIGEgbmV3IFJhbmdlIG9iamVjdCwgc2VsZWN0cyBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50LCBhbmQgY29sbGFwc2VzIHRoaXMgcmFuZ2UgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgKiAzLiBDbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMgYW5kIGFwcGxpZXMgdGhlIG5ldyByYW5nZSwgZWZmZWN0aXZlbHkgcG9zaXRpb25pbmcgdGhlIGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgYXBwcm9hY2ggaXMgY3J1Y2lhbCBmb3IgZWRpdGluZyBpbnRlcmZhY2VzLCBlbnN1cmluZyB0aGF0IHVzZXIgaW50ZXJhY3Rpb24gaXMgaW50dWl0aXZlIGFuZCBpbW1lZGlhdGVseSByZXNwb25zaXZlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChlZGl0YWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0YWJsZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgaXMgbm90IGVkaXRhYmxlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBmb2N1cyBhbmQgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQgd2l0aGluIGEgc3BlY2lmaWVkIGNvbnRlbnQtZWRpdGFibGUgSFRNTCBlbGVtZW50LlxyXG4gICAgKiBUaGlzIG1ldGhvZCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gaGFuZGxlIGNvbnRlbnQtZWRpdGFibGUgZWxlbWVudHMgYnkgcG9zaXRpb25pbmcgdGhlIGN1cnNvclxyXG4gICAgKiBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50LCByZWdhcmRsZXNzIG9mIHRoZSBjb250ZW50J3MgY29tcG9zaXRpb24gKHRleHQsIGVsZW1lbnRzLCBldGMuKS5cclxuICAgICpcclxuICAgICogVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyBjb250ZW50LWVkaXRhYmxlLiBJZiBpdCBpcywgaXQgdXNlcyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYFxyXG4gICAgKiB0byBlbnN1cmUgdGhhdCBhbGwgRE9NIHVwZGF0ZXMgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHNldHRpbmcgZm9jdXMgYW5kIGFkanVzdGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uLlxyXG4gICAgKiBJdCB0aGVuIGNyZWF0ZXMgYSByYW5nZSBzcGFubmluZyB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCwgZmluZHMgdGhlIGRlZXBlc3QgbGFzdCBub2RlLCBhbmQgc2V0cyB0aGVcclxuICAgICogY3Vyc29yIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhpcyBub2RlLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHJpY2ggdGV4dCBlZGl0b3JzIG9yIGFueSBhcHBsaWNhdGlvblxyXG4gICAgKiB0aGF0IHJlcXVpcmVzIHByZWNpc2UgY29udHJvbCBvdmVyIGN1cnNvciBwbGFjZW1lbnQgaW4gZWRpdGFibGUgY29udGVudC5cclxuICAgICpcclxuICAgICogSWYgdGhlIGVsZW1lbnQgaXMgbm90IGNvbnRlbnQtZWRpdGFibGUsIGEgd2FybmluZyBpcyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50IGNhbm5vdCBiZSBlZGl0ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRCbG9jayAtIFRoZSBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudCB3aGVyZSB0aGUgY3Vyc29yIHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBlbmQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRCbG9jay5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBsYXN0Tm9kZTogTm9kZSB8IG51bGwgPSBjb250ZW50QmxvY2s7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobGFzdE5vZGUubGFzdENoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBsYXN0Tm9kZS5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGxhc3ROb2RlLCBsYXN0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBsYXN0Tm9kZS50ZXh0Q29udGVudCEubGVuZ3RoIDogMCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgZWxlbWVudCBpcyBub3QgZWRpdGFibGUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk6IEVsZW1lbnQgfCBudWxsIHtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jbG9zZXN0KFwiLmJsb2NrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKHBhcmVudFNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgRWxlbWVudCkuY2xvc2VzdChwYXJlbnRTZWxlY3RvcikgIT09IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZUZpbHRlclRleHQoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGxhc3RTbGFzaFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgY29udGFpbmVyLnBhcmVudEVsZW1lbnQ/LmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBjb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgb2Zmc2V0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRCZWZvcmVDdXJzb3IgPSBub2RlLnRleHRDb250ZW50Py5zdWJzdHJpbmcoMCwgb2Zmc2V0KSB8fCBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaFBvc2l0aW9uID0gdGV4dEJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZihcIi9cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgbGFzdFNsYXNoUG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlLnBhcmVudE5vZGU/LnRleHRDb250ZW50Py5sYXN0SW5kZXhPZihcIi9cIikgfHwgLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgY3Vyc29yIGlzIG5vdCB3aXRoaW4gYSBjb250ZW50RWRpdGFibGUgZWxlbWVudCBvciBhIHRleHQgbm9kZS5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJObyBhY3RpdmUgc2VsZWN0aW9uLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsYXN0U2xhc2hQb3NpdGlvbjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlEYXRhQ29udGVudFR5cGUoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdGFDb250ZW50VHlwZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5kYXRhc2V0LmNvbnRlbnRUeXBlID09PSBkYXRhQ29udGVudFR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNsaWNrZWRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmRhdGFzZXQuY29udGVudFR5cGUgPT09IGRhdGFDb250ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudDogTW91c2VFdmVudCwgaWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudCE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGlja2VkRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQ6IE1vdXNlRXZlbnQsIGNsYXNzS2V5OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBjbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0tleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNsaWNrZWRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0tleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgdGFyZ2V0OiBFbGVtZW50IHwgbnVsbCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQYXJlbnRUYXJnZXRCeVNlbGVjdG9yKGV2ZW50OiBNb3VzZUV2ZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCB0YXJnZXQ6IEVsZW1lbnQgfCBudWxsID0gKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpID8gZXZlbnQudGFyZ2V0IDogZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSA/IGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0UGFyZW50RnJvbVNlbGVjdGlvbihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uIHwgbnVsbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIFxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGxldCByYW5nZTogUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICBsZXQgY29tbW9uQW5jZXN0b3JDb250YWluZXI6IE5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgIFxyXG4gICAgICAgIGlmIChjb21tb25BbmNlc3RvckNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgY29tbW9uQW5jZXN0b3JDb250YWluZXIubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGxldCBwYXJlbnRFbGVtZW50OiBFbGVtZW50IHwgbnVsbCA9IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudFxyXG4gICAgICAgICAgICA/IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXHJcbiAgICAgICAgICAgIDogY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgICAgIHdoaWxlIChwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3Nlc1dpdGhQcmVmaXgoZWxlbWVudDogRWxlbWVudCwgcHJlZml4OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBjbGFzc2VzVG9SZW1vdmUgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KS5maWx0ZXIoY2xzID0+IGNscy5zdGFydHNXaXRoKHByZWZpeCkpO1xyXG4gICAgICAgIGNsYXNzZXNUb1JlbW92ZS5mb3JFYWNoKGNscyA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzVGFyZ2V0RGVzY2VuZGFudE9mU2VsZWN0b3IoZXZlbnQ6IEV2ZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFRleHQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0ID0gKGV2ZW50LnRhcmdldCBhcyBUZXh0KS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSB0YXJnZXQuY2xvc2VzdChzZWxlY3Rvcik7XHJcblxyXG4gICAgICAgIHJldHVybiBhbmNlc3RvciAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmllZCBzZWxlY3RvciwgY2hlY2tpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCBpdHMgZGVzY2VuZGFudHMuXHJcbiAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLCBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoLlxyXG4gICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIENTUyBzZWxlY3RvciB0byBtYXRjaCBhZ2FpbnN0LlxyXG4gICAgKiBAcmV0dXJucyBUaGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCBpbmNsdWRpbmcgdGhlIGVsZW1lbnQgaXRzZWxmLCBvciBudWxsIGlmIG5vIG1hdGNoIGlzIGZvdW5kLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZihlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGUgZWxlbWVudCBpdHNlbGYgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm90LCB1c2UgdGhlIHN0YW5kYXJkIHF1ZXJ5U2VsZWN0b3IgdG8gZmluZCBhIG1hdGNoaW5nIGRlc2NlbmRhbnRcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzdGF0aWMgc2FuaXRpemVDb250ZW50RWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vICAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICAvLyAgICAgaWYgKGNvbnRlbnQuZW5kc1dpdGgoJzxicj4nKSkge1xyXG4gICAgLy8gICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQuc2xpY2UoMCwgLTQpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgc2FuaXRpemVDb250ZW50RWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2hvdWxkUmVzdG9yZUNhcmV0ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGNhcmV0UG9zID0gMDtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRW5kc0F0Q29udGVudEVuZCA9IHJhbmdlLmVuZE9mZnNldCA9PT0gZWxlbWVudC5pbm5lclRleHQubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlRW5kc0F0Q29udGVudEVuZCAmJiBjb250ZW50LmVuZHNXaXRoKCc8YnI+JykpIHtcclxuICAgICAgICAgICAgICAgIHNob3VsZFJlc3RvcmVDYXJldCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjYXJldFBvcyA9IHJhbmdlLmVuZE9mZnNldDsgLy8gTWFudGVyIGEgcG9zacOnw6NvIG9yaWdpbmFsIGRvIGNhcmV0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZXIgPGJyPiBmaW5hbCwgc2UgZXhpc3RpciwgdXNhbmRvIG1hbmlwdWxhw6fDo28gZG8gRE9NXHJcbiAgICAgICAgaWYgKGNvbnRlbnQuZW5kc1dpdGgoJzxicj4nKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0Q2hpbGQgPSBlbGVtZW50Lmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubm9kZU5hbWUgPT09ICdCUicpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobGFzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZFJlc3RvcmVDYXJldCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IG5ldyBSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZXMgPSB0aGlzLmdldFRleHROb2Rlc0luKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBsZXQgY2hhckNvdW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGV4dE5vZGUgb2YgdGV4dE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlTGVuZ3RoID0gdGV4dE5vZGUubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJDb3VudCArIG5vZGVMZW5ndGggPj0gY2FyZXRQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgY2FyZXRQb3MgLSBjaGFyQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZCh0ZXh0Tm9kZSwgY2FyZXRQb3MgLSBjaGFyQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2hhckNvdW50ICs9IG5vZGVMZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGV4dE5vZGVzSW4obm9kZTogTm9kZSk6IFRleHRbXSB7XHJcbiAgICAgICAgbGV0IHRleHROb2RlczogVGV4dFtdID0gW107XHJcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHRleHROb2Rlcy5wdXNoKG5vZGUgYXMgVGV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRleHROb2RlcyA9IHRleHROb2Rlcy5jb25jYXQodGhpcy5nZXRUZXh0Tm9kZXNJbihjaGlsZHJlbltpXSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0UHJldmlvdXNDb250ZW50RWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFsbENvbnRlbnRFZGl0YWJsZXM6IEhUTUxFbGVtZW50W10gPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBhbGxDb250ZW50RWRpdGFibGVzLmluZGV4T2YoZWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudEVkaXRhYmxlc1tpbmRleCAtIDFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmV4dENvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBhbGxDb250ZW50RWRpdGFibGVzLmluZGV4T2YoZWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGluZGV4IDwgYWxsQ29udGVudEVkaXRhYmxlcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxDb250ZW50RWRpdGFibGVzW2luZGV4ICsgMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwYXJlbnQgPSBhY3RpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIERPTVV0aWxzLmZpbmRDb250ZW50RWRpdGFibGVJbkRlc2NlbmRhbnRzKGFjdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kQ29udGVudEVkaXRhYmxlSW5EZXNjZW5kYW50cyhlbGVtZW50OiBFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBpZiAoKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBlbGVtZW50LmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBET01VdGlscy5maW5kQ29udGVudEVkaXRhYmxlSW5EZXNjZW5kYW50cyhjaGlsZCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNhdmVDYXJldFBvc2l0aW9uMmQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIgfSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgY2hhckluZGV4ID0gQXJyYXkuZnJvbShlbGVtZW50LnRleHRDb250ZW50IHx8ICcnKS5zbGljZSgwLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0KS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGNoYXJJbmRleCwgaG9yaXpvbnRhbFBvczogcmVjdC5sZWZ0IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGNoYXJJbmRleDogMCwgaG9yaXpvbnRhbFBvczogMCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjogeyBjaGFySW5kZXg6IG51bWJlciwgaG9yaXpvbnRhbFBvczogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGVsZW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcclxuICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICAgICAgbGV0IGJlc3ROb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgbGV0IGJlc3RPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLm5vZGVWYWx1ZSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVzdFJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC5sZWZ0IC0gcG9zaXRpb24uaG9yaXpvbnRhbFBvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gaG9yaXpvbnRhbERpc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBjbG9zZSBlbm91Z2gsIGJyZWFrIGVhcmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCA1KSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYmVzdE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgc2F2ZUNhcmV0UG9zaXRpb24zZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFySW5kZXggPSBBcnJheS5mcm9tKGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpLnNsaWNlKDAsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQpLmxlbmd0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgY2hhckluZGV4LCBob3Jpem9udGFsUG9zOiByZWN0LmxlZnQsIHZlcnRpY2FsUG9zOiByZWN0LnRvcCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBjaGFySW5kZXg6IDAsIGhvcml6b250YWxQb3M6IDAsIHZlcnRpY2FsUG9zOiAwIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlc3RvcmVDYXJldFBvc2l0aW9uM2QoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIsIHZlcnRpY2FsUG9zOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xyXG4gICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE5vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUubm9kZVZhbHVlKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKHRlc3RSZWN0LmxlZnQgLSBwb3NpdGlvbi5ob3Jpem9udGFsUG9zKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3RhbmNlID0gTWF0aC5hYnModGVzdFJlY3QudG9wIC0gcG9zaXRpb24udmVydGljYWxQb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsRGlzdGFuY2UgPSBNYXRoLnNxcnQoaG9yaXpvbnRhbERpc3RhbmNlICoqIDIgKyB2ZXJ0aWNhbERpc3RhbmNlICoqIDIpOyAgLy8gVXNlIEV1Y2xpZGVhbiBkaXN0YW5jZVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxEaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSB0b3RhbERpc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBjbG9zZSBlbm91Z2gsIGJyZWFrIGVhcmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbERpc3RhbmNlIDwgNSkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJlc3ROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChiZXN0Tm9kZSwgYmVzdE9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzdGF0aWMgbWVyZ2VBbmROb3JtYWxpemVJbmxpbmVFbGVtZW50cyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIC8vICAgICBlbGVtZW50Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBtZXJnZUlubGluZUVsZW1lbnRzID0gKG5vZGU6IENoaWxkTm9kZSkgPT4ge1xyXG4gICAgLy8gICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBbJ1NQQU4nLCAnQ09ERScsICdFTScsICdTVFJPTkcnLCAnQicsICdJJ10uaW5jbHVkZXMoY3VycmVudE5vZGUubm9kZU5hbWUpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbWVyZ2VJbmxpbmVFbGVtZW50cyhjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbmV4dE5vZGUubm9kZU5hbWUgPT09IGN1cnJlbnROb2RlLm5vZGVOYW1lKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0Tm9kZS5maXJzdENoaWxkKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5hcHBlbmRDaGlsZChuZXh0Tm9kZS5maXJzdENoaWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlVG9SZW1vdmUgPSBuZXh0Tm9kZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbm9kZVRvUmVtb3ZlLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKG5vZGVUb1JlbW92ZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0U2libGluZztcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH07XHJcblxyXG4gICAgLy8gICAgIG1lcmdlSW5saW5lRWxlbWVudHMoZWxlbWVudCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3RhdGljIG1lcmdlSW5saW5lRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBlbGVtZW50Lm5vcm1hbGl6ZSgpOyAgLy8gTm9ybWFsaXphIG9zIG7Ds3MgZGUgdGV4dG8gcHJpbWVpcm9cclxuXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVMaXN0T2Y8Q2hpbGROb2RlPiA9IGVsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IGNoaWxkcmVuW2ldIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKFsnU1BBTicsICdDT0RFJywgJ0VNJywgJ1NUUk9ORycsICdCJywgJ0knXS5pbmNsdWRlcyhjaGlsZEVsZW1lbnQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxICYmIGNoaWxkRWxlbWVudC5uZXh0U2libGluZyAmJiBjaGlsZEVsZW1lbnQubmV4dFNpYmxpbmcubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkRWxlbWVudC5ub2RlTmFtZSA9PT0gKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkubm9kZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjaGlsZEVsZW1lbnQubmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50LmFwcGVuZENoaWxkKChjaGlsZEVsZW1lbnQubmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpLmZpcnN0Q2hpbGQhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLm1lcmdlSW5saW5lRWxlbWVudHMoY2hpbGRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gJy4vZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUnO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tICcuL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3InO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cCB9IGZyb20gJy4vYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzJztcclxuaW1wb3J0IHsgWkluZGV4IH0gZnJvbSAnQC9jb21tb24vWkluZGV4JztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGRyb3Bkb3duczogRHJvcGRvd25NZW51W107XHJcbiAgICBzZXBhcmF0b3JzOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JbXTtcclxuICAgIGN1cnJlbnRTZWxlY3Rpb25SYW5nZTogUmFuZ2UgfCBudWxsO1xyXG4gICAgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvcnMgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJmbG9hdGluZy10b29sYmFyXCIsIFwic2VsZWN0LXdyYXBwZXJcIiwgXCJzb2Z0LWJveC1zaGFkb3dcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4LlNsaWdodGx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZmxleCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2hvdygpOiB2b2lkIHtcclxuICAgIC8vICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gRE9NVXRpbHMuZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoXCIuZm9jdXNhYmxlXCIpO1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2VsZWN0aW9uIGZvdW5kJyk7XHJcbiAgICAvLyAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgLy8gICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgLy8gICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgLy8gICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgLy8gICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG5cclxuICAgIC8vICAgICAgICAgc3VwZXIuc2hvdygpO1xyXG5cclxuICAgIC8vICAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmZsb2F0aW5nVG9vbGJhckRpc3BsYXllZCwge1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcclxuICAgIC8vICAgICAgICAgLy8gfSkpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmREcm9wZG93bihkcm9wZG93bjogRHJvcGRvd25NZW51KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMucHVzaChkcm9wZG93bilcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGRyb3Bkb3duLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRCdXR0b25Hcm91cChidXR0b25Hcm91cDogQnV0dG9uR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRTZXBhcmF0b3Ioc2VwYXJhdG9yOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvcnMucHVzaChzZXBhcmF0b3IpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRUZXh0VG9vbGJhcihidXR0b246IEJ1dHRvbkdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFueURyb3Bkb3duVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Bkb3duIG9mIHRoaXMuZHJvcGRvd25zKSB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5kcm9wZG93bkxpc3QuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVBbGxEcm9wZG93blZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkcm9wZG93biBvZiB0aGlzLmRyb3Bkb3ducykge1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd25MaXN0LmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKSB7XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgZm9jdXMgY2hhbmdlIHdoZW4gY2xpY2tpbmcgb24gdGhpcyBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgZm9jdXMgY2hhbmdlIHdoZW4gY2xpY2tpbmcgb24gdGhpcyBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWRvd24sIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNob3dJbnB1dExpbmtCb3hSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNhbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNob3dJbnB1dExpbmtCb3hGaW5pc2hlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuSGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZVJhbmdlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfSBpZiAodGhpcy5jYW5IaWRlICYmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkVtcHR5KCkpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICgoZXZlbnQua2V5ID09PSAnRXNjYXBlJyB8fCBldmVudC5rZXkgPT09ICdEZWxldGUnKSAmJiB0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhdGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgIH0gXHJcbiAgICAgICAgLy8gICAgIC8vIGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhdGhpcy5pbnB1dExpbmtCb3hXcmFwcGVyLmlzVmlzaWJsZSkge1xyXG4gICAgICAgIC8vICAgICAvLyAgICAgdGhpcy5yZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTtcclxuICAgICAgICAvLyAgICAgLy8gfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja0RlbGV0ZWQsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTZWxlY3Rpb25FbXB0eSgpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkgPT09ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RvcmVSYW5nZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmFkZFJhbmdlKHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlISk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbmdlQ29sb3Ige1xyXG5cclxuICAgIGNvbG9yOiBDb2xvcnM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IENvbG9ycykge1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbiB7XHJcblxyXG4gICAgY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICAgIGludGVudGlvbjogXCJzaG93XCIgfCBcImhpZGVcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlOiBzdHJpbmcsIGludGVudGlvbjogXCJzaG93XCIgfCBcImhpZGVcIikge1xyXG4gICAgICAgIHRoaXMuY2xhc3NLZXkgPSBjbGFzc0tleTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5pbnRlbnRpb24gPSBpbnRlbnRpb247XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUmVzZXRBY3RpdmVCdXR0b25zIHtcclxuXHJcbiAgICBjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0tleSA9IGNsYXNzS2V5O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSVVJQWN0aW9uIH0gZnJvbSBcIi4vSVVJQWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2xvc2VFbGVtZW50IGltcGxlbWVudHMgSVVJQWN0aW9uIHtcclxuXHJcbn0iLCJpbXBvcnQgeyBJVUlBY3Rpb24gfSBmcm9tIFwiLi9JVUlBY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaG93RWxlbWVudCBpbXBsZW1lbnRzIElVSUFjdGlvbiB7XHJcblxyXG59IiwiaW1wb3J0IHsgSVVJQWN0aW9uIH0gZnJvbSBcIi4vSVVJQWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgaW1wbGVtZW50cyBJVUlBY3Rpb24ge1xyXG5cclxuICAgIGxhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBibG9ja0lkOiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja0lkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmJsb2NrSWQgPSBibG9ja0lkO1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGFibGVTY29wZXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL1RhYmxlU2NvcGVzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiLi9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiLi9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCIuL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIi4vVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IFNob3dIaWRlQWN0aXZlQnV0dG9uIH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Nob3dIaWRlQWN0aXZlQnV0dG9uXCI7XHJcbmltcG9ydCB7IFJlc2V0QWN0aXZlQnV0dG9ucyB9IGZyb20gXCIuL1VJQWN0aW9ucy9SZXNldEFjdGl2ZUJ1dHRvbnNcIjtcclxuaW1wb3J0IHsgQ2xvc2VFbGVtZW50IH0gZnJvbSBcIi4vVUlBY3Rpb25zL0Nsb3NlRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBTaG93RWxlbWVudCB9IGZyb20gXCIuL1VJQWN0aW9ucy9TaG93RWxlbWVudFwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSB9IGZyb20gXCIuL1VJQWN0aW9ucy9DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcblxyXG5cclxuICAgIHN0YXRpYyBlbWl0Q29kZUJsb2NrTGFuZ3VhZ2VDaGFuZ2VkRXZlbnQodGFyZ2V0Q2xhc3M6IHN0cmluZywgYmxvY2tJZDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENsYXNzOiB0YXJnZXRDbGFzcyxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlKGJsb2NrSWQsIGxhbmd1YWdlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0U2hvd0VsZW1lbnRFdmVudCh0YXJnZXRJZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5TaG93RWxlbWVudCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IFNob3dFbGVtZW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRDbG9zZUVsZW1lbnRFdmVudCh0YXJnZXRJZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb246IG5ldyBDbG9zZUVsZW1lbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQodGFyZ2V0SWQ6IHN0cmluZywgY29sb3I6IENvbG9ycykge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuQ29sb3JDaGFuZ2VSZXF1ZXN0LCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgQ2hhbmdlQ29sb3IoY29sb3IpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudCh0YXJnZXRDbGFzczogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlOiBzdHJpbmcsIGludGVuc2lvbjogXCJzaG93XCIgfCBcImhpZGVcIikge1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0Q2xhc3MgPT0gXCJoaWxpdGVDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5IaWxpdGVDb2xvck5vbmUpIHtcclxuICAgICAgICAgICAgaW50ZW5zaW9uID0gXCJoaWRlXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGFyZ2V0Q2xhc3MgPT0gXCJmb3JlQ29sb3JcIiAmJiB2YWx1ZSA9PSBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCkge1xyXG4gICAgICAgICAgICBpbnRlbnNpb24gPSBcImhpZGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImJhY2tncm91bmRDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JOb25lKSB7XHJcbiAgICAgICAgICAgIGludGVuc2lvbiA9IFwiaGlkZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLlNob3dIaWRlQWN0aXZlQnV0dG9uLCB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENsYXNzOiB0YXJnZXRDbGFzcyxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IFNob3dIaWRlQWN0aXZlQnV0dG9uKHRhcmdldENsYXNzLCB2YWx1ZSwgaW50ZW5zaW9uKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KHRhcmdldENsYXNzOiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIikge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENsYXNzOiB0YXJnZXRDbGFzcyxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IFJlc2V0QWN0aXZlQnV0dG9ucyh0YXJnZXRDbGFzcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IHJld3JpdGUgdGhpcyBkb2NcclxuICAgIC8qKlxyXG4gICAgKiBFbWl0cyBhIGN1c3RvbSBldmVudCB3aXRoIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgc3RhdGVzIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSB0ZXh0IHNlbGVjdGlvbi5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBjcnVjaWFsIGluIGEgdGV4dCBlZGl0aW5nIGVudmlyb25tZW50IHdoZXJlIG11bHRpcGxlIGNvbXBvbmVudHMgbWlnaHQgbmVlZCB0b1xyXG4gICAgKiB1cGRhdGUgdGhlaXIgc3RhdGUgYmFzZWQgb24gY2hhbmdlcyBpbiB0ZXh0IGZvcm1hdHRpbmcuIFRoZSBlbWl0dGVkIGV2ZW50IChgQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkYClcclxuICAgICogY2FycmllcyBmb3JtYXR0aW5nIHN0YXRlIGRhdGEsIHdoaWNoIGNvbXBvbmVudHMgY2FuIHVzZSB0byBzeW5jaHJvbml6ZSB0aGVpciBVSSBlbGVtZW50cyB3aXRoIHRoZVxyXG4gICAgKiBjdXJyZW50IHRleHQgZm9ybWF0dGluZyAoZS5nLiwgdXBkYXRpbmcgYnV0dG9uIHN0YXRlcywgZGlzcGxheWluZyBhY3RpdmUgZm9ybWF0dGluZyBvcHRpb25zKS5cclxuICAgICpcclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgZm9yIGFuIGFjdGl2ZSBhbmQgbm9uLWVtcHR5IHRleHQgc2VsZWN0aW9uLlxyXG4gICAgKiBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGUgZnVuY3Rpb24gZXhpdHMgZWFybHkgdG8gYXZvaWQgcHJvY2Vzc2luZyB1bm5lY2Vzc2FyeSBldmVudHMsXHJcbiAgICAqIGVzcGVjaWFsbHkgdG8gbWl0aWdhdGUgaXNzdWVzIGluIGJyb3dzZXJzIGxpa2UgRmlyZWZveCB3aGVyZSBgc2VsZWN0aW9uY2hhbmdlYCBtaWdodCBmaXJlIGR1cmluZyB0eXBpbmdcclxuICAgICogd2l0aG91dCBhbiBhY3R1YWwgY2hhbmdlIGluIHNlbGVjdGlvbi5cclxuICAgICpcclxuICAgICogQHByaXZhdGVcclxuICAgICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZSBhcyB0aGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGVtaXQgZXZlbnRzIGJhc2VkIG9uIHRoZSBmb3JtYXR0aW5nIHN0YXRlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBUbyBpbnZva2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gYSBjbGFzcyB0aGF0IGhhbmRsZXMgdGV4dCBmb3JtYXR0aW5nOlxyXG4gICAgKiB0aGlzLmVtaXRGb3JtYXRDaGFuZ2VFdmVudHMoKTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIEhlcmUncyBob3cgdGhlIGZ1bmN0aW9uIHdvcmtzOlxyXG4gICAgKiAxLiBDaGVja3MgZm9yIGFuIGFjdGl2ZSBhbmQgbm9uLWVtcHR5IHRleHQgc2VsZWN0aW9uLiBJZiBlbXB0eSwgcmV0dXJucyBlYXJseS5cclxuICAgICogMi4gR2F0aGVycyBjdXJyZW50IHN0YXRlIG9mIHRleHQgZm9ybWF0dGluZyBjb21tYW5kcyBzdWNoIGFzICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCBhbmQgJ3N0cmlrZVRocm91Z2gnLFxyXG4gICAgKiAgICBhbmQgZHluYW1pY2FsbHkgY29sbGVjdHMgdGhlIHN0YXRlIG9mIHZhcmlvdXMgaGlnaGxpZ2h0IGNvbG9ycyB1c2luZyBhIHNlcnZpY2UuXHJcbiAgICAqIDMuIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgKGBDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWRgKSB3aXRoIHRoZXNlIGZvcm1hdHRpbmcgc3RhdGVzLlxyXG4gICAgKiAgICBDb21wb25lbnRzIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIGxpc3RlbiB0byB0aGlzIGV2ZW50IGFuZCB1cGRhdGUgdGhlaXIgc3RhdGVzIGFjY29yZGluZ2x5LFxyXG4gICAgKiAgICBlbnN1cmluZyB0aGF0IFVJIGNvbnRyb2xzIGxpa2UgdG9vbGJhciBidXR0b25zIHJlZmxlY3QgdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBvZiB0aGUgc2VsZWN0ZWQgdGV4dC5cclxuICAgICovXHJcbiAgICAvLyBzdGF0aWMgZW1pdEZvcm1hdENoYW5nZUV2ZW50ID0gKFxyXG5cclxuICAgIC8vICAgICBib2xkOiBib29sZWFuLFxyXG4gICAgLy8gICAgIGl0YWxpYzogYm9vbGVhbixcclxuICAgIC8vICAgICB1bmRlcmxpbmU6IGJvb2xlYW4sXHJcbiAgICAvLyAgICAgc3RyaWtlVGhyb3VnaDogYm9vbGVhbixcclxuICAgIC8vICAgICBoaWxpdGVDb2xvcjogeyBba2V5OiBzdHJpbmddIDogYm9vbGVhbiB9LCBcclxuICAgIC8vICAgICBmb3JlQ29sb3I6IHsgW2tleTogc3RyaW5nXSA6IGJvb2xlYW59KTogdm9pZCA9PiB7XHJcblxyXG4gICAgLy8gICAgIC8vIFRoaXMgYmxvY2sgY2hlY2tzIGZvciBhbiBhY3RpdmUgc2VsZWN0aW9uIGFuZCB3aGV0aGVyIGl0IGNvbnRhaW5zIGFueSBjb250ZW50LlxyXG4gICAgLy8gICAgIC8vIEluIEZpcmVmb3gsIHRoZSBgc2VsZWN0aW9uY2hhbmdlYCBldmVudCBtYXkgYmUgZmlyZWQgZXZlbiB3aGlsZSB0eXBpbmcsXHJcbiAgICAvLyAgICAgLy8gd2hpY2ggaXMgbm90IHRoZSBpbnRlbmRlZCB0cmlnZ2VyIHNpbmNlIHdlIG9ubHkgd2FudCB0byByZWFjdCB0byBhY3R1YWwgY2hhbmdlcyBpbiBzZWxlY3Rpb24uXHJcbiAgICAvLyAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBvciBudWxsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBlYXJseSwgZWZmZWN0aXZlbHkgaWdub3JpbmdcclxuICAgIC8vICAgICAvLyB0aGVzZSB1bndhbnRlZCBgc2VsZWN0aW9uY2hhbmdlYCBldmVudHMgZHVyaW5nIHR5cGluZy5cclxuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24/LnRvU3RyaW5nKCkudHJpbSgpID09PSAnJykge1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb21tYW5kU3RhdGVzOiBJRm9ybWF0Q29tbWFuZCA9IHtcclxuICAgIC8vICAgICAgICAgYm9sZDogYm9sZCxcclxuICAgIC8vICAgICAgICAgaXRhbGljOiBpdGFsaWMsXHJcbiAgICAvLyAgICAgICAgIHVuZGVybGluZTogdW5kZXJsaW5lLFxyXG4gICAgLy8gICAgICAgICBzdHJpa2VUaHJvdWdoOiBzdHJpa2VUaHJvdWdoLFxyXG4gICAgLy8gICAgICAgICBoaWxpdGVDb2xvcjogaGlsaXRlQ29sb3IsXHJcbiAgICAvLyAgICAgICAgIGZvcmVDb2xvcjogZm9yZUNvbG9yLFxyXG4gICAgLy8gICAgICAgICBjZWxsSGlsaXRlQ29sb3I6IHt9XHJcbiAgICAvLyAgICAgfTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+KEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZCwge1xyXG4gICAgLy8gICAgICAgICBkZXRhaWw6IGNvbW1hbmRTdGF0ZXNcclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQoc2NvcGU6IFRhYmxlU2NvcGVzLCBjb2xvcjogQ29sb3JzKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3IsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29sb3IsXHJcbiAgICAgICAgICAgICAgICBzY29wZTogc2NvcGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gc3RhdGljIGVtaXRDZWxsQ2hhbmdlRXZlbnQgPSAoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkID0+IHtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY2VsbEhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG5cclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yUmVkXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvclJlZCk7XHJcbiAgICAvLyAgICAgY2VsbEhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvckdyZWVuKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZV0gPSBUYWJsZVV0aWxzLmlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsLCBDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93XSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvclllbGxvdyk7XHJcbiAgICAvLyAgICAgY2VsbEhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbW1hbmRTdGF0ZXM6IElGb3JtYXRDb21tYW5kID0ge1xyXG4gICAgLy8gICAgICAgICBib2xkOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgaXRhbGljOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgdW5kZXJsaW5lOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgc3RyaWtlVGhyb3VnaDogZmFsc2UsXHJcbiAgICAvLyAgICAgICAgIGhpbGl0ZUNvbG9yOiB7fSxcclxuICAgIC8vICAgICAgICAgZm9yZUNvbG9yOiB7fSxcclxuICAgIC8vICAgICAgICAgY2VsbEhpbGl0ZUNvbG9yOiBjZWxsSGlsaXRlQ29sb3JcclxuICAgIC8vICAgICB9O1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD4oQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCB7XHJcbiAgICAvLyAgICAgICAgIGRldGFpbDogY29tbWFuZFN0YXRlc1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIC8vIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9GbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgWkluZGV4IH0gZnJvbSBcIkAvY29tbW9uL1pJbmRleFwiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xyXG5pbXBvcnQgeyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL0lUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IEJ1dHRvbklEcyB9IGZyb20gXCJAL2NvcmUvQnV0dG9uSURzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaWQ6IHN0cmluZyA9IFwidGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyO1xyXG4gICAgcHJpdmF0ZSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIGluaXRpYWxSZWN0OiBET01SZWN0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBsb2NrZWRIaWRlID0gZmFsc2U7XHJcbiAgICBkZWJvdW5jZVRpbWVyOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IodGV4dE9wZXJhdGlvbnNTZXJ2aWNlOiBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIGlmIChUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaWQpO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnpJbmRleCA9IFpJbmRleC5WZXJ5SW1wb3J0YW50O1xyXG4gICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gdGV4dE9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlPihcIklUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIik7O1xyXG5cclxuICAgICAgICBpZiAoIVRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlID0gbmV3IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyKHRleHRPcGVyYXRpb25zU2VydmljZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMoKSB7XHJcblxyXG4gICAgICAgIC8vVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gY29uc3QgdHh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codHh0KTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIpO1xyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGluazogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCdjcmVhdGVMaW5rJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQm9sZDogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzSXRhbGljOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1VuZGVybGluZTogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCd1bmRlcmxpbmUnKTtcclxuICAgICAgICAgICAgY29uc3QgaXNJbmxpbmVDb2RlOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoXCJpbmxpbmVDb2RlXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1N0cmlrZVRocm91Z2g6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtlVGhyb3VnaCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yUmVkXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKTtcclxuICAgICAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93XSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KTtcclxuICAgICAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcmVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgICAgIGZvcmVDb2xvcnNbQ29sb3JzLkZvcmVDb2xvclJlZF0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yUmVkKTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JlZW5dID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvckdyZWVuKTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yQmx1ZV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yQmx1ZSk7XHJcbiAgICAgICAgICAgIGZvcmVDb2xvcnNbQ29sb3JzLkZvcmVDb2xvclllbGxvd10gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JleV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JleSk7XHJcblxyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhoaWxpdGVDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZvcmVDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIiwgY29sb3IsIFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzTGluaywgQnV0dG9uSURzLkxpbmspO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzQm9sZCwgQnV0dG9uSURzLkJvbGQpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzSXRhbGljLCBCdXR0b25JRHMuSXRhbGljKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc0lubGluZUNvZGUsIEJ1dHRvbklEcy5JbmxpbmVDb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1VuZGVybGluZSwgQnV0dG9uSURzLlVuZGVybGluZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNTdHJpa2VUaHJvdWdoLCBCdXR0b25JRHMuU3RyaWtldGhyb3VnaCk7XHJcbiAgICAgICAgfSwgMjApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoYWN0aXZlOiBib29sZWFuLCB0YXJnZXRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQodGFyZ2V0SWQsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KHRhcmdldElkLCBDb2xvcnMuSWNvbkRlZmF1bHRCbGFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvZ1NlbGVjdGlvbkNoYW5nZShldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicGFzc291IG5vIGxvZyBzZWxlY3Rpb25cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGRlYm91bmNlVGltZXI6IGFueTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZXVwLCAoZXZlbnQpID0+IHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIHRoaXMubG9nU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkJibENsaWNrLCB0aGlzLmxvZ1NlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5TZWxlY3Rpb25DaGFuZ2UsIHRoaXMubG9nU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5dXAsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIaWRlKGV2ZW50LCBpc1NlbGVjdGluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2V1cCwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGUoZXZlbnQsIGlzU2VsZWN0aW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTtcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0hpZGUoZXZlbnQsIGlzU2VsZWN0aW5nKTtcclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuU2VsZWN0aW9uQ2hhbmdlLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZShldmVudCwgaXNTZWxlY3RpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuRXNjYXBlKSAmJiAhdGhpcy5sb2NrZWRIaWRlKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkVXBkYXRlUG9zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxSZWN0KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25DaGFuZ2VkID0gTWF0aC5hYnMoY3VycmVudFJlY3QubGVmdCAtIHRoaXMuaW5pdGlhbFJlY3QubGVmdCkgPiAxMCB8fCBNYXRoLmFicyhjdXJyZW50UmVjdC50b3AgLSB0aGlzLmluaXRpYWxSZWN0LnRvcCkgPiAxMDtcclxuICAgICAgICByZXR1cm4gcG9zaXRpb25DaGFuZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dIaWRlKGV2ZW50OiBFdmVudCwgaXNTZWxlY3Rpbmc6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgLy9UaGlzIGJsb2NrIGNoZWNrcyBmb3IgYW4gYWN0aXZlIHNlbGVjdGlvbiBhbmQgd2hldGhlciBpdCBjb250YWlucyBhbnkgY29udGVudC5cclxuICAgICAgICAvLyBJbiBGaXJlZm94LCB0aGUgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnQgbWF5IGJlIGZpcmVkIGV2ZW4gd2hpbGUgdHlwaW5nLFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIG5vdCB0aGUgaW50ZW5kZWQgdHJpZ2dlciBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gcmVhY3QgdG8gYWN0dWFsIGNoYW5nZXMgaW4gc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgb3IgbnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWFybHksIGVmZmVjdGl2ZWx5IGlnbm9yaW5nXHJcbiAgICAgICAgLy8gdGhlc2UgdW53YW50ZWQgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnRzIGR1cmluZyB0eXBpbmcuXHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxvY2tlZEhpZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlY3QgPSBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmIChoYXNDb250ZW50ICYmICFpc1NlbGVjdGluZykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWdub3JlRmxvYXRpbmdUb29sYmFyID0gRE9NVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIuaWdub3JlLXRleHQtZmxvYXRpbmctdG9vbGJhclwiKSB8fCBET01VdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi5naXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlnbm9yZUZsb2F0aW5nVG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkVXBkYXRlUG9zaXRpb24oKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlnbm9yZUZsb2F0aW5nVG9vbGJhciA9IERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLmdpc3RcIikgfHwgRE9NVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIuZ2lzdFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZ25vcmVGbG9hdGluZ1Rvb2xiYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2VsZWN0aW9uIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBpZiAocmVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlY3RzIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpcnN0UmVjdCA9IHJlY3RzWzBdO1xyXG5cclxuICAgICAgICBjb25zdCBjX2ZpcnN0UmVjdExlZnQgPSBmaXJzdFJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBjX2ZpcnN0UmVjdFRvcCA9IGZpcnN0UmVjdC50b3A7XHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RCb3R0b20gPSBmaXJzdFJlY3QuYm90dG9tO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IGNfZmlyc3RSZWN0TGVmdCArIHdpbmRvdy5zY3JvbGxYIC0gNTA7XHJcblxyXG4gICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IGNfZmlyc3RSZWN0VG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdEJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3coKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2VsZWN0aW9uIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcInRpdGxlXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuaGlkZVR1cm5JbnRvRHJvcGRvd25JZkluQ2VsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVUdXJuSW50b0Ryb3Bkb3duSWZJbkNlbGwoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXNDZWxsID0gRE9NVXRpbHMuaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGRyb3Bkb3duID0+IHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmlkID09IFwidHVybkludG9NZW51XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXBhcmF0b3JzLmZvckVhY2goc2VwYXJhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvci5pZCA9PSBcInR1cm5JbnRvU2VwYXJhdG9yXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBvc2l0aW9uKHJlY3Q6IERPTVJlY3QpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvY2tIaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubG9ja2VkSGlkZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2NrSGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2tlZEhpZGUgPSBmYWxzZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tIFwiLi9JbnB1dExpbmtCb3hXcmFwcGVyXCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dExpbmtCb3ggZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHBhcmVudFdyYXBwZXI/OiBJbnB1dExpbmtCb3hXcmFwcGVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFwibGlua0JveElucHV0XCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudHlwZSA9IFwidXJsXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGxhY2Vob2xkZXIgPSBcIlBhc3RlIG9yIHR5cGUgYSBsaW5rLi4uXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGFyZW50V3JhcHBlcihwYXJlbnRXcmFwcGVyOiBJbnB1dExpbmtCb3hXcmFwcGVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRXcmFwcGVyID0gcGFyZW50V3JhcHBlcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi4vVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94IH0gZnJvbSBcIi4vSW5wdXRMaW5rQm94XCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dExpbmtCb3hXcmFwcGVyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBpbnB1dExpbmtCb3g6IElucHV0TGlua0JveDtcclxuICAgIGhpZ2hsaWdodHM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcclxuICAgIGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblxyXG4gICAgdGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0TGlua0JveCA9IG5ldyBJbnB1dExpbmtCb3goKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlucHV0TGlua0JveDogaW5wdXRMaW5rQm94LFxyXG4gICAgICAgICAgICBidXR0b246IGJ1dHRvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gXCJsaW5rQm94XCI7XHJcbiAgICAgICAgdGhpcy5pbnB1dExpbmtCb3ggPSBpbnB1dExpbmtCb3g7XHJcbiAgICAgICAgdGhpcy5idXR0b24gPSBidXR0b247XHJcbiAgICAgICAgaW5wdXRMaW5rQm94LnNldFBhcmVudFdyYXBwZXIodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMudGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgPSBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFwibGlua0JveFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGVwZW5kZW50LWJveFwiLCBcInNvZnQtYm94LXNoYWRvd1wiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBoZWFkZXIuY2xhc3NMaXN0LmFkZChcImhlYWRlclwiKTtcclxuICAgICAgICBoZWFkZXIuaW5uZXJUZXh0ID0gXCJMaW5rXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaGVsbC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgc2hlbGwuY2xhc3NMaXN0LmFkZChcImxpbmstYm94LXNoZWxsXCIpXHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcblxyXG4gICAgICAgIHRoaXMucHJvcHMuYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJibHVlLWJ1dHRvblwiKTtcclxuICAgICAgICB0aGlzLnByb3BzLmJ1dHRvbi5pbm5lckhUTUwgPSBcIkVtYmVkXCI7XHJcblxyXG4gICAgICAgIHNoZWxsLmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYnV0dG9uKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzaGVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIENoYW5nZSB0aGUgY3Vyc29yIHdoZW4gdGhlIENvbnRyb2wga2V5IGlzIHByZXNzZWQgYW5kIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBhIGxpbmsuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2N0cmwtYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGNoYW5nZSB0aGUgY3Vyc29yIHdoZW4gdGhlIENvbnRyb2wga2V5IGlzIG5vdCBwcmVzc2VkIGFuZCB0aGUgbW91c2UgaG92ZXJzIG92ZXIgYSBsaW5rLlxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY3RybC1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIC8vICAgICAvLyB0aGlzLmhpZ2hsaWdodFNlbGVjdGVkVGV4dCgpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmlucHV0TGlua0JveC5mb2N1cygpO1xyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdBJyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBocmVmID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaHJlZicpITtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaHJlZiwgJ19ibGFuaycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJyNsaW5rQm94JykgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiI3RleHRGbG9hdGluZ1Rvb2xiYXJcIikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaW5zZXJ0TGluay5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaGFuZGxlU2hvd0VsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0SWQgPT0gdGhpcy5pZCAmJiAhdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGV0YWlscy50YXJnZXRJZCA9PSB0aGlzLmlkICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0TGluayhldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXJsID0gKHRoaXMuaW5wdXRMaW5rQm94Lmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHVybFdpdGhQcm90b2NvbCA9IHVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykgPyB1cmwgOiBgaHR0cHM6Ly8ke3VybH1gO1xyXG5cclxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gVXRpbHMuaXNWYWxpZFVybCh1cmxXaXRoUHJvdG9jb2wpO1xyXG5cclxuICAgICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMubGlua1JlYWR5VG9JbnNlcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVybFdpdGhQcm90b2NvbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgaW5wdXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJyZ2IoMjUzLCAyMjIsIDIyMilcIjtcclxuICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNoYWtlLWFuaW1hdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZShcInNoYWtlLWFuaW1hdGlvblwiKTtcclxuICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3coKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCI7XHJcblxyXG4gICAgICAgIHRoaXMudGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIubG9ja0hpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBvc2l0aW9uTGlua0NvbXBvbmVudEJlbG93U2VsZWN0aW9uKHJhbmdlKTtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGVkVGV4dChyYW5nZSk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc2l0aW9uTGlua0NvbXBvbmVudEJlbG93U2VsZWN0aW9uKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XHJcblxyXG4gICAgICAgIGlmIChyZWN0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gcmVjdHMgZm91bmQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gcmVjdHNbMF07XHJcblxyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0TGVmdCA9IGZpcnN0UmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0VG9wID0gZmlyc3RSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBjX2ZpcnN0UmVjdEJvdHRvbSA9IGZpcnN0UmVjdC5ib3R0b207XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gY19maXJzdFJlY3RMZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gY19maXJzdFJlY3RUb3AgKyB3aW5kb3cuc2Nyb2xsWSArIDQwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gY19maXJzdFJlY3RCb3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci51bmxvY2tIaWRlKCk7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0cygpO1xyXG4gICAgICAgICh0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy50ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5jdXJyZW50U2VsZWN0aW9uUmFuZ2U7XHJcblxyXG4gICAgICAgIGlmICghcmFuZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZShyYW5nZSk7XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3Qgc2hvd0lucHV0TGlua0JveEZpbmlzaGVkID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94RmluaXNoZWQnLCB7XHJcbiAgICAgICAgLy8gICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgIC8vICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2hvd0lucHV0TGlua0JveEZpbmlzaGVkKTtcclxuICAgICAgICAvLyB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRTZWxlY3RlZFRleHQocmFuZ2U6IFJhbmdlKSB7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IGAke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNjMmMyYzInO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUub3BhY2l0eSA9ICcwLjMnO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodHMucHVzaChoaWdobGlnaHQpO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMCwgMTIwLCAyMTUsIDAuMyknO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuXHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWX1weGA7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIaWdobGlnaHRzKCkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5mb3JFYWNoKGhpZ2hsaWdodCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaGlnaGxpZ2h0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodHMgPSBbXTtcclxuICAgIH1cclxuICAgICAgICBcclxuXHJcbn0iLCJpbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiLi4vY29udGVudC9Db250ZW50XCI7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSBcIi4uL3RpdGxlL1RpdGxlXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiLi4vYWRkLWJsb2NrL0FkZEJsb2NrV3JhcHBlclwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnUgfSBmcm9tIFwiLi4vcXVpY2stbWVudS9RdWlja01lbnVcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgSU1lbWVudG8gfSBmcm9tIFwiQC9jb3JlL0lNZW1lbnRvXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgTWVkaWFJbnB1dHRlciB9IGZyb20gXCIuLi9tZWRpYS1pbnB1dHRlci9NZWRpYUlucHV0dGVyXCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tIFwiLi4vZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3hXcmFwcGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGVkaXRvcklkOiBzdHJpbmcgPSBcImpvaGFubmVzRWRpdG9yXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRWRpdG9yO1xyXG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcclxuXHJcbiAgICBwcml2YXRlIHRpdGxlPzogVGl0bGU7XHJcbiAgICBwcml2YXRlIGNvbnRlbnQ/OiBDb250ZW50O1xyXG4gICAgcHJpdmF0ZSBhZGRCbG9jazogQWRkQmxvY2tXcmFwcGVyO1xyXG4gICAgcHJpdmF0ZSB0ZXh0RmxvYXRpbmdUb29sYmFyOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuICAgIHByaXZhdGUgcXVpY2tNZW51OiBRdWlja01lbnU7XHJcbiAgICBwcml2YXRlIHRhYmxlQ29udGV4dFRvb2xiYXI6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuICAgIHByaXZhdGUgbWVkaWFJbnB1dHRlcjogTWVkaWFJbnB1dHRlcjtcclxuICAgIHByaXZhdGUgaW5wdXRMaW5rQm94V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICBtZW1lbnRvOiBJTWVtZW50byxcclxuICAgICAgICB0aXRsZTogVGl0bGUsXHJcbiAgICAgICAgY29udGVudDogQ29udGVudCxcclxuICAgICAgICBhZGRCbG9jazogQWRkQmxvY2tXcmFwcGVyLFxyXG4gICAgICAgIGZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgcXVpY2tNZW51OiBRdWlja01lbnUsXHJcbiAgICAgICAgdGFibGVUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgbWVkaWFJbnB1dHRlcjogTWVkaWFJbnB1dHRlcixcclxuICAgICAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBJbnB1dExpbmtCb3hXcmFwcGVyXHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IGVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogYmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxyXG4gICAgICAgICAgICBhZGRCbG9jazogYWRkQmxvY2ssXHJcbiAgICAgICAgICAgIGZsb2F0aW5nVG9vbGJhcjogZmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgICAgICBxdWlja01lbnU6IHF1aWNrTWVudSxcclxuICAgICAgICAgICAgdGFibGVUb29sYmFyOiB0YWJsZVRvb2xiYXIsXHJcbiAgICAgICAgICAgIG1lZGlhSW5wdXR0ZXI6IG1lZGlhSW5wdXR0ZXIsXHJcbiAgICAgICAgICAgIGlucHV0TGlua0JveFdyYXBwZXI6IGlucHV0TGlua0JveFdyYXBwZXJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKEVkaXRvci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveFdyYXBwZXIgPSBpbnB1dExpbmtCb3hXcmFwcGVyO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87XHJcbiAgICAgICAgdGhpcy5hZGRCbG9jayA9IGFkZEJsb2NrO1xyXG4gICAgICAgIHRoaXMudGV4dEZsb2F0aW5nVG9vbGJhciA9IGZsb2F0aW5nVG9vbGJhcjtcclxuICAgICAgICB0aGlzLnF1aWNrTWVudSA9IHF1aWNrTWVudTtcclxuICAgICAgICB0aGlzLnRhYmxlQ29udGV4dFRvb2xiYXIgPSB0YWJsZVRvb2xiYXI7XHJcbiAgICAgICAgdGhpcy5tZWRpYUlucHV0dGVyID0gbWVkaWFJbnB1dHRlcjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuXHJcbiAgICAgICAgRWRpdG9yLmluc3RhbmNlID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVkaXRvci5lZGl0b3JJZCkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWVkaXRvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJjb250ZW50LXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVUaXRsZSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMucHJvcHMudGl0bGUuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ29udGVudCBpcyByZXF1aXJlZFxyXG4gICAgICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMucHJvcHMuY29udGVudC5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnRXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUFkZEJsb2NrIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5hZGRCbG9jay5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uZW5hYmxlRmxvYXRpbmdUb29sYmFyIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5mbG9hdGluZ1Rvb2xiYXIuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVF1aWNrTWVudSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMucXVpY2tNZW51Lmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy50YWJsZVRvb2xiYXIuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMubWVkaWFJbnB1dHRlci5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3hXcmFwcGVyLmh0bWxFbGVtZW50KVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKFxyXG4gICAgICAgIHRpdGxlOiBUaXRsZSxcclxuICAgICAgICBjb250ZW50OiBDb250ZW50LFxyXG4gICAgICAgIGFkZEJsb2NrOiBBZGRCbG9ja1dyYXBwZXIsXHJcbiAgICAgICAgdGV4dEZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgcXVpY2tNZW51OiBRdWlja01lbnUsXHJcbiAgICAgICAgdGFibGVGbG9hdGluZ1Rvb2xiYXI6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcixcclxuICAgICAgICBtZWRpYUlucHV0dGVyOiBNZWRpYUlucHV0dGVyKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRGYWN0b3J5U2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRWxlbWVudEZhY3RvcnlTZXJ2aWNlPihcIklFbGVtZW50RmFjdG9yeVNlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xyXG4gICAgICAgIGNvbnN0IGlucHV0TGlua0JveFdyYXBwZXIgPSBuZXcgSW5wdXRMaW5rQm94V3JhcHBlcigpO1xyXG5cclxuICAgICAgICBpZiAoIUVkaXRvci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBFZGl0b3IuaW5zdGFuY2UgPSBuZXcgRWRpdG9yKGVsZW1lbnRGYWN0b3J5U2VydmljZSwgYmxvY2tPcGVyYXRpb25zU2VydmljZSwgbWVtZW50bywgdGl0bGUsIGNvbnRlbnQsIGFkZEJsb2NrLCB0ZXh0RmxvYXRpbmdUb29sYmFyLCBxdWlja01lbnUsIHRhYmxlRmxvYXRpbmdUb29sYmFyLCBtZWRpYUlucHV0dGVyLCBpbnB1dExpbmtCb3hXcmFwcGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBFZGl0b3IuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCkge1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpO1xyXG5cclxuICAgICAgICBjb250YWluZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGFyZ2V0IGFzIE5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0VsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRHJhZ0hhbmRsZXIoYmxvY2tFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYW4gSFRNTEVsZW1lbnQgYW5kIGNhbm5vdCBoYW5kbGUgSFRNTEVsZW1lbnQgc3BlY2lmaWMgbWV0aG9kczonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYSBOb2RlOicsIHRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9Gb2N1cyBvbiB0aGUgZmlyc3QgcGFyYWdyYXBoXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJhZ3JhcGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2pvaGFubmVzRWRpdG9yID4gLmNvbnRlbnQgLmJsb2NrIHBcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgPiAuY29udGVudCAuYmxvY2sgcFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGZ1bmN0aW9uIChldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBFZGl0b3IuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaERyYWdIYW5kbGVyKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0QXRDdXJzb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kRHJhZ0hhbmRsZXIoZWxlbWVudDogTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm92aWRlZCBlbGVtZW50IGlzIG5vdCBhbiBIVE1MRWxlbWVudDonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBsZXQgZHJhZ0hhbmRsZXIgPSBwYXJlbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuZHJhZy1oYW5kbGVyXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWRyYWdIYW5kbGVyICYmIHBhcmVudCkge1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlciA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04pO1xyXG4gICAgICAgICAgICBwYXJlbnQucHJlcGVuZChkcmFnSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZURyYWdIYW5kbGVyKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQ6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkcmFnSGFuZGxlciA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmRyYWctaGFuZGxlclwiKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZXI/LnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHRyYWN0Q29udGVudCgpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgRXhjZXB0aW9uXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgYXR0YWNoRHJhZ0hhbmRsZXIoKSB7XHJcbiAgICAgICAgbGV0IGRyYWdnZWRJdGVtOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgZHJvcExpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBkcm9wTGluZS5jbGFzc0xpc3QuYWRkKCdkcm9wLWxpbmUnKTtcclxuICAgICAgICBkcm9wTGluZS5zdHlsZS5oZWlnaHQgPSAnMnB4JztcclxuICAgICAgICBkcm9wTGluZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xhc3NMaXN0Py5jb250YWlucygnZHJhZy1oYW5kbGVyJykpIHtcclxuICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRyYWdnZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc3R5bGUub3BhY2l0eSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZHJvcExpbmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0KCcuYmxvY2snKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBkcmFnZ2VkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJvdW5kaW5nID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IGJvdW5kaW5nLnkgKyBib3VuZGluZy5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoZXZlbnQgYXMgTW91c2VFdmVudCkuY2xpZW50WSA+IG9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nICE9PSBkcm9wTGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGRyb3BMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZyAhPT0gZHJvcExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBkcm9wTGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkcm9wTGluZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbSAmJiBkcm9wTGluZSAmJiBkcm9wTGluZS5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wTGluZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShkcmFnZ2VkSXRlbSwgZHJvcExpbmUpO1xyXG4gICAgICAgICAgICAgICAgZHJvcExpbmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja0J1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSwgaWNvbjogU1ZHSWNvbikge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb246IGljb25cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC50aXRsZSA9IFwiQWRkIGEgbmV3IGJsb2NrXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhZGQtYmxvY2tcIiwgXCJibG9jay1vcGVyYXRpb25cIiwgXCJwb2ludGVyXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmljb24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL1RPRE86IFVzZSBjb21tYW5kIGRpc3BhdGNoZXJcclxuICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKENvbW1hbmRzLmNyZWF0ZURlZmF1bHRCbG9jaywgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbjogU1ZHSWNvbik6IEFkZEJsb2NrQnV0dG9uIHtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja0J1dHRvbihibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBpY29uKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrQnV0dG9uIH0gZnJvbSBcIi4vQWRkQmxvY2tCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja1dyYXBwZXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnV0dG9uOiBBZGRCbG9ja0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGJ1dHRvbjogQWRkQmxvY2tCdXR0b24pIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBidXR0b246IGJ1dHRvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYWRkLWJsb2NrLXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYnV0dG9uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoYnV0dG9uOiBBZGRCbG9ja0J1dHRvbik6IEFkZEJsb2NrV3JhcHBlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja1dyYXBwZXIoYnV0dG9uKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTaXplcyB7XHJcbiAgICBcclxuICAgIHN0YXRpYyBtZWRpdW06IHN0cmluZyA9IFwiMXJlbVwiO1xyXG4gICAgc3RhdGljIGxhcmdlOiBzdHJpbmcgPSBcIjEuMjVyZW1cIjtcclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNWR0ljb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHVzZUVsZW1lbnQ6IFNWR1VzZUVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb25JZDogaWNvbklkLFxyXG4gICAgICAgICAgICBzaXplOiBzaXplXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1c2UnKSBhcyBTVkdVc2VFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xyXG5cclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjg1KVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWQgIWltcG9ydGFudFwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaWNvbklkfWApO1xyXG5cclxuICAgICAgICB1c2Uuc3R5bGUuY29sb3IgPSBcInJlZCAhaW1wb3J0YW50XCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHVzZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMucHJvcHMuc2l6ZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLnByb3BzLnNpemUpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogU1ZHSWNvbiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCB0aGlzLnByb3BzLnNpemVzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VUbyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3ZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbihpY29uSWQsIHNpemUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvblwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuXHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWRkQmxvY2tCdWlsZGVyIHtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBidWlsZCgpOiBBZGRCbG9ja1dyYXBwZXIge1xyXG4gICAgICAgIHJldHVybiBBZGRCbG9ja1dyYXBwZXIuY3JlYXRlKEFkZEJsb2NrQnV0dG9uLmNyZWF0ZShTVkdJY29uLmNyZWF0ZShJY29ucy5QbHVzLCBTaXplcy5tZWRpdW0pKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICBkcm9wZG93bkJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uO1xyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uLCBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3QpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuXHJcblxyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRUbyh0aGlzKTtcclxuICAgICAgICBkcm9wZG93bkxpc3QuYXBwZW5kVG8odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNlbGVjdC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUocHJlZml4SWQ6IHN0cmluZywgYnV0dG9uOiBEcm9wZG93bk1lbnVCdXR0b24sIGxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnUge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyb3Bkb3duTWVudShwcmVmaXhJZCArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgYnV0dG9uLCBsaXN0KTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3RJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSWNvbj86IFNWR0ljb247XHJcbiAgICBwcml2YXRlIGxlZnRJY29uPzogU1ZHRWxlbWVudCB8IEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzRnVuY3Rpb25MaXN0OiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBvbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdDogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuXHJcbiAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdCxcclxuICAgICAgICBjb21tYW5kOiBzdHJpbmcsXHJcbiAgICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgbGVmdEljb246IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCB8IG51bGwsXHJcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICBzaG9ydGN1dDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gW1wibGlzdC1pdGVtXCIsIFwib3B0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIsIFwiYmxvY2stb3BlcmF0aW9uXCIsIFwibm8tbGlzdC1zdHlsZVwiLCBcIm5vLXNlbGVjdGlvblwiXTtcclxuXHJcbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1zbWFsbC1jaGVja1wiLCBTaXplcy5tZWRpdW0pO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiBsZWZ0SWNvbikge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxyXG4gICAgICAgICAgICBsZWZ0SWNvbjogbGVmdEljb24sXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgc2hvcnRjdXQ6IHNob3J0Y3V0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IGNsYXNzTGlzdDtcclxuICAgICAgICB0aGlzLmxlZnRJY29uID0gbGVmdEljb247XHJcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJY29uID0gaWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaChmdW5jKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBhZGRDbGFzcyhjbGFzc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QucHVzaChjbGFzc0tleSk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkZvY3VzPFQgZXh0ZW5kcyBhbnlbXT4oZnVuYzogKC4uLmFyZ3M6IFQpID0+IHZvaWQsIC4uLmFyZ3M6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaCgoKSA9PiBmdW5jKC4uLmFyZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkxvc2VGb2N1czxUIGV4dGVuZHMgYW55W10+KGZ1bmM6ICguLi5hcmdzOiBUKSA9PiB2b2lkLCAuLi5hcmdzOiBUKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKCgpID0+IGZ1bmMoLi4uYXJncykpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICAgICAgdGhpcy5vbkZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMucHJvcHMuY2xhc3NMaXN0IGFzIHN0cmluZ1tdO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJwb2ludGVyXCIsIC4uLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5sZWZ0SWNvbikge1xyXG4gICAgICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHNwYW4pO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0T3B0aW9uKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmljb24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG9ydGN1dCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG9ydEN1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5pbm5lclRleHQgPSB0aGlzLnByb3BzLnNob3J0Y3V0O1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjUpXCJcclxuXHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNob3J0Q3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAoIERPTVV0aWxzLmdldFBhcmVudEZyb21TZWxlY3Rpb24oXCIuYmxvY2tcIikgfHwgRE9NVXRpbHMuZ2V0UGFyZW50VGFyZ2V0QnlTZWxlY3RvcihldmVudCBhcyBNb3VzZUV2ZW50LCBcIi5ibG9ja1wiKSApIGFzIEhUTUxIdG1sRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAvLyAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmIChjb250YWluZXI/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGZvY3VzYWJsZVBhcmVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGZvY3VzYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIGFzeW5jICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiA9IHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5kcm9wZG93bkl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93bk1lbnVMaXN0LnN3aXRjaFZpc3VhbEZvY3VzKG5vZGUhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdoaWxpdGVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgYmFja2dyb3VuZCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5oaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmZvcmVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmNlbGxIaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy50YWJsZUNlbGxDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb2xvciB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgJ2NvcmVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgY29sb3IuXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmIChzdGF0ZXMuY2VsbEhpbGl0ZUNvbG9yW3RoaXMudmFsdWVdKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB7IGNvbW1hbmQsIHNob3dVSSwgdmFsdWUsIHRhcmdldEJsb2NrVHlwZSB9ID0gZXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUNoZWNrSWNvblZpc2liaWxpdHkoKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29sb3JDaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiB8fFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwgdGhpcy5oYW5kbGVDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZUV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0Q2xhc3MgJiYgZGV0YWlscy50YXJnZXRDbGFzcy5pbmNsdWRlcyhcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiKSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRWYWx1ZXMgPSAoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoYCMke2V2ZW50VmFsdWVzLmJsb2NrSWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSA9PSBldmVudFZhbHVlcy5sYW5ndWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGxldCBjaGlsZCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGNoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2hpbGQubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChuZXh0U2libGluZyAmJiB0aGlzLnNob3VsZE1lcmdlKGNoaWxkLCBuZXh0U2libGluZykpIHtcclxuICAgIC8vICAgICAgICAgICAgIChjaGlsZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MICs9IChuZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0O1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgZWxlbWVudC5ub3JtYWxpemUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzaG91bGRNZXJnZShub2RlMTogQ2hpbGROb2RlLCBub2RlMjogQ2hpbGROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUxPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZTI/Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IGVsZW0xID0gbm9kZTEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgY29uc3QgZWxlbTIgPSBub2RlMiBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICByZXR1cm4gZWxlbTEudGFnTmFtZSA9PT0gZWxlbTIudGFnTmFtZSAmJlxyXG4gICAgLy8gICAgICAgICBlbGVtMS5zdHlsZS5jc3NUZXh0ID09PSBlbGVtMi5zdHlsZS5jc3NUZXh0ICYmXHJcbiAgICAvLyAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0xKS5jb2xvciA9PT0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbTIpLmNvbG9yO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBhc3luYyBjaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYXdhaXQgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcXVlcnkgY29tbWFuZCBzdGF0ZTpcIiwgZXJyb3IpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93SGlkZUFjdGl2ZUJ1dHRvbiwgdGhpcy5oYW5kbGVTaG93SGlkZUFjdGl2ZUJ1dHRvbkV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB0aGlzLmhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0Py5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzISkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKCEoZGV0YWlscy5hY3Rpb24gaW5zdGFuY2VvZiBTaG93SGlkZUFjdGl2ZUJ1dHRvbikpe1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudFZhbHVlcyA9IChkZXRhaWxzLmFjdGlvbiBhcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29sb3IgPSBldmVudFZhbHVlcy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09IGV2ZW50Q29sb3IudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VmFsdWVzLmludGVudGlvbiA9PSBcInNob3dcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50KGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdD8uaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcyEpKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZighKGRldGFpbHMuYWN0aW9uIGluc3RhbmNlb2YgUmVzZXRBY3RpdmVCdXR0b25zKSl7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRMZWZ0SWNvbkNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgIC8vIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3QgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/OiBEcm9wZG93bk1lbnVCdXR0b247XHJcblxyXG4gICAgZHJvcGRvd25JdGVtczogQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PElEcm9wZG93bk1lbnVJdGVtPjtcclxuICAgIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcbiAgICBmaWx0ZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gbmV3IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxEcm9wZG93bk1lbnVMaXN0SXRlbT4oKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQ6IEhUTUxVTGlzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnYmxvY2stdHlwZScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc29mdC1ib3gtc2hhZG93JywgJ2RlcGVuZGVudC1ib3gnLCAnY2hlY2thYmxlLWl0ZW1zJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gXCIyNXZtYXhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguRXh0cmVtZWx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLy8gU2V0IGB0cnVlYCB0byBjYXB0dXJlIHRoZSBldmVudCBkdXJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBwaGFzZSwgZ2l2aW5nIHRoaXMgZnVuY3Rpb24gcHJpb3JpdHkgb3ZlciBvdGhlcnMuXHJcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgZXZlbnQgZnJvbSBiZWluZyBoYW5kbGVkIGJ5IGVhcmxpZXIgYENvbnRlbnRgIGNvbXBvbmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmVtaXRDb21tYW5kRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd0Rvd25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBGbG9hdGluZ1Rvb2xiYXIgd2l0aCBhIERyb3Bkb3duTGlzdCwgdGhpcyBoYW5kbGVyIHNob3VsZCBiZSBpZ25vcmVkIGZvciBzbW9vdGhlciBVSSBjb250cm9sLiBcclxuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBjb21wb25lbnRzIGxpa2UgQmxvY2tUb29sYm94LCB3aGVyZSB0aGVyZSdzIG5vIHJpc2sgb2YgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmluZyBhZnRlciBwcmVzc2luZyBFc2NhcGUgKGlmIHRoZSBjdXJzb3IgaXMgd2l0aGluIHRoZSBibG9jayksXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXIgaXMgdXNlZCB0byBjbG9zZSB0aGUgZHJvcGRvd24gbGlzdCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgRXNjYXBlLlxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRXNjYXBlICYmICF0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoXCIuZmxvYXRpbmctdG9vbGJhclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVyS2V5RG93bkV2ZW50LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja0Nsb25lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZXJLZXlEb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgL15bYS16QS1aXSQvLnRlc3QoZXZlbnQua2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciArPSBldmVudC5rZXk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkJhY2tzcGFjZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcigpIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJcIiB8fCBpdGVtLnZhbHVlPy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHx8IGl0ZW0udGl0bGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXIudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlciA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IFwiMFwiO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcImF1dG9cIjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbikge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcImF1dG9cIjtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5yaWdodCA9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLXVwXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi1kb3duXCIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbT8udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hWaXN1YWxGb2N1cyhpdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnJlbW92ZUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBpdGVtO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBuZXh0VmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldE5leHRTYXRpc2Z5aW5nKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSAmJiBpdGVtLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xyXG4gICAgICAgIG5leHRWaXNpYmxlSXRlbT8udmFsdWUuZW5zdXJlVmlzaWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtICYmIGl0ZW0uaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtPy52YWx1ZS5lbnN1cmVWaXNpYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgICAgICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uaHRtbEVsZW1lbnQuaWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgLy8mJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/Lmh0bWxFbGVtZW50LmlkfWApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHByZWZpeElkOiBzdHJpbmcsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnVMaXN0IHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KHByZWZpeElkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpKTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtpZDogaWR9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiMjRweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSaWdodCA9IFwiMXB4IHNvbGlkICNkMGQwZDBcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW4gPSBcImF1dG8gNnB4XCI7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXAgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaXRlbVwiKTtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gXCIxMHB4XCI7XHJcbiAgICAgICAgLy8gaHRtbEVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjEwcHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL1NWR0ljb25cIjtcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXBJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd1VJOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgaWNvbjogU1ZHSWNvbikge1xuXG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5zaG93VUkgPSBjb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUxpbms7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG5cbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImVudHJ5XCIsIFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLW9wZXJhdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiKTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlO1xuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIGFzeW5jIChldmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBzaG93VUk6IHRoaXMuc2hvd1VJLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+O1xuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZiAoc3RhdGVzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pZCA9PSBkZXRhaWxzLnRhcmdldElkKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoKGRldGFpbHMuYWN0aW9uIGFzIENoYW5nZUNvbG9yKS5jb2xvcilcblxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXRhaWxzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgIC8vICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZih0aGlzLmlkID09IGRldGFpbHMudGFyZ2V0SWQpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcigoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQ29sb3IpLmNvbG9yKVxuXG4gICAgICAgIC8vICAgICAgICAgLy8gaWYgKGRldGFpbHNbdGhpcy5jb21tYW5kIGFzIGtleW9mIElGb3JtYXRDb21tYW5kXSkge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGljb246IFNWR0ljb24pOiBCdXR0b25Hcm91cEl0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwSXRlbShjb21tYW5kLCB0aXRsZSwgaWNvbik7XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9ySWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjUwJVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMucHJvcHMuY29sb3I7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBJRHJvcGRvd25NZW51SXRlbSB9IGZyb20gXCIuL0lEcm9wZG93bk1lbnVJdGVtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcblxyXG4gICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LCB0aXRsZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBhY3RpdmVJY29uPzogU1ZHSWNvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IFwiXCI7XHJcbiAgICBcclxuICAgIGNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZ2V0TGVmdEljb25CYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRBY3RpdmVJY29uKCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXR0YWNoT25Mb3NlRm9jdXMoZnVuYzogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm5vLWxpc3Qtc3R5bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcclxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIHRpdGxlLmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMsIENvbG9yc05hbWVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvQmxvY2tUb29sYm94XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW0gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUJ1dHRvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0SXRlbSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSXRlbUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25JdGVtSURzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQmxvY2tUb29sYm94QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGFsaWduVG9vbCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5TGVmdCwgXCJMZWZ0XCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkp1c3RpZnlTdGFydCwgU2l6ZXMubGFyZ2UpKS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5Q2VudGVyLCBcIkNlbnRlclwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5Q2VudGVyLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLkp1c3RpZnlSaWdodCwgXCJSaWdodFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5RW5kLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvclRvb2woKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcImNvbG9ySW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JJbnRlcmFjdGl2ZUJ1dHRvblwiICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBuZXcgQ29sb3JJY29uKFwiI0ZBRjREMVwiKS5odG1sRWxlbWVudCwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIGNvbG9yQnV0dG9uLmFkZENzc0NsYXNzKFwiY29sb3ItaW50ZXJhY3RpdmUtYnV0dG9uXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcImNvbG9ySW50ZXJhY3Rpb25PcHRpb25zTWVudVwiICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckJ1dHRvbiwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiQmFja2dyb3VuZFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yUmVkID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uUmVkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IEhpbGl0ZUNvbG9yR3JlZW4gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25HcmVlbiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kR3JlZW4sIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvckJsdWUgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25CbHVlICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRCbHVlLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpLmh0bWxFbGVtZW50LCBcIkJsdWVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yWWVsbG93ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uWWVsbG93ICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yR3JleSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZXkgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy5jaGFuZ2VDYWxsb3V0QmFja2dyb3VuZENvbG9yLCBDb2xvcnNOYW1lcy5DYWxsb3V0QmFja2dyb3VuZEdyZXksIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSkuaHRtbEVsZW1lbnQsIFwiR3JleVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uTm9uZSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChIaWxpdGVDb2xvckdyZWVuKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZXkpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbGFuZ3VhZ2VTZWxlY3Rpb25Ub29sKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IERyb3Bkb3duTWVudUxpc3QuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZU9wdGlvblNlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZUJ1dHRvblwiLCBcIlBsYWluIFRleHRcIiwgc2VsZWN0LCB0cnVlLCBbXCJjb2RlLWJsb2NrLWxhbmd1YWdlLW1lbnVcIiwgXCJjb2xvci1pbnRlcmFjdGl2ZS1idXR0b25cIl0pO1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBEcm9wZG93bk1lbnUuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGlvbk9wdGlvbnNNZW51XCIsIGJ1dHRvbiwgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgc2VsZWN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShzZWxlY3QsIFwiTGFuZ3VhZ2VcIikpO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhCbG9ja1Rvb2xib3gubGFuZ3VhZ2VNYXApLnNvcnQoKGEsIGIpID0+IGFbMV0ubG9jYWxlQ29tcGFyZShiWzFdKSkuZm9yRWFjaCgoW2NvZGUsIG5hbWVdKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJsYW5ndWFnZVNlbGVjdGlvbkl0ZW0tXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIHNlbGVjdCwgQ29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UsIGNvZGUsIG51bGwsIG5hbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJwbGFpbnRleHRcIikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZChpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGV4dHJhT3B0aW9ucygpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ID0gRHJvcGRvd25NZW51TGlzdC5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiwgW1wibWVkaWEtbW9yZS1vcHRpb24tc2VsZWN0XCJdKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibW9yZUludGVyYWN0aXZlT3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIGxpc3QsIGZhbHNlLCBbXCJtb3JlTWVkaWFPcHRpb25zQnV0dG9uXCJdKTtcclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IERyb3Bkb3duTWVudS5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25zTWVudVwiLCBidXR0b24sIGxpc3QpO1xyXG5cclxuICAgICAgICBsaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShsaXN0LCBcIk1vcmUgb3B0aW9uc1wiKSk7XHJcbiAgICAgICAgbGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZHVwbGljYXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5EdXBsaWNhdGUsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJDbG9uZVwiLCBcIkN0cmwrRFwiKSk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmRlbGV0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5UcmFzaCwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbGlzdC5hcHBlbmQoZGVsZXRlSXRlbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElCbG9ja1Rvb2xib3ggfSBmcm9tIFwiLi9JQmxvY2tUb29sYm94XCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgVG9vbGJveE9wdGlvbnMgfSBmcm9tIFwiLi9Ub29sYm94T3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3hCdWlsZGVyIH0gZnJvbSBcIkAvYnVpbGRlcnMvQmxvY2tUb29sYm94QnVpbGRlclwiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCJAL2NvbW1vbi9ET01FbGVtZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tb25DbGFzc2VzIH0gZnJvbSBcIkAvY29tbW9uL0NvbW1vbkNsYXNzZXNcIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCbG9ja1Rvb2xib3ggaW1wbGVtZW50cyBJQmxvY2tUb29sYm94IHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQmxvY2tUb29sYm94O1xyXG5cclxuICAgIHN0YXRpYyBsYW5ndWFnZU1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgICAvLyBcIjFjXCI6IFwiMUNcIixcclxuICAgICAgICAvLyBcImFibmZcIjogXCJBQk5GXCIsIFxyXG4gICAgICAgIC8vIFwiYWNjZXNzbG9nXCI6IFwiQWNjZXNzIExvZ3NcIiwgXHJcbiAgICAgICAgLy8gXCJhY3Rpb25zY3JpcHRcIjogXCJBY3Rpb25TY3JpcHRcIiwgXHJcbiAgICAgICAgXCJhZGFcIjogXCJBZGFcIixcclxuICAgICAgICAvL1wiYW5nZWxzY3JpcHRcIjogXCJBbmdlbFNjcmlwdFwiLCBcclxuICAgICAgICBcImFwYWNoZVwiOiBcIkFwYWNoZSBDb25maWdcIixcclxuICAgICAgICBcImFwcGxlc2NyaXB0XCI6IFwiQXBwbGVTY3JpcHRcIixcclxuICAgICAgICBcImFyZHVpbm9cIjogXCJBcmR1aW5vXCIsXHJcbiAgICAgICAgLy8gXCJhcm1hc21cIjogXCJBUk0gQXNzZW1ibHlcIiwgXHJcbiAgICAgICAgXCJhc2NpaWRvY1wiOiBcIkFzY2lpRG9jXCIsXHJcbiAgICAgICAgLy8gXCJhc21cIjogXCJBc3NlbWJseVwiLCBcclxuICAgICAgICAvLyBcImF1dG9ob3RrZXlcIjogXCJBdXRvSG90a2V5XCIsIFxyXG4gICAgICAgIC8vIFwiYXV0b2l0XCI6IFwiQXV0b0l0XCIsIFxyXG4gICAgICAgIFwiYmFzaFwiOiBcIkJhc2hcIixcclxuICAgICAgICBcImJhc2ljXCI6IFwiQkFTSUNcIixcclxuICAgICAgICBcImNcIjogXCJDXCIsXHJcbiAgICAgICAgXCJjc2hhcnBcIjogXCJDI1wiLFxyXG4gICAgICAgIFwiY3BwXCI6IFwiQysrXCIsXHJcbiAgICAgICAgXCJjc3NcIjogXCJDU1NcIixcclxuICAgICAgICAvLyBcImNsb2p1cmVcIjogXCJDbG9qdXJlXCIsIFxyXG4gICAgICAgIFwiY29mZmVlc2NyaXB0XCI6IFwiQ29mZmVlU2NyaXB0XCIsXHJcbiAgICAgICAgLy8gXCJkXCI6IFwiRFwiLCBcclxuICAgICAgICBcImRhcnRcIjogXCJEYXJ0XCIsXHJcbiAgICAgICAgLy8gXCJkZWxwaGlcIjogXCJEZWxwaGlcIiwgXHJcbiAgICAgICAgLy8gXCJlbGl4aXJcIjogXCJFbGl4aXJcIiwgXHJcbiAgICAgICAgLy8gXCJlbG1cIjogXCJFbG1cIiwgXHJcbiAgICAgICAgLy8gXCJlcmxhbmdcIjogXCJFcmxhbmdcIiwgXHJcbiAgICAgICAgLy8gXCJmc2hhcnBcIjogXCJGI1wiLCBcclxuICAgICAgICAvLyBcImZvcnRyYW5cIjogXCJGb3J0cmFuXCIsIFxyXG4gICAgICAgIFwiZ29cIjogXCJHb1wiLFxyXG4gICAgICAgIC8vIFwiZ3Jvb3Z5XCI6IFwiR3Jvb3Z5XCIsIFxyXG4gICAgICAgIC8vIFwiaGFza2VsbFwiOiBcIkhhc2tlbGxcIiwgXHJcbiAgICAgICAgXCJodG1sXCI6IFwiSFRNTFwiLFxyXG4gICAgICAgIFwiamF2YVwiOiBcIkphdmFcIixcclxuICAgICAgICBcImphdmFzY3JpcHRcIjogXCJKYXZhU2NyaXB0XCIsXHJcbiAgICAgICAgXCJqc29uXCI6IFwiSlNPTlwiLFxyXG4gICAgICAgIC8vIFwianVsaWFcIjogXCJKdWxpYVwiLCBcclxuICAgICAgICAvLyBcImtvdGxpblwiOiBcIktvdGxpblwiLCBcclxuICAgICAgICAvLyBcImxhdGV4XCI6IFwiTGFUZVhcIiwgXHJcbiAgICAgICAgLy8gXCJsaXNwXCI6IFwiTGlzcFwiLCBcclxuICAgICAgICAvLyBcImx1YVwiOiBcIkx1YVwiLCBcclxuICAgICAgICBcIm1hcmtkb3duXCI6IFwiTWFya2Rvd25cIixcclxuICAgICAgICAvLyBcIm1hdGxhYlwiOiBcIk1BVExBQlwiLCBcclxuICAgICAgICAvLyBcIm9iamVjdGl2ZS1jXCI6IFwiT2JqZWN0aXZlLUNcIiwgXHJcbiAgICAgICAgXCJwZXJsXCI6IFwiUGVybFwiLFxyXG4gICAgICAgIFwicGhwXCI6IFwiUEhQXCIsXHJcbiAgICAgICAgXCJwbGFpbnRleHRcIjogXCJQbGFpbiBUZXh0XCIsXHJcbiAgICAgICAgXCJweXRob25cIjogXCJQeXRob25cIixcclxuICAgICAgICAvLyBcInJcIjogXCJSXCIsIFxyXG4gICAgICAgIFwicnVieVwiOiBcIlJ1YnlcIixcclxuICAgICAgICAvLyBcInJ1c3RcIjogXCJSdXN0XCIsIFxyXG4gICAgICAgIC8vIFwic2NhbGFcIjogXCJTY2FsYVwiLCBcclxuICAgICAgICAvLyBcInNjaGVtZVwiOiBcIlNjaGVtZVwiLCBcclxuICAgICAgICBcInNjc3NcIjogXCJTQ1NTXCIsXHJcbiAgICAgICAgXCJzaGVsbFwiOiBcIlNoZWxsXCIsXHJcbiAgICAgICAgXCJzcWxcIjogXCJTUUxcIixcclxuICAgICAgICAvLyBcInN3aWZ0XCI6IFwiU3dpZnRcIiwgXHJcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCI6IFwiVHlwZVNjcmlwdFwiLFxyXG4gICAgICAgIC8vIFwidmJuZXRcIjogXCJWaXN1YWwgQmFzaWMgLk5FVFwiLCBcclxuICAgICAgICAvLyBcInZoZGxcIjogXCJWSERMXCIsIFxyXG4gICAgICAgIFwieG1sXCI6IFwiWE1MXCIsXHJcbiAgICAgICAgXCJ5YW1sXCI6IFwiWUFNTFwiXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKEJsb2NrVG9vbGJveC5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tUb29sYm94LmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEJsb2NrVG9vbGJveCB7XHJcbiAgICAgICAgaWYgKCFCbG9ja1Rvb2xib3guaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgQmxvY2tUb29sYm94Lmluc3RhbmNlID0gbmV3IEJsb2NrVG9vbGJveCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQmxvY2tUb29sYm94Lmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkxpc3RlbmluZyBibG9jayB0b29sYm94ZXMuLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VvdmVyLCB0aGlzLmluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkZvY3VzaW4sIHRoaXMuaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzSW4uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuRm9jdXNvdXQsIHRoaXMuaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzT3V0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sYm94VmlzaWJpbGl0eUNvbnRyb2xsZXIodGFyZ2V0RWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSGFuZGxlcyBmb2N1cyBpbiBldmVudHMgd2l0aGluIGEgdGFibGUuIElmIHRoZSBmb2N1cyBpcyB3aXRoaW4gYSB0YWJsZSBlbGVtZW50LFxyXG4gICAgKiBpdCB0cmlnZ2VycyB0aGUgdG9vbGJveCB2aXNpYmlsaXR5IGNvbnRyb2xsZXIgdG8gcG90ZW50aWFsbHkgaGlkZSB0aGUgdG9vbGJveC5cclxuICAgICogVGhpcyBpcyBkZXNpZ25lZCB0byBwcmV2ZW50IHRoZSB0b29sYm94IGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0YWJsZSBpbnRlcmFjdGlvbnMuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7Rm9jdXNFdmVudH0gZXZlbnQgLSBUaGUgZm9jdXMgZXZlbnQgdHJpZ2dlcmVkIHdoZW4gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHRhYmxlIGdhaW5zIGZvY3VzLlxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzSW4oZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9vbGJveFZpc2liaWxpdHlDb250cm9sbGVyKHRhcmdldEVsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgZm9jdXMgb3V0IGV2ZW50cyB3aXRoaW4gYSB0YWJsZS4gSWYgdGhlIGZvY3VzIG1vdmVzIG91dCBvZiBhIHRhYmxlIGVsZW1lbnQsXHJcbiAgICAgKiBpdCB0cmlnZ2VycyB0aGUgdG9vbGJveCB2aXNpYmlsaXR5IGNvbnRyb2xsZXIgdG8gcG90ZW50aWFsbHkgc2hvdyB0aGUgdG9vbGJveC5cclxuICAgICAqIFRoaXMgaGVscHMgaW4gZW5zdXJpbmcgdGhhdCB0aGUgdG9vbGJveCBpcyBhdmFpbGFibGUgZm9yIHVzZSB3aGVuIHRoZSB0YWJsZSBpcyBub3QgYWN0aXZlbHkgZm9jdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0ZvY3VzRXZlbnR9IGV2ZW50IC0gVGhlIGZvY3VzIGV2ZW50IHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgd2l0aGluIHRoZSB0YWJsZSBsb3NlcyBmb2N1cy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c091dChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sYm94VmlzaWJpbGl0eUNvbnRyb2xsZXIodGFyZ2V0RWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcihjZWxsOiBIVE1MRWxlbWVudCwgZm9yY2VIaWRlRWxlbWVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY2VsbC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1dyYXBwZXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKCcuYmxvY2stdG9vbGJhcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uc1dyYXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JjZUhpZGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYC4ke1Rvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzc31gKTtcclxuXHJcbiAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5jbG9zZXN0KFwiLmJsb2NrXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWJsb2NrKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zQnV0dG9uRXhpc3RzID0gYmxvY2sucXVlcnlTZWxlY3RvcignLmJsb2NrLXRvb2xiYXItd3JhcHBlcicpICE9PSBudWxsO1xyXG4gICAgICAgIGlmICghb3B0aW9uc0J1dHRvbkV4aXN0cykge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUxhbmd1YWdlU2VsZWN0aW9uVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkxhbmd1YWdlU2VsZWN0aW9uVG9vbENsYXNzKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUFsaWduVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUNvbG9yVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkNvbG9yVG9vbENsYXNzKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUV4dHJhT3B0aW9ucyA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xib3hXcmFwcGVyID0gQmxvY2tUb29sYm94LmNyZWF0ZVRvb2xib3goaW5jbHVkZUxhbmd1YWdlU2VsZWN0aW9uVG9vbCwgaW5jbHVkZUFsaWduVG9vbCwgaW5jbHVkZUNvbG9yVG9vbCwgaW5jbHVkZUV4dHJhT3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKHRvb2xib3hXcmFwcGVyKTtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZW50ZXIsIChldmVudCkgPT4gdGhpcy5yZXNldFRvb2xib3goZXZlbnQsIGJsb2NrIGFzIEhUTUxFbGVtZW50KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYmxvY2suYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vtb3ZlLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChibG9ja1Rvb2xiYXJJZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29sYmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUJsb2NrVG9vbGJveCh0b29sYm94V3JhcHBlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBibG9jay5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWxlYXZlLCAoKSA9PiB0aGlzLmhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXIpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFET01VdGlscy5pc1RhcmdldERlc2NlbmRhbnRPZlNlbGVjdG9yKGV2ZW50LCBgIyR7YmxvY2suaWR9YCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQmxvY2tUb29sYm94KHRvb2xib3hXcmFwcGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lcyA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpZnJhbWVcIik7XHJcbiAgICAgICAgICAgICAgICBpZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VlbnRlciwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXJJZCA9ICh0b29sYm94V3JhcHBlci5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50KT8uaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJDb2xvcihibG9jayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlbGVhdmUsICgpID0+IHRoaXMuaGlkZUJsb2NrVG9vbGJveCh0b29sYm94V3JhcHBlcikpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2s6IEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBjb2xvckludGVyYWN0aXZlQnV0dG9uID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jb2xvci1pbnRlcmFjdGl2ZS1idXR0b24gZGl2XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNhbGxvdXRXcmFwcGVyID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0LXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGlmIChjb2xvckludGVyYWN0aXZlQnV0dG9uICYmIGNhbGxvdXRXcmFwcGVyKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjYWxsb3V0V3JhcHBlcik7XHJcblxyXG4gICAgICAgICAgICBjb2xvckludGVyYWN0aXZlQnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IHN0eWxlLmJvcmRlckNvbG9yO1xyXG4gICAgICAgICAgICBjb2xvckludGVyYWN0aXZlQnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjY2NjXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xyXG4gICAgICAgIGNvbnN0IHRvb2xiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChibG9ja1Rvb2xiYXJJZCk7XHJcbiAgICAgICAgaWYgKHRvb2xiYXIpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghQmxvY2tUb29sYm94LmlzQW55RGVwZW5kZW50Qm94VmlzaWJsZSh0b29sYmFyKSkge1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQW55RGVwZW5kZW50Qm94VmlzaWJsZShodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRlbnRCb3hlcyA9IGh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZGVwZW5kZW50LWJveFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBib3ggb2YgZGVwZW5kZW50Qm94ZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShib3gpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBzdHlsZS52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFRvb2xib3goZXZlbnQ6IEV2ZW50LCBibG9jazogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmJsb2NrLXRvb2xiYXJcIik7XHJcblxyXG4gICAgICAgIGlmICghYmxvY2tUb29sYmFyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmxvY2stdG9vbGJhciBub3QgZm91bmRcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vcmUgPSBibG9ja1Rvb2xiYXIucXVlcnlTZWxlY3RvcihcIi5tZWRpYS1tb3JlLW9wdGlvbi1zZWxlY3RcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKG1vcmUpIHtcclxuICAgICAgICAgICAgbW9yZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IGJsb2NrVG9vbGJhci5xdWVyeVNlbGVjdG9yKFwiLmNvbG9yLWludGVyYWN0aXZlLXNlbGVjdFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAoY29sb3IpIHtcclxuICAgICAgICAgICAgY29sb3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGVUb29sYm94KGluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wgPSBmYWxzZSwgaW5jbHVkZUFsaWduVG9vbCA9IGZhbHNlLCBpbmNsdWRlQ29sb3JUb29sID0gZmFsc2UsIGluY2x1ZGVFeHRyYU9wdGlvbnMgPSBmYWxzZSk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJibG9jay10b29sYmFyLXdyYXBwZXJcIiwgXCJleGNsdWRlLWZyb20tY2xvbmVcIiwgQ29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5KTtcclxuICAgICAgICBodG1sRWxlbWVudFdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYmxvY2stdG9vbGJhclwiLCBcInNvZnQtYm94LXNoYWRvd1wiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IGBidGItJHtVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCl9YDtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnRXcmFwcGVyLmFwcGVuZENoaWxkKGh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoQmxvY2tUb29sYm94QnVpbGRlci5sYW5ndWFnZVNlbGVjdGlvblRvb2woKS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5jbHVkZUFsaWduVG9vbCkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmFsaWduVG9vbCgpLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmNsdWRlQ29sb3JUb29sKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKEJsb2NrVG9vbGJveEJ1aWxkZXIuY29sb3JUb29sKCkuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVFeHRyYU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoQmxvY2tUb29sYm94QnVpbGRlci5leHRyYU9wdGlvbnMoKS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnRXcmFwcGVyO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcclxuaW1wb3J0IHsgSVVJRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JVUlFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSB9IGZyb20gXCJAL2NvbW1hbmRzL1VJQWN0aW9ucy9DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZVwiO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvQmxvY2tUb29sYm94XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51QnV0dG9uIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICBzdmdJY29uPzogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdCwgaW5jbHVkZUNoZXZyb25JY29uOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgICBjb25zdCBzdmdJY29uID0gbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIiwgU2l6ZXMubWVkaXVtKTtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgZHJvcGRvd25MaXN0OiBkcm9wZG93bkxpc3QsXHJcbiAgICAgICAgICAgIHN2Z0ljb246IGluY2x1ZGVDaGV2cm9uSWNvbiA/IHN2Z0ljb24gOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZHJvcGRvd25MaXN0ID0gZHJvcGRvd25MaXN0O1xyXG4gICAgICAgIHRoaXMuc3ZnSWNvbiA9IHN2Z0ljb247XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5zZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50OiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC50aXRsZSA9IHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICBodG1sRWxlbWVudC5yb2xlID0gXCJidXR0b25cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b25cIiwgXCJ0ZXh0LWZvcm1hdHRpbmctb3BlcmF0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIsIFwicG9pbnRlclwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiLCB0aGlzLnByb3BzLmRyb3Bkb3duTGlzdC5odG1sRWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy50aXRsZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICBzcGFuLmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnN2Z0ljb24pIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5zdmdJY29uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnNob3coKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwgdGhpcy5oYW5kbGVDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZUV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0Q2xhc3MgJiYgdGhpcy5jbGFzc0xpc3QuaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcykpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gKGRldGFpbHMuYWN0aW9uIGFzIENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5odG1sRWxlbWVudC5jbG9zZXN0KGAjJHtldmVudFZhbHVlcy5ibG9ja0lkfWApO1xyXG5cclxuICAgICAgICAgICAgaWYoYmxvY2spe1xyXG4gICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRpdGxlKEJsb2NrVG9vbGJveC5sYW5ndWFnZU1hcFtldmVudFZhbHVlcy5sYW5ndWFnZV0pO1xyXG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGl0bGUodmFsdWU6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcihcInNwYW5cIik7XHJcbiAgICAgICAgaWYoc3Bhbil7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNyZWF0ZShwcmVmaXhJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGluY2x1ZGVDaGV2cm9uSWNvbj86IGJvb2xlYW4sIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnVCdXR0b24ge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihwcmVmaXhJZCArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgdGl0bGUsIGxpc3QsIGluY2x1ZGVDaGV2cm9uSWNvbik7XHJcbiAgICAgICAgaW5zdGFuY2UuYWRkQ3NzQ2xhc3MoLi4uY2xhc3Nlc0tleSk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgQnV0dG9uR3JvdXAgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cEl0ZW1cIjtcclxuaW1wb3J0IHsgQ29sb3JJY29uIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IEJ1dHRvbklEcyB9IGZyb20gXCJAL2NvcmUvQnV0dG9uSURzXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSXRlbUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25JdGVtSURzXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTGlzdElEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25MaXN0SURzXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25NZW51SURzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIge1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IFwiXCJcclxuICAgICAgICBjb25zdCBmbG9hdGluZ0JhciA9IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50dXJuSW50b0Ryb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidHVybkludG9TZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZEJ1dHRvbkdyb3VwKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idXR0b25Hcm91cCgpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmREcm9wZG93bihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuY29sb3JEcm9wZG93bigpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmRTZXBhcmF0b3IoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnNlcGFyYXRvcihcInRleHRPcGVyYXRpb25zU2VwYXJhdG9yXCIpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmREcm9wZG93bihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIubW9yZU9wdGlvbnNEcm9wZG93bigpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZsb2F0aW5nQmFyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0dXJuSW50b0Ryb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyTGlzdCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KFwidHVybkludG9TZWxlY3RcIik7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9CYXJCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwidHVybkludG9CdXR0b25cIiwgXCJUZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9Ecm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0dXJuSW50b01lbnVcIiwgdHVybkludG9CYXJCdXR0b24sIHR1cm5JbnRvQmFyTGlzdCk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUodHVybkludG9CYXJMaXN0LCBcIlR1cm4gaW50b1wiKSk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25UZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbnMucGFyYWdyYXBoLmh0bWxFbGVtZW50LCBcIlRleHRcIiwgXCJDdHJsK1NoaWZ0K0VudGVyXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbnMudG9kb19saXN0Lmh0bWxFbGVtZW50LCBcIlRvZG8gbGlzdFwiLCBcIkN0cmwrMVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJ1bGxldGVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBTVkdJY29ucy5iX2xpc3QuaHRtbEVsZW1lbnQsIFwiQnVsbGV0ZWQgbGlzdFwiLCBcIkN0cmwrLlwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbk51bWJlcmVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBTVkdJY29ucy5uX2xpc3QuaHRtbEVsZW1lbnQsIFwiTnVtYmVyZWQgbGlzdFwiLCBcIkN0cmwrL1wiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJsb2NrQ29kZVwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBTVkdJY29ucy5jb2RlLmh0bWxFbGVtZW50LCBcIkJsb2NrIGNvZGVcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25RdW90ZVwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgU1ZHSWNvbnMucXVvdGUuaHRtbEVsZW1lbnQsIFwiUXVvdGVcIikpO1xyXG4gICAgICAgIC8vdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmcxXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBTVkdJY29ucy5oZWFkMS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDFcIiwgXCJDdHJsK0FsdCsxXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzJcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFNWR0ljb25zLmhlYWQyLmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgMlwiLCBcIkN0cmwrQWx0KzJcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nM1wiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgU1ZHSWNvbnMuaGVhZDMuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyAzXCIsIFwiQ3RybCtBbHQrM1wiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmc0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80LCBTVkdJY29ucy5oZWFkNC5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDRcIiwgXCJDdHJsK0FsdCs0XCIpKTtcclxuICAgICAgICAvL3R1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nNVwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgU1ZHSWNvbnMuaGVhZDUuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyA1XCIsIFwiQ3RybCtBbHQrNVwiKSk7XHJcbiAgICAgICAgLy90dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzZcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzYsIFNWR0ljb25zLmhlYWQ2Lmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgNlwiLCBcIkN0cmwrQWx0KzZcIikpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHVybkludG9Ecm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VwYXJhdG9yKGlkOiBzdHJpbmcpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYnV0dG9uR3JvdXAoKTogQnV0dG9uR3JvdXAge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwQnV0dG9uID0gbmV3IEJ1dHRvbkdyb3VwKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmsgPSBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLnRvZ2dsZUxpbmssIFwiTGlua1wiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5MaW5rLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIGxpbmsuc2V0SWQoQnV0dG9uSURzLkxpbmspO1xyXG4gICAgICAgIGxpbmsuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG5cclxuICAgICAgICBjb25zdCBib2xkID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVCb2xkLCBcIkJvbGRcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQm9sZCwgU2l6ZXMubGFyZ2UpKTtcclxuICAgICAgICBib2xkLnNldElkKEJ1dHRvbklEcy5Cb2xkKTtcclxuICAgICAgICBib2xkLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBpdGFsaWMgPSBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLnRvZ2dsZUl0YWxpYywgXCJJdGFsaWNcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSXRhbGljLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIGl0YWxpYy5zZXRJZChCdXR0b25JRHMuSXRhbGljKTtcclxuICAgICAgICBpdGFsaWMuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHVuZGVybGluZSA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lLCBcIlVuZGVybGluZVwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5VbmRlcmxpbmUsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgdW5kZXJsaW5lLnNldElkKEJ1dHRvbklEcy5VbmRlcmxpbmUpO1xyXG4gICAgICAgIHVuZGVybGluZS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaW5saW5lQ29kZSA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlSW5saW5lQ29kZSwgXCJDb2RlXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLklubGluZUNvZGUsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgaW5saW5lQ29kZS5zZXRJZChCdXR0b25JRHMuSW5saW5lQ29kZSk7XHJcbiAgICAgICAgaW5saW5lQ29kZS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3Qgc3RyaWtldGhyb3VnaCA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlU3RyaWtlVGhyb3VnaCwgXCJTdHJpa2UtdGhyb3VnaFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5TdHJpa2VUaHJvdWdoLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIHN0cmlrZXRocm91Z2guc2V0SWQoQnV0dG9uSURzLlN0cmlrZXRocm91Z2gpO1xyXG4gICAgICAgIHN0cmlrZXRocm91Z2guYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG5cclxuICAgICAgICByZXR1cm4gZ3JvdXBCdXR0b247XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNvbG9yRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChEcm9wZG93bkxpc3RJRHMuQ29sb3JUZXh0T3B0aW9uU2VsZWN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJjb2xvclRleHRCdXR0b25cIiwgbmV3IENvbG9ySWNvbihcIiNGQUY0RDFcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShEcm9wZG93bk1lbnVJRHMuQ29sb3JUZXh0T3B0aW9uc01lbnUsIGNvbG9yQnV0dG9uLCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJIaWdobGlnaHRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblJlZCwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JSZWQuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZWVuLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZWVuLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZWVuKS5odG1sRWxlbWVudCwgXCJHcmVlblwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvckdyZWVuLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yQmx1ZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkJsdWUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yQmx1ZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblllbGxvdywgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JleSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5LCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JHcmV5LmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbk5vbmUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yTm9uZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZWVuKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZXkpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiVGV4dFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JSZWQsIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBmb3JlQ29sb3JSZWQuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9yR3JlZW4sIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckdyZWVuLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JCbHVlLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckJsdWUuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JZZWxsb3csIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBmb3JlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvciwgQ29sb3JzLkZvcmVDb2xvckdyZXksIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgZm9yZUNvbG9yR3JleS5hZGRDbGFzcyhcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBTaXplcy5sYXJnZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBmb3JlQ29sb3JOb25lLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChmb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGZvcmVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9yZU9wdGlvbnNEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwibW9yZVRleHRPcHRpb25zTWVudVwiLCBtb3JlT3B0aW9uc0J1dHRvbiwgbW9yZU9wdGlvbnNMaXN0KTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShtb3JlT3B0aW9uc0xpc3QsIFwiTW9yZSBvcHRpb25zXCIpKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb3B5T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY29weVNlbGVjdGVkLCBudWxsLCBTVkdJY29ucy5jb3B5Lmh0bWxFbGVtZW50LCBcIkNvcHlcIiwgXCJDdHJsK0NcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY3V0T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY3V0U2VsZWN0ZWQsIG51bGwsIFNWR0ljb25zLmN1dC5odG1sRWxlbWVudCwgXCJDdXRcIiwgXCJDdHJsK1hcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicGFzdGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5wYXN0LCBudWxsLCBTVkdJY29ucy5wYXN0ZS5odG1sRWxlbWVudCwgXCJSZXBsYWNlXCIsIFwiQ3RybCtWXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImR1cGxpY2F0ZU9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29ucy5kdXBsaWNhdGUuaHRtbEVsZW1lbnQsIFwiQ2xvbmVcIiwgXCJDdHJsK0RcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicmVzZXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5yZW1vdmVGb3JtYXQsIG51bGwsIFNWR0ljb25zLmVyYXNlci5odG1sRWxlbWVudCwgXCJSZXNldCBTdHlsZVwiLCBcIkN0cmwrXFxcXFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJkZWxldGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5kZWxldGVCbG9jaywgbnVsbCwgU1ZHSWNvbnMuZGVsZXRlLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChkZWxldGVJdGVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHRvZG9fbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBiX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBjb2RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNvZGUtbWFya1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBxdW90ZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1xdW90ZVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMzogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtM1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZGVsZXRlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtdHJhc2hcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZXJhc2VyOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY2xlYXJcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY3V0OiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY3V0XCIsIFNpemVzLmxhcmdlKSxcclxuICAgIHBhc3RlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtcGFzdGVcIiwgU2l6ZXMubGFyZ2UpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIHJlc3VsdHMnO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdlbXB0eS1ibG9jay1vcHRpb25zJyk7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmNvbG9yID0gJ3JnYmEoNTUsIDUzLCA0NywgMC42NSknO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVtcHR5SW5kaWNhdG9yO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUXVpY2tNZW51U2VjdGlvbiB9IGZyb20gJy4vUXVpY2tNZW51U2VjdGlvbic7XG5pbXBvcnQgeyBRdWlja01lbnVFbXB0eSB9IGZyb20gJy4vUXVpY2tNZW51RW1wdHknO1xuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gJy4vUXVpY2tNZW51SXRlbSc7XG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9DaXJjdWxhckRvdWJseUxpbmtlZExpc3QnO1xuaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlJztcbmltcG9ydCB7IEpOb2RlIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9KTm9kZVwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gJ0AvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyJztcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSAnQC9jb3JlL0lGb2N1c1N0YWNrJztcbmltcG9ydCB7IElRdWlja01lbnUgfSBmcm9tICcuL0lRdWlja01lbnUnO1xuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gJ0AvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbCc7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tICdAL2NvbW1vbi9DdXN0b21FdmVudHMnO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSAnQC91dGlsaXRpZXMvRE9NVXRpbHMnO1xuaW1wb3J0IHsgRE9NRWxlbWVudHMgfSBmcm9tICdAL2NvbW1vbi9ET01FbGVtZW50cyc7XG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tICdAL2NvbW1vbi9aSW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSVF1aWNrTWVudSB7XG5cbiAgICBzdGF0aWMgaWQgPSBcInF1aWNrTWVudVwiO1xuXG4gICAgcHJpdmF0ZSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgY3VycmVudEZvY3VzZWRNZW51SXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgLy8gcHJpdmF0ZSBodG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSBtZW51U2VjdGlvbnM6IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxRdWlja01lbnVTZWN0aW9uPjtcbiAgICBwcml2YXRlIHF1aWNrTWVudUVtcHR5OiBRdWlja01lbnVFbXB0eTtcbiAgICBwcml2YXRlIGZpbHRlcklucHV0OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUXVpY2tNZW51IHwgbnVsbDtcblxuICAgIHByaXZhdGUgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaykge1xuXG4gICAgICAgIHN1cGVyKHt9KTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICAvLyB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBudWxsO1xuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucyA9IG5ldyBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj4oKTtcbiAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eSA9IG5ldyBRdWlja01lbnVFbXB0eSgpO1xuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuXG4gICAgICAgIC8vVE9ETzogR28gYmFjayBoZXJlXG4gICAgICAgIC8vIGxldCBibG9ja09wdGlvbnMgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibG9jay1vcHRpb25zJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gdGhpcy5xdWlja01lbnVFbXB0eS5hcHBlbmRUbyhibG9ja09wdGlvbnMpO1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xuXG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuICAgIH1cblxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gUXVpY2tNZW51LmlkO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucy13cmFwcGVyJywgJ3NvZnQtYm94LXNoYWRvdycpO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGNvbnN0IGJsb2NrT3B0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBibG9ja09wdGlvbnMuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucycpO1xuICAgICAgICBibG9ja09wdGlvbnMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJsb2NrT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xuICAgIH1cblxuICAgIGFwcGVuZChtZW51SXRlbTogUXVpY2tNZW51U2VjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucy5hcHBlbmQobWVudUl0ZW0pO1xuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibG9jay1vcHRpb25zJykhLmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFF1aWNrTWVudSB7XG5cbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25TZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlPihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIpO1xuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuXG4gICAgICAgIGlmICghUXVpY2tNZW51Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICBRdWlja01lbnUuaW5zdGFuY2UgPSBuZXcgUXVpY2tNZW51KGJsb2NrT3BlcmF0aW9uU2VydmljZSwgZm9jdXNTdGFjayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUXVpY2tNZW51Lmluc3RhbmNlO1xuICAgIH1cblxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+KTogdm9pZCB7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xuXG4gICAgICAgIC8vIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudT8uZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBmaXJzdFNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5nZXRGaXJzdCgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50U2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IGZpcnN0U2VjdGlvbk5vZGU7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRTZWN0aW9uTm9kZSkge1xuXG4gICAgICAgICAgICBjb25zdCBpdGVtTm9kZTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsID0gY3VycmVudFNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtTm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoVmlzdWFsRm9jdXMoaXRlbU5vZGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudFNlY3Rpb25Ob2RlID0gY3VycmVudFNlY3Rpb25Ob2RlLm5leHROb2RlO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb25Ob2RlID09IGZpcnN0U2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldFByZXZpb3VzU2F0aXNmeWluZyhpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghcHJldmlvdXNWaXNpYmxlSXRlbSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZVNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5pbW1lZGlhdGVQYXJlbnQpIS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzVmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHByZXZpb3VzVmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kTGFzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kTGFzdChzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgaWYgKCFsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IGxhc3RWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRMYXN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3dpdGNoVmlzdWFsRm9jdXMocHJldmlvdXNWaXNpYmxlSXRlbSEpO1xuICAgIH1cblxuICAgIGZvY3VzTmV4dFZpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGxldCBuZXh0VmlzaWJsZUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0TmV4dFNhdGlzZnlpbmcoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoIW5leHRWaXNpYmxlSXRlbSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IG5leHRWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmQodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmltbWVkaWF0ZVBhcmVudCkhLmdldE5leHRTYXRpc2Z5aW5nKHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gbmV4dFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZEZpcnN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGU6IG51bGwgfCBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmRGaXJzdChzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSBmaXJzdFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZEZpcnN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhuZXh0VmlzaWJsZUl0ZW0hKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJJdGVtcygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgc2VjdGlvbi5maWx0ZXJTZWN0aW9uKHRoaXMuZmlsdGVySW5wdXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMubWVudVNlY3Rpb25zLmFueShzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKSkge1xuICAgICAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eS5zaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LmhpZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0oKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBkaXNwbGF5IHRoZSBxdWlja01lbnU6IG5vIGFjdGl2ZSBlbGVtZW50IGZvdW5kLiBQbGVhc2UgZW5zdXJlIGFuIGVsZW1lbnQgaXMgZm9jdXNlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byBkaXNwbGF5IHRoZSBxdWlja01lbnUuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChhY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lbmh1bWEgc2VsZcOnw6NvIGVuY29udHJhZGEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYO1xuICAgICAgICBcbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xuICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcbiAgICAgICAgXG4gICAgICAgICAgICBzdXBlci5zaG93KCk7XG4gICAgICAgIFxuICAgICAgICAgICAgdGhpcy5mb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcbiAgICAgICAgXG4gICAgICAgIH0sIDEwKTtcblxuICAgIH1cblxuICAgIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLnJlc3RvcmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcblxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcbiAgICAgICAgLy8gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5mb2N1cygpO1xuXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50cygpIHtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwgKChldmVudDogQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29tbWFuZCB9ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pIGFzIEV2ZW50TGlzdGVuZXIpO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJy8nICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmIGJsb2NrKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHNob3cgcXVpY2tNZW51XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoXCIuaWdub3JlLXF1aWNrLW1lbnVcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHRWaXNpYmxlSXRlbSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd1VwJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgL15bYS16MC05IF0kL2kudGVzdChldmVudC5rZXkpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jYXRGaWx0ZXJJbnB1dChldmVudC5rZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVySW5wdXQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdFc2NhcGUnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrVHlwZSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbT8udmFsdWUuYmxvY2tUeXBlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudShibG9ja1R5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuYmxvY2tUeXBlQ2hhbmdlZCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBlbWl0Q29tbWFuZEV2ZW50KGJsb2NrVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYmxvY2tUeXBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBpZiAoYmxvY2tUeXBlKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25jYXRGaWx0ZXJJbnB1dChzdGc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ICs9IHN0Zy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gdGhpcy5maWx0ZXJJbnB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuL0Jhc2VEb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tICcuL0pOb2RlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBub2RlO1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5zZXROZXh0KG5vZGUpO1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vUXVpY2tNZW51JztcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuL1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51U2VjdGlvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnU7XHJcblxyXG4gICAgbWVudUl0ZW1zID0gbmV3IERvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51SXRlbT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBRdWlja01lbnVTZWN0aW9uT3B0aW9ucykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICAgICAgICBjbGFzc0xpc3Q6IG9wdGlvbnMuY2xhc3NMaXN0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW1tZWRpYXRlUGFyZW50ID0gb3B0aW9ucy5xdWlja01lbnVJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLnByb3BzLmNsYXNzTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xyXG4gICAgICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZChcIm5vLXNlbGVjdGlvblwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9ibG9ja1R5cGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pbW1lZGlhdGVQYXJlbnQ6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpY29uSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmxvY2tUeXBlID0gYmxvY2tUeXBlO1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50ID0gaW1tZWRpYXRlUGFyZW50O1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJywgXCJwb2ludGVyXCIsIFwibm8tc2VsZWN0aW9uXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmxvY2stb3BlcmF0aW9uJywgJ2FwcGx5LXNlbGVjdGVkLWJsb2NrLXR5cGUnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnb3B0aW9uJyk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG9wdGlvbkltYWdlLmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1pbWFnZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmcgPSBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLmljb25JZCwgJzEwMCUnKTtcclxuXHJcbiAgICAgICAgb3B0aW9uSW1hZ2UuYXBwZW5kQ2hpbGQoc3ZnLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uSW1hZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgb3B0aW9uVGV4dC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tdGV4dCcpO1xyXG5cclxuICAgICAgICBjb25zdCBibG9ja1RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuY2xhc3NMaXN0LmFkZCgnYmxvY2stdGl0bGUnKTtcclxuICAgICAgICBibG9ja1RpdGxlLmlubmVyVGV4dCA9IHRoaXMucHJvcHMudGl0bGU7XHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tUaXRsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrRGVzY3JpcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5jbGFzc0xpc3QuYWRkKCdibG9jay1kZXNjcmlwdGlvbicpO1xyXG4gICAgICAgIGJsb2NrRGVzY3JpcHRpb24uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5kZXNjcmlwdGlvbjtcclxuXHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tEZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvblRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW1tZWRpYXRlUGFyZW50ICgpOiBRdWlja01lbnVTZWN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW1tZWRpYXRlUGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBibG9ja1R5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmxvY2tUeXBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+ID0gdGhpcy5faW1tZWRpYXRlUGFyZW50Lm1lbnVJdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ltbWVkaWF0ZVBhcmVudC5pbW1lZGlhdGVQYXJlbnQuc3dpdGNoVmlzdWFsRm9jdXMobm9kZSEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51U2VjdGlvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvblwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVJdGVtXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFF1aWNrTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHF1aWNrTWVudTogUXVpY2tNZW51ID0gUXVpY2tNZW51LmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJhc2ljQmxvY2tzU2VjdGlvbjogUXVpY2tNZW51U2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdCYXNpYycsIGNsYXNzTGlzdDogJ2Jhc2ljLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBiYXNpY0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdUZXh0JywgJ1N0YXJ0IHdyaXRpbmcgaW4gcGxhaW4gdGV4dC4nLCAnaWNvbi1tYXRlcmlhbC1mb3JtYXQnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFwicGFyYWdyYXBoIHRleHQgcFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBcImJ1bGxldGVkIGxpc3QgdW5vcmRlcmVkIGxpc3QgdWxcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ051bWJlcmVkIGxpc3QnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnVGFibGUnLCAnT3JnYW5pemUgZGF0YSBpbiByb3dzIGFuZCBjb2x1bW5zLicsICdpY29uLW1hdGVyaWFsLXRhYmxlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwidGFibGUgdHIgdGhcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0NhbGxvdXQnLCAnRW1waGFzaXplIGtleSBwb2ludHMgd2l0aCBhIGNhbGxvdXQgYm94LicsIEljb25zLkNhbGxvdXQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIFwiY2FsbG91dCBub3RlIHNwb3RsaWdodFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQ29kZScsICdJbmNsdWRlIGEgY29kZSBzbmlwcGV0LicsICdpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmsnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBcImNvZGUgc2NyaXB0IHNvdXJjZSBtYXJrdXBcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1F1b3RlJywgJ0hpZ2hsaWdodCB0ZXh0IGFzIGEgcXVvdGUuJywgJ2ljb24td29yZHByZXNzLXF1b3RlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUsIFwicXVvdGUgYmxvY2txdW90ZSBjaXRhdGlvbiBxdW90YXRpb24gY2l0ZVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAyJywgJ01lZGl1bSBoZWFkZXIgZm9yIHNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBcImhlYWRlciAyIGhlYWRpbmcgMiBoMlwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAzJywgJ1NtYWxsIGhlYWRlciBmb3Igc3Vic2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzMsIFwiaGVhZGVyIDMgaGVhZGluZyAzIGgzXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdTZXBhcmF0b3InLCAnVmlzdWFsbHkgZGl2aWRlIGJsb2Nrcy4nLCAnaWNvbi13b3JkcHJlc3Mtc2VwYXJhdG9yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU0VQQVJBVE9SLCBcInNlcGFyYXRvciBkaXZpZGVyIHJ1bGUgbGluZSBoclwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGJhc2ljQmxvY2tzU2VjdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdNZWRpYScsIGNsYXNzTGlzdDogJ21lZGlhLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBtZWRpYUJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2UuJywgSWNvbnMuSW1hZ2UyLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgXCJpbWFnZSBmaWd1cmUgcGhvdG8gaWxsdXN0cmF0aW9uIHBpY3R1cmUgbWVkaWEgdXBsb2FkXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdZb3VUdWJlJywgJ0VtYmVkIGEgWW91VHViZSB2aWRlby4nLCBJY29ucy5Zb3VUdWJlLCAndmlkZW8nLCBcInZpZGVvIGVtYmVkIHlvdXR1YmUgY2xpcCBmaWxtIG1vdmllIHRhcGVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChtZWRpYUJsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgXCJ0b2RvIGxpc3QgdGFzayBsaXN0IGNoZWNrbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdCdWxsZXRlZCBsaXN0JywgJ09yZ2FuaXplIGl0ZW1zIHdpdGggYnVsbGV0IHBvaW50cy4nLCAnaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChsaXN0QmxvY2tzU2VjdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZW1iZWRTZWN0aW9uID0gbmV3IFF1aWNrTWVudVNlY3Rpb24oeyBxdWlja01lbnVJbnN0YW5jZTogcXVpY2tNZW51LCB0aXRsZTogJ0VtYmVkJywgY2xhc3NMaXN0OiAnZW1iZWQtc2VjdGlvbicgfSk7XHJcblxyXG4gICAgICAgIGVtYmVkU2VjdGlvbi5hcHBlbmRRdWlja01lbnVJdGVtcyhbXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdEh1YiBHaXN0JywgJ0VtYmVkIGEgR2l0SHViIEdpc3QuJywgSWNvbnMuR2l0SHViLCAnZ2l0aHViLWdpc3QnLCBcImNvZGUgZ2lzdCBnaXRodWIgc25pcHBldCBnaXRcIiksXHJcbiAgICAgICAgICAgIC8vIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdExhYiBTbmlwcGV0ICcsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsIEljb25zLkdpdExhYiwgJ2dpdGxhYi1zbmlwcGV0JywgXCJjb2RlIGdpdCBnaXRsYWIgc25pcHBldCBnaXN0XCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHaXRMYWIgU25pcHBldCAnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdDb2RlUGVuJywgJ0VtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtby4nLCBJY29ucy5Db2RlUGVuLCAnY29kZXBlbicsIFwiY29kZSBjb2RlcGVuXCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHb29nbGUgTWFwcycsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ1Nwb3RpZnknLCAnRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrLicsIEljb25zLlNwb3RpZnksICdzcG90aWZ5JywgXCJtcDMgc291bmQgYXVkaW8gbXVzaWMgc3BvdGlmeSB0cmFja1wiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChlbWJlZFNlY3Rpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gcXVpY2tNZW51O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidGl0bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgxXCIpO1xyXG4gICAgICAgIGgxLnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcInRydWVcIik7XHJcbiAgICAgICAgaDEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlVudGl0bGVkXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xyXG4gICAgICAgICAgICBoMS50ZXh0Q29udGVudCA9IHRoaXMucHJvcHMudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoMSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSh2YWx1ZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvdGl0bGUvVGl0bGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaXRsZUJ1aWxkZXIge1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRpdGxlIHtcclxuICAgICAgICByZXR1cm4gVGl0bGUuY3JlYXRlKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIGtleWJvYXJkIGFycm93IGRpcmVjdGlvbnMuXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBEaXJlY3Rpb25zIHtcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dVcCcga2V5LCB1c2VkIHRvIG5hdmlnYXRlIHVwd2FyZHMgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93VXAgPSBcIkFycm93VXBcIixcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dEb3duJyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgZG93bndhcmRzIGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0Rvd24gPSBcIkFycm93RG93blwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd0xlZnQnIGtleSwgdXNlZCB0byBuYXZpZ2F0ZSBsZWZ0IGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0xlZnQgPSBcIkFycm93TGVmdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd1JpZ2h0JyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgcmlnaHQgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93UmlnaHQgPSBcIkFycm93UmlnaHRcIixcclxufVxyXG4iLCJleHBvcnQgZW51bSBUYWJsZVNjb3BlcyB7XHJcbiAgICBDb2x1bW4gPSBcIkNvbHVtblwiLFxyXG4gICAgUm93ID0gXCJSb3dcIixcclxuICAgIENlbGwgPSBcIkNlbGxcIixcclxuICAgIFNlbGVjdGVkQ2VsbHMgPSBcIlNlbGVjdGVkQ2VsbHNcIlxyXG59IiwiZXhwb3J0IGVudW0gU2VsZWN0aW9uTW9kZXMge1xyXG4gICAgVGV4dCA9IFwiVGV4dFwiLFxyXG4gICAgQ2VsbCA9IFwiQ2VsbFwiLFxyXG4gICAgQmxvY2sgPSBcIkJsb2NrXCJcclxufSIsImltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xyXG5pbXBvcnQgeyBUb29sYm94T3B0aW9ucyB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbWJlZFRvb2wge1xyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEltYWdlKHVybE9iajogc3RyaW5nLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxPYmopO1xyXG5cclxuICAgICAgICBpZiAoIWF3YWl0IEVtYmVkVG9vbC52YWxpZGF0ZUltYWdlKHVybC50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGltYWdlXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHJcbiAgICAgICAgaW1hZ2Uuc3JjID0gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaW1hZ2UuYWx0ID0gJ0VtYmVkZGVkIEltYWdlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS53aWR0aCA9ICdhdXRvJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7XHJcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoVG9vbGJveE9wdGlvbnMuQWxpZ25Ub29sQ2xhc3MpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1Rvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzLCBcImZpdC1jb250ZW50XCIsIFwieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbGlkYXRlSW1hZ2UodXJsVG9DaGVjazogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmxUb0NoZWNrO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZEdvb2dsZVNoZWV0KHVybE9iajogVVJMLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRJZCA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpWzNdO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlU2hlZXRJZCA9IGVuY29kZVVSSUNvbXBvbmVudChzaGVldElkKTtcclxuXHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLyR7c2FmZVNoZWV0SWR9L3B1Ymh0bWw/d2lkZ2V0PXRydWUmYW1wO2hlYWRlcnM9ZmFsc2VgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzQ1MHB4JztcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSAnMCc7XHJcbiAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1wieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkWW91VHViZVZpZGVvQXNJZnJhbWUodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmxPYmouc2VhcmNoUGFyYW1zLmdldCgndicpO1xyXG4gICAgICAgIGlmICh2aWRlb0lkKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVWaWRlb0lkID0gZW5jb2RlVVJJQ29tcG9uZW50KHZpZGVvSWQpO1xyXG5cclxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3NhZmVWaWRlb0lkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xyXG4gICAgICAgICAgICBpZnJhbWUuYWxsb3cgPSBcImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcIngtcmVzaXphYmxlXCIsIFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzXSwgZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBZb3VUdWJlIHZpZGVvIFVSTCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKTtcclxuICAgICAgICBjb25zdCBzaG9ydElkID0gcGF0aFNlZ21lbnRzW3BhdGhTZWdtZW50cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgaWYgKHNob3J0SWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVTaG9ydElkSWQgPSBlbmNvZGVVUklDb21wb25lbnQoc2hvcnRJZCk7XHJcblxyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7c2FmZVNob3J0SWRJZH1gO1xyXG4gICAgICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93ID0gXCJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCI7XHJcbiAgICAgICAgICAgIGlmcmFtZS5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBTaG9ydHMgVVJMJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZFlvdVR1YmVQbGF5bGlzdEFzSWZyYW1lKHVybE9iajogVVJMLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3RJZCA9IHVybE9iai5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XHJcbiAgICAgICAgaWYgKGxpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBFbWJlZFRvb2wuY3JlYXRlRW1iZWRDb250YWluZXIoW1wiZW1iZWQtY29udGFpbmVyXCJdKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVMaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQobGlzdElkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3ZpZGVvc2VyaWVzP2xpc3Q9JHtzYWZlTGlzdElkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBwbGF5bGlzdCBVUkwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkU3BvdGlmeUNvbnRlbnQodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0eXBlOiBFbWJlZFR5cGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudElkID0gdXJsT2JqLnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3BvdGlmeS1lbWJlZFwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcblxyXG5cclxuICAgICAgICBpZiAoIWNvbnRlbnRJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udGVudElkIGlzIGVtcHR5XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzYWZlQ29udGVudElkID0gZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRlbnRJZCk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZChcInNwb3RpZnktZW1iZWRcIik7XHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vZW1iZWQvJHt0eXBlfS8ke3NhZmVDb250ZW50SWR9YDtcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic2Nyb2xsaW5nXCIsIFwibm9cIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVRyYWNrOlxyXG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiODBweFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q6XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5U2hvdzpcclxuICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlFcGlzb2RlOlxyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUFydGlzdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjM4MHB4XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEdpc3RBc1NjcmlwdCh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBnaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBpZiAoIWdpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBHaXN0IElEXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaGFkb3dFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzaGFkb3ctZWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImdpc3QtZW1iZWQtY29udGFpbmVyXCIsIFwiZmlndXJlLWVtYmVkLWNvbnRhaW5lclwiLCBcImlnbm9yZS10ZXh0LWZsb2F0aW5nLXRvb2xiYXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjEwMHB4XCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xyXG5cclxuXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNoYWRvd0VsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gc2hhZG93RWxlbWVudC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhZmVHaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQoZ2lzdElkKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NyaXB0U3JjID0gYGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLyR7c2FmZUdpc3RJZH0uanNgO1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgc2NyaXB0LnNyYyA9IHNjcmlwdFNyYztcclxuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFdyaXRlID0gZG9jdW1lbnQud3JpdGU7XHJcbiAgICAgICAgbGV0IHNjcmlwdE91dHB1dCA9ICcnO1xyXG4gICAgICAgIGRvY3VtZW50LndyaXRlID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzY3JpcHRPdXRwdXQgKz0gY29udGVudDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gc2NyaXB0T3V0cHV0O1xyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbSh0ZW1wRGl2LmNoaWxkTm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2lzdCBsb2FkZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aGUgR2lzdFwiKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcblxyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZENvZGVwZW5Bc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCA0IHx8IHBhcnRzWzFdID09PSAnJyB8fCBwYXJ0c1szXSA9PT0gJycpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkw6IEV4cGVjdGVkIGZvcm1hdCAvdXNlci97dXNlcm5hbWV9L3Blbi97cGVuSWR9Jyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHBhcnRzWzFdO1xyXG4gICAgICAgIGNvbnN0IHBlbiA9IHBhcnRzWzNdO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlVXNlciA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VyKTtcclxuICAgICAgICBjb25zdCBzYWZlUGVuID0gZW5jb2RlVVJJQ29tcG9uZW50KHBlbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly9jb2RlcGVuLmlvLyR7c2FmZVVzZXJ9L2VtYmVkLyR7c2FmZVBlbn0/aGVpZ2h0PTI2NSZ0aGVtZS1pZD1saWdodCZkZWZhdWx0LXRhYj1qcyxyZXN1bHRgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLm92ZXJmbG93ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LXNhbWUtb3JpZ2luJywpO1xyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICBFbWJlZFRvb2wuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcInktcmVzaXphYmxlXCJdLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBlbnRyeS5jb250ZW50UmVjdDtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGNvbnRhaW5lci5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwib3ZlcmZsb3ctaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUVtYmVkQ29udGFpbmVyKGNsYXNzZXM6IHN0cmluZ1tdID0gW10pOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZmlndXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlndXJlJyk7XHJcbiAgICAgICAgZmlndXJlLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGZpZ3VyZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbGl6ZUVtYmVkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGNvbnRlbnRFbGVtZW50Q2xhc3Nlczogc3RyaW5nW10gPSBbXSwgbGFzdEZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gbGFzdEZvY3VzZWRFbGVtZW50LmNsb3Nlc3QoYC4ke0NvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnR9YCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKC4uLmNvbnRlbnRFbGVtZW50Q2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldyYXBwZXIgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyLXdyYXBwZXJcIik7XHJcbiAgICAgICAgICAgIHRvb2xiYXJXcmFwcGVyPy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBkZXRlcm1pbmVFbWJlZFR5cGUodXJsOiBzdHJpbmcpOiBFbWJlZFR5cGVzIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybE9iai5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmxPYmoucGF0aG5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKC9eKD86LipcXC4pP3Nwb3RpZnlcXC5jb20kLy50ZXN0KGRvbWFpbikpIHtcclxuICAgICAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoXCIvdHJhY2tcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlUcmFjaztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9hcnRpc3RcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlBcnRpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9lcGlzb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5RXBpc29kZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3Nob3dcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlTaG93O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICgvXig/Oi4qXFwuKT8oeW91dHViZVxcLmNvbXx5b3V0dVxcLmJlKSQvLnRlc3QoZG9tYWluKSkge1xyXG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi93YXRjaFwiKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybE9iai5zZWFyY2hQYXJhbXMuaGFzKFwibGlzdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVQbGF5bGlzdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVWaWRlbztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Zb3VUdWJlUGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9zaG9ydHNcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVTaG9ydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcInZpbWVvLmNvbVwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlZpbWVvVmlkZW87XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiZG9jcy5nb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9zcHJlYWRzaGVldHNcIikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEVtYmVkVHlwZXMuR29vZ2xlU2hlZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwidHdpdHRlci5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Ud2VldDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9tYXBzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdvb2dsZU1hcDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnaXN0LmdpdGh1Yi5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5HaXRIdWJHaXN0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcImdpdGxhYi5jb21cIiAmJiBwYXRoLmluY2x1ZGVzKFwiL3NuaXBwZXRzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdpdExhYlNuaXBwZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiY29kZXBlbi5pb1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkNvZGVQZW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGVudW0gRW1iZWRUeXBlcyB7XHJcbiAgICBTcG90aWZ5VHJhY2sgPSBcInRyYWNrXCIsXHJcbiAgICBTcG90aWZ5UGxheWxpc3QgPSBcInBsYXlsaXN0XCIsXHJcbiAgICBTcG90aWZ5QXJ0aXN0ID0gXCJhcnRpc3RcIixcclxuICAgIFNwb3RpZnlFcGlzb2RlID0gXCJlcGlzb2RlXCIsXHJcbiAgICBTcG90aWZ5U2hvdyA9IFwic2hvd1wiLFxyXG4gICAgWW91VHViZVZpZGVvID0gXCJ2aWRlb1wiLFxyXG4gICAgWW91VHViZVBsYXlsaXN0ID0gXCJwbGF5bGlzdFwiLFxyXG4gICAgWW91VHViZVNob3J0ID0gXCJzaG9ydFwiLFxyXG4gICAgVmltZW9WaWRlbyA9IFwidmlkZW9cIixcclxuICAgIEdvb2dsZVNoZWV0ID0gXCJzaGVldFwiLFxyXG4gICAgVHdlZXQgPSBcInR3ZWV0XCIsXHJcbiAgICBHb29nbGVNYXAgPSBcIm1hcFwiLFxyXG4gICAgR2l0SHViR2lzdCA9IFwiZ2lzdFwiLFxyXG4gICAgR2l0TGFiU25pcHBldCA9IFwic25pcHBldFwiLFxyXG4gICAgQ29kZVBlbiA9IFwicGVuXCJcclxufSIsImV4cG9ydCBlbnVtIFRvb2xiYXJJRHMge1xyXG4gICAgVGFibGVUb29sYmFyID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiLFxyXG4gICAgVGV4dFRvb2xiYXIgPSBcInRleHRGbG9hdGluZ1Rvb2xiYXJcIlxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIHNwZWNpZnlpbmcgYm91bmRhcmllcyB3aXRoaW4gYW4gZWxlbWVudC5cclxuICogQGVudW0ge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBlbnVtIEJvdW5kYXJpZXMge1xyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGZpcnN0IGxpbmUgb2YgYW4gZWxlbWVudCwgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydGluZyBib3VuZGFyeS4gKi9cclxuICAgIEZpcnN0ID0gXCJGaXJzdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGxhc3QgbGluZSBvZiBhbiBlbGVtZW50LCBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZGluZyBib3VuZGFyeS4gKi9cclxuICAgIExhc3QgPSBcIkxhc3RcIlxyXG59IiwiaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBhZGRSb3codGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydFBvc2l0aW9uID0gKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPD0gdGFibGUucm93cy5sZW5ndGgpID8gcG9zaXRpb24gOiB0YWJsZS5yb3dzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuZXdSb3cgPSB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBudW1Db2x1bW5zID0gQXJyYXkuZnJvbSh0YWJsZS5yb3dzKS5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5jZWxscy5sZW5ndGgpLCAwKTtcclxuICAgICAgICBsZXQgYWZmZWN0ZWRDZWxscyA9IFtdOyAgLy8gQXJyYXkgdG8gaG9sZCByZWZlcmVuY2VzIHRvIG5ldyBjZWxsc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3Um93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiRW50ZXIgdGV4dFwiKTtcclxuICAgICAgICAgICAgLy8gY2VsbC5jbGFzc0xpc3QuYWRkKFwidGVtcG9yYXJ5LXNoYWRvd1wiKTtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5wdXNoKGNlbGwpOyAgLy8gQWRkIGNlbGwgcmVmZXJlbmNlIHRvIGFycmF5XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKFwidGVtcG9yYXJ5LXNoYWRvd1wiKSk7XHJcbiAgICAgICAgfSwgNzAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWRkQ29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnNlcnRQb3NpdGlvbiA9IHBvc2l0aW9uICE9PSBudWxsID8gcG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IGFmZmVjdGVkQ2VsbHMgPSBbXTsgIC8vIEFycmF5IHRvIGhvbGQgcmVmZXJlbmNlcyB0byBuZXcgY2VsbHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YWJsZS5yb3dzW2ldLmluc2VydENlbGwoaW5zZXJ0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xyXG4gICAgICAgICAgICAvLyBjZWxsLmNsYXNzTGlzdC5hZGQoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpO1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLnB1c2goY2VsbCk7ICAvLyBBZGQgY2VsbCByZWZlcmVuY2UgdG8gYXJyYXlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpKTtcclxuICAgICAgICB9LCA3MDApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNMYXN0Q29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGFibGUuY29udGFpbnMoY2VsbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxhc3RDZWxsSW5Sb3cgPSBjZWxsUm93LmNlbGxzW2NlbGxSb3cuY2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgcmV0dXJuIGNlbGwgPT09IGxhc3RDZWxsSW5Sb3c7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzTGFzdFJvdyh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRhYmxlLmNvbnRhaW5zKGNlbGwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxSb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCBsYXN0Um93SW5UYWJsZSA9IHRhYmxlLnJvd3NbdGFibGUucm93cy5sZW5ndGggLSAxXTtcclxuICAgICAgICByZXR1cm4gY2VsbFJvdyA9PT0gbGFzdFJvd0luVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuXHJcbiAgICAgICAgLy8gQWRkIGZhZGUtb3V0IGNsYXNzIHRvIGFsbCBjZWxscyBpbiB0aGUgY29sdW1uXHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0YWJsZS5yb3dzW2ldLmNlbGxzW2NvbHVtbkluZGV4XS5jbGFzc0xpc3QuYWRkKFwiZmFkZS1vdXRcIik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIERlbGF5IHRoZSBjb2x1bW4gcmVtb3ZhbCBmb3IgMzAwIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlLnJvd3NbaV0uZGVsZXRlQ2VsbChjb2x1bW5JbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNvbHVtbkluZGV4KTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0sIDkwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZVJvd0J5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIEFkZCBmYWRlLW91dCBjbGFzcyB0byBhbGwgY2VsbHMgaW4gdGhlIHJvd1xyXG4gICAgICAgIC8vIEFycmF5LmZyb20ocm93LmNlbGxzKS5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgICAgIC8vICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJmYWRlLW91dFwiKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gRGVsYXkgdGhlIHJvdyByZW1vdmFsIGZvciAzMDAgbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3cucm93SW5kZXgpO1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcbiAgICAgICAgLy8gfSwgOTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWN0aXZlVGFibGVDZWxsKCk6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudD8uY2xvc2VzdCgndGQnKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHRhcmdldEhleENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBjb25zdCBhY3RpdmVDZWxsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyAgICAgaWYgKCFhY3RpdmVDZWxsIHx8IGFjdGl2ZUNlbGwudGFnTmFtZSAhPT0gJ1REJyB8fCAhYWN0aXZlQ2VsbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYWN0aXZlQ2VsbCk7XHJcbiAgICAvLyAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGhleEJhY2tncm91bmRDb2xvci50b1VwcGVyQ2FzZSgpID09PSB0YXJnZXRIZXhDb2xvci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0TGFzdFRhYmxlQ2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucm93c1tpXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IHJvdy5jZWxscy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0Rmlyc3RUYWJsZUNlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5yb3dzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVpZ2hib3JDZWxsKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfCBudWxsIHtcclxuXHJcbiAgICAgICAgaWYgKCFjZWxsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3dJbmRleCA9IChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkucm93SW5kZXg7XHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkuY2VsbHNbY2VsbEluZGV4ICsgMV0gPz8gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93TGVmdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoY2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQpLmNlbGxzW2NlbGxJbmRleCAtIDFdID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1VwOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggLSAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbnMuQXJyb3dEb3duOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggKyAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjaGFuZ2VDZWxsQm9yZGVyQ29sb3IoXHJcbiAgICAgICAgdGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgc2NvcGU6IFRhYmxlU2NvcGVzLFxyXG4gICAgICAgIGNvbG9yOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICAgIGxldCBjZWxsc1RvQ2hhbmdlOiBOb2RlTGlzdE9mPEhUTUxUYWJsZUNlbGxFbGVtZW50PiB8IEhUTUxDb2xsZWN0aW9uT2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoc2NvcGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5Db2x1bW46XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9ICh0YWJsZS5xdWVyeVNlbGVjdG9yKFwidGQuc2VsZWN0ZWRcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpPy5jZWxsSW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKGB0ZDpudGgtY2hpbGQoJHtjb2x1bW5JbmRleCArIDF9KWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuUm93OlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRkLnNlbGVjdGVkXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGVjdGVkQ2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHJvdy5jZWxscztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFRhYmxlU2NvcGVzLkNlbGw6XHJcbiAgICAgICAgICAgICAgICBjZWxsc1RvQ2hhbmdlID0gdGFibGUucXVlcnlTZWxlY3RvckFsbChcInRkLnNlbGVjdGVkXCIpIGFzIE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuU2VsZWN0ZWRDZWxsczpcclxuICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQuc2VsZWN0ZWRcIikgYXMgTm9kZUxpc3RPZjxIVE1MVGFibGVDZWxsRWxlbWVudD47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2NvcGUuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNlbGxzVG9DaGFuZ2UpIHtcclxuXHJcblxyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbShjZWxsc1RvQ2hhbmdlKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJveFNoYWRvdyA9IGAwIDAgMCAxcHggJHtjb2xvcn0gaW5zZXRgO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJveFNoYWRvdyA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2hhZG93Jyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBib3JkZXIgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJiYmJcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlciA9IGJvcmRlcjtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm94U2hhZG93ID0gYm94U2hhZG93O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3ggU2hhZG93OicsIGJveFNoYWRvdyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQm9yZGVyOicsIGJvcmRlcik7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgbW92ZUZvY3VzVG9CZWxvd0NlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgbmV4dFJvdyA9IGNlbGwucGFyZW50RWxlbWVudD8ubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQgfCBudWxsO1xyXG4gICAgICAgIGlmICghbmV4dFJvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIGNlbGwgYmVsb3dcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IGNlbGwuY2VsbEluZGV4O1xyXG4gICAgICAgIGNvbnN0IGJlbG93Q2VsbCA9IG5leHRSb3cuY2VsbHNbY2VsbEluZGV4XTtcclxuICAgICAgICBpZiAoIWJlbG93Q2VsbCB8fCAhYmVsb3dDZWxsLmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gZWRpdGFibGUgY2VsbCBiZWxvd1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYmVsb3dDZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvSVF1aWNrTWVudVwiO1xyXG5pbXBvcnQgeyBJU2hvcnRjdXRMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBJVGFibGVMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL2xpc3RlbmVycy9JVGFibGVMaXN0ZW5lcnNcIjtcclxuaW1wb3J0IHsgSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL0lUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgS2V5Ym9hcmRLZXlzIH0gZnJvbSBcIkAvY29tbW9uL0tleWJvYXJkS2V5c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnQgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImNvbnRlbnRcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5pbmNsdWRlRmlyc3RQYXJhZ3JhcGggfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmQoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDbGVhcnMgdGV4dCBzZWxlY3Rpb24gd2hlbiBpbml0aWF0aW5nIGEgZHJhZyBmcm9tIGVsZW1lbnRzIHdpdGggdGhlIGAuZHJhZy1oYW5kbGVyYCBjbGFzcy5cclxuICAgICogVGhpcyBmdW5jdGlvbiBhdHRhY2hlcyBhIGBtb3VzZWRvd25gIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbnRpcmUgZG9jdW1lbnQuIFdoZW4gYSBtb3VzZWRvd25cclxuICAgICogZXZlbnQgb2NjdXJzIG9uIGFuIGVsZW1lbnQgdGhhdCBpcyBhIGNoaWxkIG9mIGEgYC5kcmFnLWhhbmRsZXJgIG9yIG9uIHRoZSBgLmRyYWctaGFuZGxlcmAgaXRzZWxmLFxyXG4gICAgKiBpdCBjaGVja3MgaWYgdGhlIHRhcmdldCBvciBpdHMgcGFyZW50IGlzIGEgZGVzaWduYXRlZCBkcmFnIGhhbmRsZXIuIElmIHRydWUsIGl0IGNsZWFycyBhbnkgY3VycmVudCB0ZXh0IHNlbGVjdGlvbnMuXHJcbiAgICAqIFRoaXMgcHJldmVudHMgdGV4dCBmcm9tIGJlaW5nIGFjY2lkZW50YWxseSBzZWxlY3RlZCBkdXJpbmcgZHJhZy1hbmQtZHJvcCBpbnRlcmFjdGlvbnMsIGVuaGFuY2luZyBVWCBpbiBkcmFnZ2FibGUgaW50ZXJmYWNlcy5cclxuICAgICogXHJcbiAgICAqIEBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbk9uRHJhZ1xyXG4gICAgKi9cclxuICAgIGNsZWFyU2VsZWN0aW9uT25EcmFnKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmNsb3Nlc3QoXCIuZHJhZy1oYW5kbGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbk9uRHJhZygpO1xyXG4gICAgICAgIHRoaXMucmVSZW5kZXJQbGFjZWhvbGRlcigpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gRXZlbnQgc2VsZWN0b3JcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIGNsYXNzZSAnYmxvY2stc2VsZWN0ZWQnIGRlIHF1YWxxdWVyIGJsb2NvIHByZXZpYW1lbnRlIHNlbGVjaW9uYWRvXHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcblxyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkLmZvckVhY2goc2VsZWN0ZWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7IC8vIFJlbW92ZSB0YWJpbmRleCBxdWFuZG8gbsOjbyBlc3TDoSBtYWlzIHNlbGVjaW9uYWRvXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2UgbyBlbGVtZW50byBjbGljYWRvIMOpIHVtIGZpbGhvIGRlIHVtICdzZXBhcmF0b3InXHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCBkbyB0YXJnZXQgcGFyYSBIVE1MRWxlbWVudFxyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoXCIuc2VwYXJhdG9yLXdyYXBwZXJcIikpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLnNlcGFyYXRvci13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgcGFyYSBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2suY2xhc3NMaXN0LmFkZCgnc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2suc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpOyAvLyBBZGljaW9uYSB0YWJpbmRleCBwYXJhIHBlcm1pdGlyIGZvY29cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLmZvY3VzKCk7IC8vIENvbG9jYSBvIGZvY28gbm8gYmxvY28gc2VsZWNpb25hZG9cclxuICAgICAgICAgICAgICAgICAgICB9LCA1MCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkJsdXIsIChldmVudDogRm9jdXNFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xvc2VzdCgnLnNlcGFyYXRvci1zZWxlY3RlZCcpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB0YXJnZXQuY2xvc2VzdCgnLnNlcGFyYXRvci1zZWxlY3RlZCcpITtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IuY2xhc3NMaXN0LnJlbW92ZSgnc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpOyAvLyBMaW1wYSBvIGF0cmlidXRvIHBhcmEgbsOjbyBpbnRlcmZlcmlyIGNvbSBhIG5hdmVnYcOnw6NvIG5vcm1hbFxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlYXBsaWNhciBhdHJpYnV0b3MgcXVlIGdhcmFudGVtIG8gZm9jb1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgc2VwYXJhdG9yLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcclxuICAgICAgICAgICAgICAgIC8vIH0sIDUwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRydWUpO1xyXG4gICAgICAgIC8vZW5kIGV2ZW50IHNlbGVjdG9yXHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29waWVkVGV4dFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvcHlFbGVtZW50SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY29weU9wdGlvbiAudGV4dC1vcHRpb24gc3BhblwiKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChjb3B5RWxlbWVudEl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcGllZCFcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcHlcIjtcclxuICAgICAgICAgICAgICAgIH0sIDE1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vRm9jdXMgb24gUCB3aGVuIGxvYWRcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5ET01Db250ZW50TG9hZGVkLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1lZGl0b3InKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIGxldCBibG9ja3MgPSBlZGl0b3IucXVlcnlTZWxlY3RvckFsbCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gYmxvY2tzWzBdLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocC5pbm5lclRleHQgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50LXdyYXBwZXIgLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLnByZXNzZWRFbnRlck9uVGl0bGUsIHt9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgYXN5bmMgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoRE9NVXRpbHMuaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZihldmVudCwgXCIuaWdub3JlLWV2ZW50c1wiKSAmJiBldmVudC5rZXkgIT09ICdUYWInKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9vbGJhciA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyPihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5FbnRlciAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIXF1aWNrTWVudS5pc1Zpc2libGUgJiYgIXRhYmxlVG9vbGJhci5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZihET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5qb2hhbm5lcy1jb2RlXCIpKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoXCIudGFibGUtY29udHJvbGxlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5jbG9zZXN0KFwidGQsIHRoXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVDb250cm9sbGVyLnF1ZXJ5U2VsZWN0b3IoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkQmVsb3cgPSBUYWJsZVV0aWxzLm1vdmVGb2N1c1RvQmVsb3dDZWxsKHRhYmxlLCBhY3RpdmVDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2N1c2VkQmVsb3cpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZm9jdXNPbk5leHRCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCkuY2xvc2VzdChcIi5qb2hhbm5lcy1jb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgYmxvY2sgd2hlbiBwcmVzcyBFbnRlclxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnROZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5CYWNrc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2VwYXJhdG9yLXdyYXBwZXInKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0U3RhcnQgJiYgc2VsZWN0ZWRDb250ZW50Py5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLm1lcmdlV2l0aFByZXZpb3VzQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZXBhcmF0b3Itd3JhcHBlcicpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uTmV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0RW5kICYmIHNlbGVjdGVkQ29udGVudD8ubGVuZ3RoID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5tZXJnZVdpdGhOZXh0QmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgJiYgQ29udGVudC5pc0N1cnNvckF0RW5kKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgQ29udGVudC5pc0N1cnNvckF0U3RhcnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgQ29udGVudC5pc0N1cnNvck9uTGFzdExpbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgQ29udGVudC5pc0N1cnNvck9uRmlyc3RMaW5lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fUFJFVklPVVMsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiLmpvaGFubmVzLWNvZGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYkNoYXJhY3RlciA9ICdcXHUwMGEwXFx1MDBhMFxcdTAwYTBcXHUwMGEwJzsgIC8vIFJlcHJlc2VudGEgNCBlc3Bhw6dvcyAob3Ugdm9jw6ogcG9kZSB1c2FyIHVtIHZlcmRhZGVpcm8gY2FyYWN0ZXJlIGRlIHRhYnVsYcOnw6NvICdcXHQnIHNlIHByZWZlcmlyKVxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0JywgZmFsc2UsIHRhYkNoYXJhY3Rlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkJsdXIsIChldmVudDogRXZlbnQpID0+IHRoaXMuc2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyKGV2ZW50KSwgdHJ1ZSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gVmVyaWZpY2Egc2UgbyBlbGVtZW50byBhbHZvIMOpIGNvbnRlbnRlZGl0YWJsZVxyXG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY29udGVudEVkaXRhYmxlID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImxpcG91XCIpO1xyXG4gICAgICAgICAgICBET01VdGlscy5zYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZSh0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZHMgYW4gaW5wdXQgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVudGlyZSBkb2N1bWVudCB0byBoYW5kbGUgcGxhY2Vob2xkZXIgYmVoYXZpb3IgZm9yIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50cy5cclxuICAgICogVGhpcyB3b3JrYXJvdW5kIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBhZGRyZXNzIGEga25vd24gaXNzdWUgaW4gRmlyZWZveCB3aGVyZSBjb250ZW50RWRpdGFibGUgZWxlbWVudHNcclxuICAgICogZG8gbm90IHByb3Blcmx5IHJlc2V0IHRoZWlyIHBsYWNlaG9sZGVycyBhZnRlciB0aGUgY29udGVudCBpcyBkZWxldGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgKiBcclxuICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGNoZWNrcyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBpbnB1dCBldmVudCBpcyBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50IGFuZCB3aGV0aGVyIGl0IGhhcyBhXHJcbiAgICAqIGN1c3RvbSAnZGF0YS1wbGFjZWhvbGRlcicgYXR0cmlidXRlLiBJZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgZW1wdHkgKGlnbm9yaW5nIHdoaXRlIHNwYWNlcyksIHRoZSBmdW5jdGlvblxyXG4gICAgKiByZXNldHMgdGhlICdkYXRhLXBsYWNlaG9sZGVyJyB0byBlbnN1cmUgaXQgZGlzcGxheXMgY29ycmVjdGx5LCBhbmQgY2xlYXJzIGFueSByZXNpZHVhbCB0ZXh0IGNvbnRlbnQgdGhhdCBtaWdodFxyXG4gICAgKiBpbnRlcmZlcmUgd2l0aCB0aGUgcGxhY2Vob2xkZXIgZGlzcGxheS5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIHV0aWxpemUgdGhpcyB3b3JrYXJvdW5kLCBlbnN1cmUgeW91ciBjb250ZW50RWRpdGFibGUgZWxlbWVudHMgaGF2ZSBhICdkYXRhLXBsYWNlaG9sZGVyJyBhdHRyaWJ1dGUuXHJcbiAgICAqIC8vIDxkaXYgY29udGVudEVkaXRhYmxlPVwidHJ1ZVwiIGRhdGEtcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0IGhlcmUuLi5cIj48L2Rpdj5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGlucHV0IGV2ZW50IHRyaWdnZXJlZCBieSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIGRvY3VtZW50J3MgaW5wdXQtY2FwYWJsZSBlbGVtZW50cy5cclxuICAgICovXHJcbiAgICByZVJlbmRlclBsYWNlaG9sZGVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLklucHV0LCBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVBsYWNlaG9sZGVyID0gZWRpdGFibGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGN1c3RvbVBsYWNlaG9sZGVyIHx8ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRFbmQodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IHRhcmdldC5jbG9zZXN0KCcuZm9jdXNhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb2N1c2FibGVQYXJlbnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIGVuZE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5lbmRPZmZzZXQgPT09IChyYW5nZS5lbmRDb250YWluZXIudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JBdFN0YXJ0KHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIHN0YXJ0Tm9kZSA9PT0gZm9jdXNhYmxlUGFyZW50ICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0Rmlyc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGVsZW1lbnQsIDApO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlVG9wID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlVG9wID09PSBlbGVtZW50VG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0TGFzdFZpc2libGVMaW5lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgIHJhbmdlLnNldEVuZChlbGVtZW50LCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCByYW5nZUJvdHRvbSA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgICAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZUJvdHRvbSA9PT0gZWxlbWVudEJvdHRvbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGRpZEN1cnNvck1vdmUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdCA9IG9yaWdpbmFsUmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSBuZXdSYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRNb3ZlID0gIShvcmlnaW5hbFJlY3QudG9wID09PSBuZXdSZWN0LnRvcCAmJiBvcmlnaW5hbFJlY3QubGVmdCA9PT0gbmV3UmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgICAgIGlmICghZGlkTW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRpZE1vdmUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbnRlbnQge1xyXG5cclxuICAgICAgICBjb25zdCBzaG9ydGN1dExpc3RlbmVyID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElTaG9ydGN1dExpc3RlbmVycz4oXCJJU2hvcnRjdXRMaXN0ZW5lcnNcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVMaXN0ZW5lcnMgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlTGlzdGVuZXJzPihcIklUYWJsZUxpc3RlbmVyc1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnRCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBDb250ZW50IHtcclxuICAgICAgICByZXR1cm4gQ29udGVudC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9JVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9jb21tb24vRGlyZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCIuLi8uLi9jb21tb24vRE9NRWxlbWVudHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlcyB9IGZyb20gXCIuL1NlbGVjdGlvbk1vZGVcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBGbG9hdGluZ1Rvb2xiYXIgaW1wbGVtZW50cyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuICAgIHNlbGVjdGVkQ2VsbHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10gPSBbXTtcclxuICAgIGFjdHVhbEZvY3VzZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xyXG5cclxuXHJcbiAgICAvLyBUaGUgc2VsZWN0aW9uIG1vZGUgYW5kIHNlbGVjdGlvbkFjdGl2ZUZsYWcgd29yayB0b2dldGhlciB3aGVuIHdlIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluc2lkZSBhIGNlbGwgb3IgcHJlc3Mgc2hpZnQgdG8gYWN0aXZhdGUgdGhlIHNlbGVjdGlvbkFjdGl2ZUZsYWcuXHJcbiAgICAvLyBBZnRlciBhY3RpdmF0aW5nIHRoZSBmbGFnLCB3ZSBjYW4gc2VsZWN0IHRleHQgaW5zaWRlIGEgY2VsbC4gSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgdGV4dCBpbnNpZGUgdGhlIGNlbGwgdXNpbmcgc2hpZnQgKyBkaXJlY3Rpb25hbCBrZXlzIG9yIHBsYWNlIHRoZSBjdXJzb3Igb3V0c2lkZVxyXG4gICAgLy8gdGhlIGFjdGl2ZSBjZWxsLCBpdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGVudGVyIGNlbGwgc2VsZWN0aW9uIG1vZGUuIFdlIGNoYW5nZSB0aGUgc2VsZWN0aW9uIG1vZGUgaW4gdGhlc2UgY2FzZXMuXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlcyA9IFNlbGVjdGlvbk1vZGVzLlRleHQ7IC8vIFRoZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlXHJcbiAgICBzZWxlY3Rpb25GbGFnOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgdG8gdHJhY2sgd2hldGhlciB0ZXh0IHNlbGVjdGlvbiBpcyBhY3RpdmVcclxuICAgIHNlbGVjdGVkVGV4dDogc3RyaW5nID0gXCJcIjsgLy8gU3RvcmFnZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaywgdGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUgPSB0aGlzLmNsZWFyQW5kSGlkZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4Lk1vZGVyYXRlbHlJbXBvcnRhbnQ7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCB0aGlzLmhhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIHRoaXMuaGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVTdGFydFNlbGVjdGlvbkluQ2VsbEtleURvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXl1cCwgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hVSUV2ZW50KCk7XHJcblxyXG4gICAgICAgIHN1cGVyLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2VsbCAmJiAhY2VsbC5tYXRjaGVzKCcuZmlndXJlLWVtYmVkLWNvbnRhaW5lciB0ZCcpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTW91c2VEb3duIGV2ZW50IG9uOiBcIiwgZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCAhPSB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjZWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25GbGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlQnlNb3VzZUV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gU2VsZWN0aW9uTW9kZXMuQ2VsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENlbGwoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblN0YXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudENlbGwgJiYgIWN1cnJlbnRDZWxsLm1hdGNoZXMoJy5naXN0IHRkJykpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vIGFsZXJ0KFwianVtcCB0byBuZXh0IGxpbmVcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUgJiYgdGhpcy5jYW5IaWRlICYmICFUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDZWxsICYmICFjdXJyZW50Q2VsbC5tYXRjaGVzKCcuZ2lzdCB0ZCcpKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQucmVwZWF0ICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLlNoaWZ0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGN1cnJlbnRDZWxsKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsICYmICFjdXJyZW50Q2VsbC5tYXRjaGVzKCcuZ2lzdCB0ZCcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IFNlbGVjdGlvbk1vZGVzLkNlbGwgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5LnN0YXJ0c1dpdGgoJ0Fycm93JykgJiYgIWV2ZW50LnJlcGVhdCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGN1cnJlbnRDZWxsLmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpITtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2VsbCA9IFRhYmxlVXRpbHMuZ2V0TmVpZ2hib3JDZWxsKHRhYmxlLCBjdXJyZW50Q2VsbCwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjdXJyZW50Q2VsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChuZXh0Q2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHRcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxyXG4gICAgICAgICAgICAudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gbW9kZSBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gZnJvbSB0aGUgZG9jdW1lbnRcclxuICAgICogd2l0aCB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQuIElmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHN0b3JlZFxyXG4gICAgKiBzZWxlY3Rpb24sIGl0IHN3aXRjaGVzIHRoZSBzZWxlY3Rpb24gbW9kZSB0byBjZWxsIHNlbGVjdGlvbiBhbmQgcmVzZXRzIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKiBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24gKGFjdHVhbFNlbGVjdGlvbiBpcyBub3QgZW1wdHkpLCBpdCB1cGRhdGVzIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dFxyXG4gICAgKiB0byByZWZsZWN0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cclxuICAgICpcclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoY3VycmVudENlbGwubWF0Y2hlcygnLmdpc3QgdGQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsVGV4dCA9IHRoaXMubm9ybWFsaXplVGV4dCgoY3VycmVudENlbGwudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGF0U3RhcnQsIGF0RW5kIH0gPSBET01VdGlscy5nZXRTZWxlY3Rpb25UZXh0SW5mbyhjdXJyZW50Q2VsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpbnRlcmFjdGlvbiBrZWVwcyB0aGUgbWVudSB2aXNpYmxlIGFmdGVyIGFsbCB0ZXh0IGlzIHNlbGVjdGVkLCBlbmhhbmNpbmcgdXNlciBlbmdhZ2VtZW50LiBcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHByZXNzZXMgYSBkaXJlY3Rpb25hbCBrZXkgYWdhaW4gYmV5b25kIHRoaXMgcG9pbnQsIHRoZSBtZW51IGlzIGhpZGRlbiBhbmQgY2VsbCBzZWxlY3Rpb24gbW9kZSBpcyBpbml0aWF0ZWQsIFxyXG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtbGluaW5nIHRoZSBpbnRlcmZhY2UgYW5kIGZvY3VzaW5nIG9uIHN1YnNlcXVlbnQgdGFza3MuXHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENlbGxUZXh0ID09PSBcIlwiIHx8IChhY3R1YWxTZWxlY3Rpb24gPT09IHRoaXMuc2VsZWN0ZWRUZXh0LnRyaW0oKSAmJiAoYXRTdGFydCB8fCBhdEVuZCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuQ2VsbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gYWN0dWFsU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgdXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBmbGFnIGlzIHNldCwgaW5kaWNhdGluZyB0aGF0IHNlbGVjdGlvbiB1cGRhdGVzIHNob3VsZCBiZSBtb25pdG9yZWRcclxuICAgIC8vICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24gZnJvbSB0aGUgZG9jdW1lbnRcclxuICAgIC8vICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVUZXh0KGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy50b1N0cmluZygpLnRyaW0oKSB8fCBcIlwiKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRleHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQoKGN1cnJlbnRDZWxsLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKSk7XHJcblxyXG4gICAgLy8gICAgICAgICBsZXQgaXNUaGVFbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24/LmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHNlbGVjdGlvblJhbmdlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnRPZmZzZXQgPSBzZWxlY3Rpb25SYW5nZS5zdGFydE9mZnNldDtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmRPZmZzZXQgPSBzZWxlY3Rpb25SYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFRleHRMZW5ndGggPSBjdXJyZW50Q2VsbFRleHQubGVuZ3RoO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93UmlnaHQgfHwgZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93RG93bikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciB0aGUgY2FyZXQgYmVpbmcgYXQgdGhlIGVuZCBvZiB0aGUgY2VsbCB0ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzVGhlRW5kID0gc2VsZWN0aW9uRW5kT2Zmc2V0ID49IGNlbGxUZXh0TGVuZ3RoO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93TGVmdCB8fCBldmVudC5rZXkgPT09IERpcmVjdGlvbnMuQXJyb3dVcCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciB0aGUgY2FyZXQgYmVpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjZWxsIHRleHRcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaXNUaGVFbmQgPSBzZWxlY3Rpb25TdGFydE9mZnNldCA9PT0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtYXRjaGVzIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dFxyXG4gICAgLy8gICAgICAgICBpZiAoY3VycmVudENlbGxUZXh0ID09PSBcIlwiIHx8IChhY3R1YWxTZWxlY3Rpb24gPT09IHRoaXMuc2VsZWN0ZWRUZXh0LnRyaW0oKSAmJiBpc1RoZUVuZCkpIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vIElmIHRoZXkgYXJlIHRoZSBzYW1lLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZWN0aW9uIGhhc24ndCBjaGFuZ2VkLFxyXG4gICAgLy8gICAgICAgICAgICAgLy8gc28gc3dpdGNoIHRvIGNlbGwgc2VsZWN0aW9uIG1vZGUgYW5kIHJlc2V0IHRoZSBzdG9yZWQgdGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuQ2VsbDtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJcIjtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV3IHNlbGVjdGlvbiwgdXBkYXRlIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dCB0byB0aGUgbmV3IHZhbHVlXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGFjdHVhbFNlbGVjdGlvbjtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIG1vZGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGFjdHVhbCBmb2N1c2VkIGNlbGwuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBtb3VzZSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGZvY3VzZWQgY2VsbCwgYW5kIGlmIHNvLCBzd2l0Y2hlcyB0aGVcclxuICAgICogc2VsZWN0aW9uIG1vZGUgdG8gY2VsbCBzZWxlY3Rpb24gbW9kZS5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQgLSBUaGUgbW91c2UgZXZlbnQgdGhhdCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLCB0eXBpY2FsbHkgaW52b2x2aW5nIG1vdXNlIG1vdmVtZW50LlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlU2VsZWN0aW9uTW9kZUJ5TW91c2VFdmVudChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnICYmIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxSZWN0ID0gdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlWCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlWSA9IGV2ZW50LmNsaWVudFk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIShtb3VzZVggPj0gY2VsbFJlY3QubGVmdCAmJiBtb3VzZVggPD0gY2VsbFJlY3QucmlnaHQgJiYgbW91c2VZID49IGNlbGxSZWN0LnRvcCAmJiBtb3VzZVkgPD0gY2VsbFJlY3QuYm90dG9tKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuQ2VsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlKGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5TaGlmdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblN0YXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTZWxlY3RlZENlbGwoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENlbGxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMucHVzaChjZWxsKTtcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuICAgICAgICAgICAgLy9DaGFuZ2UgdGhlIGFjdHVhbCBmb2N1c2VkIGNlbGwgb25seSBpZiBhdCBzYW1lIHRhYmxlXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICBjZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0U2VsZWN0ZWRDZWxsID0gdGhpcy5zZWxlY3RlZENlbGxzW3RoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkQ2VsbFRhYmxlID0gbGFzdFNlbGVjdGVkQ2VsbC5jbG9zZXN0KCd0YWJsZScpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRhYmxlID0gY2VsbC5jbG9zZXN0KCd0YWJsZScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxhc3RTZWxlY3RlZENlbGxUYWJsZSA9PT0gY3VycmVudENlbGxUYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkQ2VsbHMuaW5kZXhPZihjZWxsKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMucHVzaChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vQ2hhbmdlIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsIG9ubHkgaWYgYXQgc2FtZSB0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9DZWx1bGEgasOhIGZheiBwYXJ0ZSBkYSBsaXN0YSBhcGVuYXMgZm9jYSBlIGNvbnRpbnVhXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCA9IGNlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXR0YWNoVUlFdmVudCgpIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwgdGhpcy5oYW5kbGVDbG9zZUVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDbG9zZUVsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCA9PSBkZXRhaWxzLnRhcmdldElkISkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQW5kSGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuYWN0dWFsRm9jdXNlZENlbGwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gZm9jdXNlZCBjZWxsIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCh0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKTtcclxuICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyh0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCk7XHJcblxyXG4gICAgICAgIHN1cGVyLnNob3coKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CbHVyLCB0aGlzLmNsZWFyQW5kSGlkZSwgeyBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyBleGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAvLyAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xyXG5cclxuICAgIC8vICAgICBpZiAoYWN0aXZlQ2VsbCkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCB0YWJsZSA9IGFjdGl2ZUNlbGwuY2xvc2VzdCgndGFibGUnKSE7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAvLyAgICAgICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XHJcblxyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMoKSB7XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvclJlZF0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yUmVkKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmVlbl0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JlZW4pO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvckJsdWVdID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvckJsdWUpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvclllbGxvd10gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yWWVsbG93KTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmV5XSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYmFja2dyb3VuZENvbG9ycykuZm9yRWFjaCgoW2NvbG9yLCBhY3RpdmVdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgY29sb3IsIFwic2hvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyByZXNldENoZWNrZWRDb2xvcigpIHtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgZHJvcGRvd25Db2xvciA9IHRoaXMuZHJvcGRvd25zLmZpbmQoZSA9PiBlLmlkID09IFwidGFibGVDb2xvck9wdGlvbnNNZW51XCIpITtcclxuXHJcbiAgICAvLyAgICAgZHJvcGRvd25Db2xvci5kcm9wZG93bkxpc3QuZHJvcGRvd25JdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgaXRlbS5yZXNldEFjdGl2ZUljb24oKTtcclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgZHJvcGRvd25Db2xvci5kcm9wZG93bkxpc3QuZHJvcGRvd25JdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgY29sb3IgPSBpdGVtLmdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoY29sb3IgJiYgdGhpcy5hcmVBbGxTZWxlY3RlZENlbGxzU2FtZUJnQ29sb3IoY29sb3IpICYmIGNvbG9yICE9IFwidHJhbnNwYXJlbnRcIikge1xyXG4gICAgLy8gICAgICAgICAgICAgaXRlbS5jaGFuZ2VBY3RpdmVJY29uVG9WaXNpYmxlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBjaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCArIDA7XHJcblxyXG4gICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0U2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgYWxsVGFibGVDZWxscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XHJcbiAgICAgICAgYWxsVGFibGVDZWxscy5mb3JFYWNoKGNlbGwgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckFuZEhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRBYm9ydENvbnRyb2xsZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcclxuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIoZm9jdXNTdGFjaywgdGFibGVPcGVyYXRpb25zU2VydmljZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgQ29sb3JJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW0gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZVwiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgeyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBJVGFibGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiQC9jb21tb24vSWNvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVPcGVyYXRpb25TZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlPihcIklUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG5cclxuICAgICAgICBjb25zdCB0YWJsZVRvb2xiYXIgPSBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgdGFibGVUb29sYmFyLmFwcGVuZERyb3Bkb3duKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIudGFibGVPcHRpb25zKHRhYmxlT3BlcmF0aW9uU2VydmljZSkpO1xyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoXCJ0YWJsZU9wZXJhdGlvbnNTZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmREcm9wZG93bihUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRhYmxlQ29sb3JEcm9wZG93bigpKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiB0YWJsZVRvb2xiYXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHRhYmxlT3B0aW9ucyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyTGlzdCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KFwidGFibGVPcHRpb25zU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcInRhYmxlT3B0aW9uc1wiLCBcIk9wdGlvbnNcIiwgdHVybkludG9CYXJMaXN0KTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInRhYmxlT3B0aW9uc01lbnVcIiwgdHVybkludG9CYXJCdXR0b24sIHR1cm5JbnRvQmFyTGlzdCk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUodHVybkludG9CYXJMaXN0LCBcIkluc2VydCBDb2x1bW5cIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5Db2x1bW5MZWZ0LCBTaXplcy5tZWRpdW0pLmh0bWxFbGVtZW50LCBcIkxlZnRcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25UZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5Db2x1bW5SaWdodCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJSaWdodFwiKSk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUodHVybkludG9CYXJMaXN0LCBcIkluc2VydCBSb3dcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlUm93QWJvdmUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1QsIFNWR0ljb24uY3JlYXRlKEljb25zLlJvd0Fib3ZlLCBTaXplcy5tZWRpdW0pLmh0bWxFbGVtZW50LCBcIkFib3ZlXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0JlbG93LCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5Sb3dCZWxvdywgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJCZWxvd1wiKSk7XHJcblxyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJSZW1vdmVcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVDb2x1bW5JdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25UZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMucmVtb3ZlQ29sdW1uLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFNWR0ljb24uY3JlYXRlKEljb25zLmRlbGV0ZVN3ZWVwLCBTaXplcy5tZWRpdW0pLmh0bWxFbGVtZW50LCBcIkNvbHVtblwiKTtcclxuICAgICAgICBkZWxldGVDb2x1bW5JdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuICAgICAgICAvLyBkZWxldGVDb2x1bW5JdGVtLmF0dGFjaE9uRm9jdXModGFibGVPcGVyYXRpb25zU2VydmljZS5lbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50LCBUYWJsZVNjb3Blcy5Db2x1bW4sIENvbG9ycy5Ub21hdG8pO1xyXG4gICAgICAgIC8vIGRlbGV0ZUNvbHVtbkl0ZW0uYXR0YWNoT25Mb3NlRm9jdXModGFibGVPcGVyYXRpb25zU2VydmljZS5lbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50LCBUYWJsZVNjb3Blcy5Db2x1bW4sIENvbG9ycy5PcmlnaW5hbFRhYmxlQ29sb3IpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKGRlbGV0ZUNvbHVtbkl0ZW0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZVJvd0l0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMucmVtb3ZlUm93LCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5kZWxldGVTd2VlcCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJSb3dcIik7XHJcbiAgICAgICAgZGVsZXRlUm93SXRlbS5hZGRDc3NDbGFzcyhcImRhbmdlci1vcHRpb25cIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZGVsZXRlUm93SXRlbS5hdHRhY2hPbkZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuUm93LCBDb2xvcnMuVG9tYXRvKTtcclxuICAgICAgICAvLyBkZWxldGVSb3dJdGVtLmF0dGFjaE9uTG9zZUZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuUm93LCBDb2xvcnMuT3JpZ2luYWxUYWJsZUNvbG9yKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChkZWxldGVSb3dJdGVtKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiB0dXJuSW50b0Ryb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0YWJsZUNvbG9yRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcImNvbG9yVGFibGVPcHRpb25TZWxlY3RcIik7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JUYWJsZUJ1dHRvblwiLCBuZXcgQ29sb3JJY29uKFwiI0ZBRjREMVwiKS5odG1sRWxlbWVudCwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwidGFibGVDb2xvck9wdGlvbnNNZW51XCIsIGNvbG9yQnV0dG9uLCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJCYWNrZ3JvdW5kXCIpKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JSZWQgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclJlZCwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yUmVkLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbiwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbikuaHRtbEVsZW1lbnQsIFwiR3JlZW5cIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvckdyZWVuLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkJsdWVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JZZWxsb3cgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclllbGxvdywgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yWWVsbG93LmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KS5odG1sRWxlbWVudCwgXCJHcmV5XCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5LmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbk5vbmVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclJlZCk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbik7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VwYXJhdG9yKGlkOiBzdHJpbmcpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKGlkKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcbmltcG9ydCB7IEVtYmVkVG9vbCwgRW1iZWRUeXBlcyB9IGZyb20gXCJAL2NvcmUvRW1iZWRUb29sXCI7XHJcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xyXG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVkaWFJbnB1dHRlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlkID0gXCJtZWRpYUlucHV0dGVyXCI7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGFpbmVyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguRXh0cmVtZWx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInVsXCIpO1xyXG4gICAgICAgIGhlYWQuY2xhc3NMaXN0LmFkZChcIm5hdlwiLCBcIm5hdi11bmRlcmxpbmVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwbG9hZFRhYiA9IHRoaXMuY3JlYXRlTmF2SXRlbShcInVwbG9hZFRhYlwiLCBcIlVwbG9hZFwiLCB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3QgZW1iZWRUYWIgPSB0aGlzLmNyZWF0ZU5hdkl0ZW0oXCJlbWJlZFRhYlwiLCBcIkVtYmVkXCIpO1xyXG5cclxuICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHVwbG9hZFRhYik7XHJcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbWJlZFRhYik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcInRhYi1jb250ZW50XCIpO1xyXG5cclxuICAgICAgICBjb25zdCB1cGxvYWRDb250ZW50ID0gdGhpcy5jcmVhdGVVcGxvYWRDb250ZW50KCk7XHJcbiAgICAgICAgY29uc3QgZW1iZWRDb250ZW50ID0gdGhpcy5jcmVhdGVFbWJlZENvbnRlbnQoKTtcclxuXHJcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh1cGxvYWRDb250ZW50KTtcclxuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVtYmVkQ29udGVudCk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGhlYWQpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlTmF2SXRlbShpZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIGFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xyXG4gICAgICAgIGxpLmNsYXNzTGlzdC5hZGQoXCJuYXYtaXRlbVwiKTtcclxuICAgICAgICBsaS5pZCA9IGlkO1xyXG5cclxuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgYS5jbGFzc0xpc3QuYWRkKFwibmF2LWxpbmtcIik7XHJcbiAgICAgICAgYS5pbm5lclRleHQgPSB0ZXh0O1xyXG4gICAgICAgIGxpLmFwcGVuZENoaWxkKGEpO1xyXG5cclxuICAgICAgICByZXR1cm4gbGk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVXBsb2FkQ29udGVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuaWQgPSBcInVwbG9hZENvbnRlbnRcIjtcclxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcInVwbG9hZC1jb250ZW50XCIsIFwiY29udGVudC1kYXRhXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcclxuICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XHJcbiAgICAgICAgbGFiZWwuaW5uZXJUZXh0ID0gXCJVcGxvYWQgZmlsZVwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0SW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGV4dEluZm8uY2xhc3NMaXN0LmFkZChcInRleHQtaW5mb1wiKTtcclxuICAgICAgICB0ZXh0SW5mby5pbm5lclRleHQgPSBcIk1heGltdW0gZmlsZSBzaXplOiA1TUJcIjtcclxuXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dEluZm8pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGl2O1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVtYmVkQ29udGVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuaWQgPSBcImVtYmVkQ29udGVudFwiO1xyXG4gICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwiY29udGVudC1kYXRhXCIsIFwiZW1iZWQtY29udGVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwidGV4dFwiO1xyXG5cclxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XHJcbiAgICAgICAgYnV0dG9uLmlubmVyVGV4dCA9IFwiRW1iZWRcIjtcclxuXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuXHJcbiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoKSA9PiB0aGlzLmVtYmVkR2VuZXJpYyhpbnB1dCkpO1xyXG5cclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRHZW5lcmljKGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Gb2N1c2luLCAoKSA9PiB0aGlzLnJlc2V0SW5wdXRCZ0NvbG9yKGlucHV0KSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRJbnB1dEJnQ29sb3IoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVtYmVkR2VuZXJpYyhpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgICAgICBjb25zdCBzdHJpbmdVUkwgPSBpbnB1dC52YWx1ZTtcclxuICAgICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBmb2N1c2VkRWxlbWVudD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKT8uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoc3RyaW5nVVJMKTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFVdGlscy5pc1ZhbGlkVXJsKHVybC50b1N0cmluZygpKSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFVSTFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFmb2N1c2VkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5vdCBlbGVtZW50IGZvdW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBFbWJlZFRvb2wuZW1iZWRJbWFnZShzdHJpbmdVUkwsIGZvY3VzZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuSWZyYW1lKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW1iZWRUeXBlID0gRW1iZWRUb29sLmRldGVybWluZUVtYmVkVHlwZShzdHJpbmdVUkwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZW1iZWRUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlVmlkZW86XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFlvdVR1YmVWaWRlb0FzSWZyYW1lKHVybCwgZm9jdXNlZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLllvdVR1YmVQbGF5bGlzdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRUb29sLmVtYmVkWW91VHViZVBsYXlsaXN0QXNJZnJhbWUodXJsLCBmb2N1c2VkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuWW91VHViZVNob3J0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5VHJhY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVBsYXlsaXN0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlBcnRpc3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUVwaXNvZGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVNob3c6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVBsYXlsaXN0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLkdpdEh1Ykdpc3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZEdpc3RBc1NjcmlwdCh1cmwsIGZvY3VzZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Db2RlUGVuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRDb2RlcGVuQXNJZnJhbWUodXJsLCBmb2N1c2VkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZENvbnRlbnQgaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGlucHV0KSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYigyNTMsIDIyMiwgMjIyKVwiO1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNoYWtlLWFuaW1hdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QucmVtb3ZlKFwic2hha2UtYW5pbWF0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHNldCBpbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBpbnB1dFRleHQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKTtcclxuICAgICAgICBpZiAoaW5wdXRUZXh0KSB7XHJcbiAgICAgICAgICAgIGlucHV0VGV4dC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcImZsZXhcIjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkVGFiXCIpO1xyXG4gICAgICAgIHVwbG9hZFRhYj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoJ3VwbG9hZFRhYicsICd1cGxvYWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpO1xyXG4gICAgICAgIGVtYmVkVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYignZW1iZWRUYWInLCAnZW1iZWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlcktleWRvd25FdmVudHMuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaGFuZGxlckNsaWNrRXZlbnRzLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBzdXBlci5hdHRhY2hVSUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlcktleWRvd25FdmVudHMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlckNsaWNrRXZlbnRzKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gY29uc3QgZW1iZWRJbWFnZSA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkKGV2ZW50LCBcImVtYmVkSW1hZ2VcIik7XHJcbiAgICAgICAgLy8gaWYgKGVtYmVkSW1hZ2UpIHtcclxuICAgICAgICAvLyAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5lbWJlZEltYWdlKGVsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB0aGlzLmhpZGVNZWRpYUlucHV0dGVyT25FeHRlcm5hbENsaWNrKGV2ZW50KVxyXG4gICAgICAgIHRoaXMuc2hvd01lZGlhSW5wdXR0ZXJPbk1lZGlhSW5wdXR0ZXJFbGVtZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoaWRlTWVkaWFJbnB1dHRlck9uRXh0ZXJuYWxDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG1lZGlhSW5wdXR0ZXIgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudCwgdGhpcy5pZCk7XHJcbiAgICAgICAgY29uc3QgY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRPbkNsaWNrKTtcclxuICAgICAgICBpZiAoIW1lZGlhSW5wdXR0ZXIgJiYgIWNsaWNrZWRPbkVsZW1lbnRXaXRoU2hvd01lZGlhSW5wdXRDbGFzcyAmJiB0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd01lZGlhSW5wdXR0ZXJPbk1lZGlhSW5wdXR0ZXJFbGVtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRPbkNsaWNrKTtcclxuICAgICAgICBpZiAoY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2goY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmluZENsYXNzV2l0aFN1ZmZpeChlbGVtZW50OiBFbGVtZW50LCBzdWZmaXg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgLioke3N1ZmZpeH0kYCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNsYXNzTmFtZSBvZiBlbGVtZW50LmNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0VGFiKHRhYklkOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRlbnRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QWN0aXZlVGFiKHRhYklkOiBzdHJpbmcsIGNvbnRlbnRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hdi1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29udGVudC1kYXRhJykuZm9yRWFjaChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRUYWIodGFiSWQpPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgICAgICB0aGlzLmdldENvbnRlbnQoY29udGVudElkKT8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzZWQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG5cclxuICAgICAgICBjb25zdCBzaG93SW5wdXRNZWRpYSA9IGxhc3RGb2N1c2VkPy5xdWVyeVNlbGVjdG9yKGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0T25DbGlja31gKSB8fCBsYXN0Rm9jdXNlZD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2t9YCk7XHJcblxyXG4gICAgICAgIGlmIChzaG93SW5wdXRNZWRpYSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0UGxhY2Vob2xkZXIgPSB0aGlzLmZpbmRDbGFzc1dpdGhTdWZmaXgoc2hvd0lucHV0TWVkaWEsIFwiLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dFBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0UGxhY2Vob2xkZXIodGV4dFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxhc3RGb2N1c2VkKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmF0ZU1lZGlhVXBsb2FkID0gbGFzdEZvY3VzZWQucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dFVwbG9hZH1gKSB8fCBsYXN0Rm9jdXNlZC5jbG9zZXN0KGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0VXBsb2FkfWApO1xyXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkVGFiXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBlbWJlZFRhYiA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZFRhYlwiKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHVwbG9hZENvbnRlbnQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkQ29udGVudFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgZW1iZWRDb250ZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkQ29udGVudFwiKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIG1lZGlhIHVwbG9hZCBpcyBhY3RpdmUsIHRoZSBtZWRpYUlucHV0dGVyIHVzZXMgbWVkaWEgdXBsb2FkIGFzIHRoZSBkZWZhdWx0LlxyXG4gICAgICAgICAgICBpZiAoYWN0aXZhdGVNZWRpYVVwbG9hZCAmJiB1cGxvYWRUYWIgJiYgdXBsb2FkQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHVwbG9hZFRhYi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGVtYmVkQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1cGxvYWRUYWIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHVwbG9hZFRhYi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGVtYmVkQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcblxyXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyhsYXN0Rm9jdXNlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZENvbnRlbnQgaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgaWYgKGlucHV0ICYmIHRoaXMuaXNFbGVtZW50VmlzaWJsZShpbnB1dCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGVtYmVkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkQ29udGVudCBpbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoZW1iZWQgPT0gXCJpbWFnZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcclxuICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL2ltYWdlLmpwZ1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVtYmVkID09IFwieW91dHViZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcclxuICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS8uLi5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbWJlZCA9PSBcInNwb3RpZnktZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XHJcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tLy4uLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVtYmVkID09IFwiZ2l0aHViLWdpc3QtZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XHJcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vLi4uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1iZWQgPT0gXCJjb2RlcGVuLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIikge1xyXG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCBcImh0dHBzOi8vY29kZXBlbi5pby8uLi5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiUGFzdGUgVVJMIGhlcmUuLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgaXNFbGVtZW50VmlzaWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICByZXR1cm4gcmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gXCJcIjtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRNaWRwb2ludCA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgKHJlY3Qud2lkdGggLyAyKTtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gdGFyZ2V0TWlkcG9pbnQgLSAodGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aCAvIDIpO1xyXG4gICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZWRpYUlucHV0dGVyQnVpbGRlciB7XHJcbiAgICBzdGF0aWMgYnVpbGQoKTogTWVkaWFJbnB1dHRlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhSW5wdXR0ZXIgPSBuZXcgTWVkaWFJbnB1dHRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWVkaWFJbnB1dHRlcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvclwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja0J1aWxkZXIgfSBmcm9tIFwiLi9BZGRCbG9ja0J1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIH0gZnJvbSBcIi4vVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWlja01lbnVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRpdGxlQnVpbGRlciB9IGZyb20gXCIuL1RpdGxlQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBDb250ZW50QnVpbGRlciB9IGZyb20gXCIuL0NvbnRlbnRCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXJCdWlsZGVyIH0gZnJvbSBcIi4vTWVkaWFJbnB1dHRlckJ1aWxkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0b3JCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogRWRpdG9yIHtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gRWRpdG9yLmdldEluc3RhbmNlKFxyXG4gICAgICAgICAgICBUaXRsZUJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQ29udGVudEJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQWRkQmxvY2tCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBRdWlja01lbnVCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgTWVkaWFJbnB1dHRlckJ1aWxkZXIuYnVpbGQoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiBlZGl0b3I7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9lZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCBpY29ucyBmcm9tIFwiLi4vYXNzZXRzL2ltZy9pY29ucy5zdmdcIjtcclxuaW1wb3J0IHsgRWRpdG9yQnVpbGRlciB9IGZyb20gXCIuL0VkaXRvckJ1aWxkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBTaW5nbGV0b24gY2xhc3MgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGFuZCBtYW5hZ2luZyB0aGUgdXNlciBpbnRlcmZhY2Ugb2YgdGhlIGVkaXRvci5cclxuICogRW5zdXJlcyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFVJQnVpbGRlciBjYW4gZXhpc3QsIG1hbmFnaW5nIHRoZSBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVJQnVpbGRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVJQnVpbGRlcjtcclxuXHJcbiAgICBwcml2YXRlIGVkaXRvcjogRWRpdG9yO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgVUlCdWlsZGVyIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgVUlCdWlsZGVyIGluc3RhbmNlIHdpdGggYSBnaXZlbiBlZGl0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VkaXRvcn0gZWRpdG9yIFRoZSBlZGl0b3IgaW5zdGFuY2UgdG8gYmUgbWFuYWdlZCBieSBVSUJ1aWxkZXIuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIGFuIGluc3RhbmNlIG9mIFVJQnVpbGRlciBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvcikge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XHJcblxyXG4gICAgICAgIFVJQnVpbGRlci5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGdldCBvciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVUlCdWlsZGVyLlxyXG4gICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgc2luZ2xldG9uIHBhdHRlcm4gYW5kIGVuc3VyZXMgdGhhdCBVSUJ1aWxkZXIgaXMgb25seSBpbnN0YW50aWF0ZWQgb25jZS5cclxuICAgICAqIEByZXR1cm5zIHtVSUJ1aWxkZXJ9IFJldHVybnMgdGhlIGV4aXN0aW5nIG9yIG5ldyBVSUJ1aWxkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBidWlsZCgpOiBVSUJ1aWxkZXIge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBVSUJ1aWxkZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFVJQnVpbGRlcihFZGl0b3JCdWlsZGVyLmJ1aWxkKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVpbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgYnkgaW5zZXJ0aW5nIG5lY2Vzc2FyeSBpY29ucyBhbmQgcmV0dXJuaW5nIHRoZSBlZGl0b3IgaW5zdGFuY2UuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHRvIHN0YXJ0IHRoZSBlZGl0b3IgYW5kIHByZXBhcmUgYWxsIFVJIGNvbXBvbmVudHMuXHJcbiAgICAgKiBAcmV0dXJucyB7RWRpdG9yfSBUaGUgaW5pdGlhbGl6ZWQgZWRpdG9yIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzdGFydCgpOiBFZGl0b3Ige1xyXG5cclxuICAgICAgICB0aGlzLmluc2VydEljb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5zZXJ0cyBhIGNvbnRhaW5lciB3aXRoIFNWRyBpY29ucyBpbnRvIHRoZSBkb2N1bWVudCBib2R5LiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXRcclxuICAgICogdGhlIGljb25zIGFyZSBvbmx5IGluc2VydGVkIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgZW50cmllcy5cclxuICAgICovXHJcbiAgICBpbnNlcnRJY29ucygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdmctaWNvbnMtY29udGFpbmVyJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ZnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgICAgICBzdmdDb250YWluZXIuaW5uZXJIVE1MID0gaWNvbnM7XHJcbiAgICAgICAgICAgIHN2Z0NvbnRhaW5lci5jbGFzc05hbWUgPSAnc3ZnLWljb25zLWNvbnRhaW5lcic7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN2Z0NvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCIuL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXNcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIENlbnRyYWwgY29tbWFuZCBkaXNwYXRjaGVyIGNsYXNzIGZvciBoYW5kbGluZyB2YXJpb3VzIGVkaXRvciBjb21tYW5kcyByZWxhdGVkIHRvIHRleHQgYW5kIGJsb2NrIG1hbmlwdWxhdGlvbi5cclxuICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG5lZWRlZCB0byBleGVjdXRlIGNvbW1hbmRzIHN1Y2ggYXMgYm9sZCwgaXRhbGljLCB1bmRlcmxpbmUsIGNvbG9yIGNoYW5nZXMsIGFuZCBzdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgdG8gY29udGVudCBibG9ja3Mgd2l0aGluIGFuIGVkaXRvci5cclxuICpcclxuICogQGNsYXNzXHJcbiAqIEBzaW5nbGV0b25cclxuICogTWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSB0cmlnZ2VyZWQgYnkgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIGZvciBjdXN0b20gZXZlbnRzIHdoaWNoIGRpY3RhdGUgdGhlIHR5cGUgb2YgY29tbWFuZCB0byBiZSBleGVjdXRlZC5cclxuICpcclxuICogRXhhbXBsZSB1c2FnZTpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjb25zdCBjb21tYW5kRGlzcGF0Y2hlciA9IENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCk7XHJcbiAqIGNvbW1hbmREaXNwYXRjaGVyLmxpc3RlbigpOyAgLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBjb21tYW5kIGFuZCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy5cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpc3BhdGNoZXIge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tYW5kRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgYXR0ZW1wdGVkIHRvIGJlIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdCB0byBpbnN0YW50aWF0ZSBzaW5nbGV0b24gYENvbW1hbmREaXNwYXRjaGVyYCBtb3JlIHRoYW4gb25jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gdGV4dE9wZXJhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgICogQHJldHVybnMge0NvbW1hbmREaXNwYXRjaGVyfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb21tYW5kRGlzcGF0Y2hlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb21tYW5kRGlzcGF0Y2hlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgdGV4dE9wZXJhdGlvblNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRleHRPcGVyYXRpb25zU2VydmljZT4oXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcblxyXG4gICAgICAgIGlmICghQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UgPSBuZXcgQ29tbWFuZERpc3BhdGNoZXIoYmxvY2tPcGVyYXRpb25zU2VydmljZSwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBsaXN0ZW5lcnMgZm9yIHZhcmlvdXMgZWRpdG9yLXJlbGF0ZWQgZXZlbnRzIHN1Y2ggYXMgY29tbWFuZCByZXF1ZXN0cyBhbmQgc2VsZWN0aW9uIGNoYW5nZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHRoaXMuaGFuZGxlQ29tbWFuZEV2ZW50IGFzIEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmZvY3VzT25GaXJzdFJlcXVlc3RlZCwgdGhpcy5oYW5kbGVGb2N1c09uRmlyc3RSZXF1ZXN0ZWRFdmVudCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMucHJlc3NlZEVudGVyT25UaXRsZSwgKCkgPT4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmNyZWF0ZUFOZXdQYXJhZ3JhcGhGcm9tVGl0bGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGNvbW1hbmQgZXZlbnRzIGRpc3BhdGNoZWQgZnJvbSBVSSBjb21wb25lbnRzIG9yIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD59IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgY29tbWFuZCwgc2hvd1VJLCB2YWx1ZSwgdGFyZ2V0QmxvY2tUeXBlLCBibG9jaywgc2NvcGUgfSA9IGV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmxpbmtSZWFkeVRvSW5zZXJ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5saW5rUmVhZHlUb0luc2VydH0gcmVxdWlyZXMgdmFsdWVgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNJbnNlcnRMaW5rKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVMaW5rOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1RvZ2dsZUxpbmsoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVCb2xkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0JvbGQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0lubGluZUNvZGUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJdGFsaWM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjSXRhbGljKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1VuZGVybGluZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVN0cmlrZVRocm91Z2g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjU3RyaWtlVGhyb3VnaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0hpbGl0ZUNvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvcmVDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IGVsZW1lbnQgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIGJsb2NrLmApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRyYW5zZm9ybUJsb2NrKHZhbHVlLCBibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuZHVwbGljYXRlQmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0R1cGxpY2F0ZUJsb2NrKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjRGVsZXRlQmxvY2soYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVBbmRGb2N1c09uTmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmZvY3VzT25OZXh0QmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvY3VzT25OZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlRm9ybWF0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjUmVtb3ZlRm9ybWF0KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkp1c3RpZnlMZWZ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5TGVmdH0gcmVxdWlyZXMgYSBibG9jayB0byBqdXN0aWZ5LmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmp1c3RpZnlMZWZ0KGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5KdXN0aWZ5Q2VudGVyOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5Q2VudGVyfSByZXF1aXJlcyBhIGJsb2NrIHRvIGp1c3RpZnkuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuanVzdGlmeUNlbnRlcihibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuSnVzdGlmeVJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5UmlnaHR9IHJlcXVpcmVzIGEgYmxvY2sgdG8ganVzdGlmeS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5qdXN0aWZ5UmlnaHQoYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZX0gcmVxdWlyZXMgYSBibG9jayB0byBjaGFuZ2UgYSBjb2RlIGJsb2NrIGxhbmd1YWdlLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2V9IHJlcXVpcmVzIGEgdmFsdWUgdG8gY2hhbmdlIGEgY29kZSBibG9jayBsYW5ndWFnZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZShibG9jaywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydE5ldzpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0luc2VydE5ldyhjb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5mb2N1c09uUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0ZvY3VzT25QcmV2aW91c0Jsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLm1lcmdlV2l0aE5leHRCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoTmV4dEJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMubWVyZ2VXaXRoUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoUHJldmlvdXNCbG9jaygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5MZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5SaWdodChibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmluc2VydFJvd0Fib3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dCZWxvdyhibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbGwgYmFja2dyb3VuZCBjb2xvci5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5leGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcjpcclxuICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcn0gcmVxdWlyZXMgYSBibG9jay5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3J9IHJlcXVpcmVzIGEgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ2hhbmdlQ2FsbG91dEJhY2tncm91bmQoYmxvY2ssIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVDb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlQ29sdW1uKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVSb3c6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlUm93OlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnJlbW92ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuY2hhbmdlVGFibGVCb3JkZXJDb2xvcihzY29wZSBhcyBUYWJsZVNjb3BlcywgdmFsdWUgYXMgQ29sb3JzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2spO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlUm93RWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZVJvd0VsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRSb3dFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm8gYWN0aW9uIGRlZmluZWQgZm9yIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBleGVjVHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlKTtcclxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNSZW1vdmVGb3JtYXQoY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5ub3JtYWxpemUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjSW5zZXJ0TmV3KGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRm9jdXNPblByZXZpb3VzQmxvY2soY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIGhhbmRsZUZvY3VzT25GaXJzdFJlcXVlc3RlZEV2ZW50ID0gKGNvbW1hbmQ6IENvbW1hbmRzKTogdm9pZCA9PiB7XHJcbiAgICAvLyAgICAgLy8gYWxlcnQoXCJmb2N1cyBvbiBmaXJzdFwiKTtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG4gICAgLy8gfVxyXG59XHJcbiIsImltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gXCIuL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMga2V5Ym9hcmQgc2hvcnRjdXQgbGlzdGVuaW5nIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbiB0byBlbnN1cmVcclxuICogdGhhdCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBpcyBjZW50cmFsaXplZCBhbmQgdGhhdCBtdWx0aXBsZSBpbnN0YW5jZXMgZG8gbm90IGR1cGxpY2F0ZSBldmVudCBsaXN0ZW5lcnMuXHJcbiAqIEl0IGludGVyY2VwdHMga2V5ZG93biBldmVudHMgYW5kIGRpc3BhdGNoZXMgY29tbWFuZHMgYmFzZWQgb24gc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucywgZW5oYW5jaW5nIHRleHQgZWRpdGluZ1xyXG4gKiBjYXBhYmlsaXRpZXMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi5cclxuICogXHJcbiAqIFRoZSBjbGFzcyBpbml0aWFsaXplcyBpdHNlbGYgdGhlIGZpcnN0IHRpbWUgYGdldEluc3RhbmNlYCBpcyBjYWxsZWQgYW5kIHN1YnNlcXVlbnRseSBtYW5hZ2VzIGFsbCBrZXlib2FyZCBzaG9ydGN1dHNcclxuICogdGhyb3VnaCBhIHNpbmdsZSBpbnN0YW5jZS5cclxuICogXHJcbiAqIFVzYWdlIG9mIHRoaXMgY2xhc3Mgb3V0c2lkZSBvZiBpdHMgc2luZ2xldG9uIHBhdHRlcm4gaXMgcmVzdHJpY3RlZCB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlcywgd2hpY2ggaXMgZW5mb3JjZWRcclxuICogYnkgdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBkaXJlY3RseSBhZnRlciBpbml0aWFsaXphdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaG9ydGN1dExpc3RlbmVycyBpbXBsZW1lbnRzIElTaG9ydGN1dExpc3RlbmVycyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIFNob3J0Y3V0TGlzdGVuZXJzLCBlbnN1cmluZyB0aGUgc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBAdHlwZSB7U2hvcnRjdXRMaXN0ZW5lcnMgfCBudWxsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFNob3J0Y3V0TGlzdGVuZXJzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvdXRzaWRlIG9mIHRoZSBzaW5nbGV0b24gY29udGV4dC4gSW5pdGlhbGl6ZXMgdGhlXHJcbiAgICAgKiBzaG9ydGN1dCBsaXN0ZW5lciBzZXR1cCBieSBjYWxsaW5nIHRoZSBgbGlzdGVuYCBtZXRob2QsIGVuc3VyaW5nIGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRpcmVjdGx5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TGlzdGVuKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibGlzdGVuaW5nIGtleWJvYXJkIHNob3J0Y3V0c1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBTaG9ydGN1dExpc3RlbmVycyBjbGFzcy4gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90XHJcbiAgICAgKiBleGlzdCwgaXQgY3JlYXRlcyBhbmQgcmV0dXJucyBpdCwgZW5zdXJpbmcgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Nob3J0Y3V0TGlzdGVuZXJzfSBUaGUgc2luZ2xlIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgU2hvcnRjdXRMaXN0ZW5lcnMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBTaG9ydGN1dExpc3RlbmVycyB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgU2hvcnRjdXRMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXR0YWNoZXMgYSBnbG9iYWwgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50IHRvIGludGVyY2VwdCBrZXlkb3duIGV2ZW50cyBhbmQgcGVyZm9ybSBzcGVjaWZpYyB0ZXh0IHRyYW5zZm9ybWF0aW9uXHJcbiAgICAqIGNvbW1hbmRzIGJhc2VkIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBrZXlzIHByZXNzZWQuIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZW5oYW5jZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzXHJcbiAgICAqIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiBieSBwcm92aWRpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciB2YXJpb3VzIHRleHQgZm9ybWF0dGluZyBhbmQgZWRpdGluZyBhY3Rpb25zLlxyXG4gICAgKlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gdXNlcyBhIGNvbWJpbmF0aW9uIG9mIEN0cmwsIEFsdCAob3IgQWx0R3JhcGgpLCBTaGlmdCwgYW5kIHNwZWNpZmljIGtleXMgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gdG8gYmVcclxuICAgICogdGFrZW4uIEl0IGhhbmRsZXMgdHJhbnNmb3JtYXRpb24gaW50byBkaWZmZXJlbnQgYmxvY2sgdHlwZXMgbGlrZSBwYXJhZ3JhcGhzLCBjaGVja2xpc3RzLCBudW1iZXJlZCBsaXN0cywgaGVhZGVycywgZXRjLixcclxuICAgICogYXMgd2VsbCBhcyBibG9jayBkdXBsaWNhdGlvbiBhbmQgZGVsZXRpb24uXHJcbiAgICAqXHJcbiAgICAqIFByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb24gYXJlIGNhbGxlZCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGtleSBhY3Rpb25zIGFuZCBidWJibGluZyBvZiBldmVudHMsIGVuc3VyaW5nIHRoYXRcclxuICAgICogb25seSB0aGUgaW50ZW5kZWQgYWN0aW9ucyBhcmUgZXhlY3V0ZWQuXHJcbiAgICAqXHJcbiAgICAqIFN1cHBvcnRlZCBTaG9ydGN1dHM6XHJcbiAgICAqIC0gQ3RybCtTaGlmdCtFbnRlcjogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgcGFyYWdyYXBoLlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrMSBvciBDdHJsK1NoaWZ0K051bXBhZDEgKE51bUxvY2sgb24pOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBjaGVja2xpc3QuXHJcbiAgICAqIC0gQ3RybCtTaGlmdCsuIDogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgYnVsbGV0ZWQgbGlzdC5cclxuICAgICogLSBDdHJsK1NoaWZ0Ky8gOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBudW1iZXJlZCBsaXN0LlxyXG4gICAgKiAtIEN0cmwrQWx0KzEgdGhyb3VnaCBDdHJsK0FsdCs2OiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gaGVhZGVycyAoSDEgdGhyb3VnaCBINikuXHJcbiAgICAqIC0gQ3RybCtEOiBEdXBsaWNhdGVzIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIFNoaWZ0K0RlbGV0ZSBvciBTaGlmdCtCYWNrc3BhY2U6IERlbGV0ZXMgdGhlIGN1cnJlbnQgYmxvY2suXHJcbiAgICAqIC0gQ3RybCtcXCA6IENsZWFycyBmb3JtYXR0aW5nIG9mIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIEN0cmwrQWx0K0RpZ2l0MTogUHJldmVudHMgY2hhcmFjdGVyIGluc2VydGlvbiB3aGVuIHVzaW5nIHRoZSB0b3Agcm93ICcxJywgc3BlY2lmaWMgdG8gbGF5b3V0IGNvbmZpZ3VyYXRpb25zLlxyXG4gICAgKlxyXG4gICAgKiBFYWNoIGFjdGlvbiBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggZGV0YWlscyBhYm91dCB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCwgd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYnlcclxuICAgICogQ29tbWFuZERpc3BhdGNoZXIuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEluaXRpYWxpemUgYW5kIGFjdGl2YXRlIHRoZSBzaG9ydGN1dHMgYWNyb3NzIHRoZSBkb2N1bWVudC5cclxuICAgICogY29uc3Qgc2hvcnRjdXRMaXN0ZW5lciA9IFNob3J0Y3V0TGlzdGVuZXJzLmdldEluc3RhbmNlKCk7XHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW4oKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgS2V5OiAke2V2ZW50LmtleX0sIENvZGU6ICR7ZXZlbnQuY29kZX0sIEN0cmw6ICR7ZXZlbnQuY3RybEtleX0sIEFsdDogJHtldmVudC5hbHRLZXl9LCBBbHRHcjogJHtldmVudC5rZXkgPT09ICdBbHRHcmFwaCd9LCBOdW1Mb2NrOiAke2V2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ051bUxvY2snKX1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTnVtUGFkID0gZXZlbnQuY29kZS5zdGFydHNXaXRoKFwiTnVtcGFkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1Mb2NrT24gPSBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTnVtTG9ja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBwYXJhZ3JhcGggd2hlbiBwcmVzc2luZyBDdHJsK1NoaWZ0K0VudGVyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgYWxlcnQoXCJjb252ZXJ0byBwYXJhIHBhcmFncmFmb1wiKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEhcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5hbHRLZXkgJiYgKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIgfHwgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQxXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBjaGVja2xpc3Qgd2hlbiBwcmVzc2luZyAgQ3RybCtTaGlmdCsxXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1RcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgPT09IFwiLlwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBidWxsZXRlZCBsaXN0IHdoZW4gcHJlc3NpbmcgIEN0cmwrU2hpZnQrLlxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNUXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIi9cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIG51bWJlcmVkIGxpc3Qgd2hlbiBwcmVzc2luZyBDdHJsK1NoaWZ0Ky9cclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoMSB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzFcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzFcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDJcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDJcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDIgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCsyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQzXCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQzXCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGgzIHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrM1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfM1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NFwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNFwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoNCB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDVcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDVcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDUgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCs1XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQ2XCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQ2XCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGg2IHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrNlxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQua2V5ID09PSBcIkRcIiB8fCBldmVudC5rZXkgPT09IFwiZFwiKSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgYmxvY2sgd2hlbiBwcmVzc2luZyBDdHJsK0RcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZHVwbGljYXRlQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5rZXkgPT09IFwiRGVsZXRlXCIgfHwgZXZlbnQua2V5ID09PSBcIkJhY2tzcGFjZVwiKSAmJiBldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVsZXRlIGJsb2NrIHdoZW4gcHJlc3NpbmcgU2hpZnQrRGVsZXRlXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmRlbGV0ZUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiXFxcXFwiICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBmb3JtYXR0aW5nIHdoZW4gcHJlc3NpbmcgQ3RybCtcXFxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnJlbW92ZUZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBjaGFyYWN0ZXIgaW5zZXJ0aW9uIHdoZW4gdXNpbmcgdG9wIHJvdyAnMSdcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IElUYWJsZUxpc3RlbmVycyB9IGZyb20gXCIuL0lUYWJsZUxpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEZvY3VzU3RhY2sgfSBmcm9tIFwiLi4vRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCIuLi9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIi4uL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUxpc3RlbmVycyBpbXBsZW1lbnRzIElUYWJsZUxpc3RlbmVycyB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlTGlzdGVuZXJzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XHJcblxyXG4gICAgc2hvd25FbGVtZW50cyA9IG5ldyBNYXA8SFRNTFRhYmxlQ2VsbEVsZW1lbnQsIEhUTUxFbGVtZW50PigpO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcbiAgICAgICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2spIHtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlTGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUYWJsZUV2ZW50TGlzdGVuZXJzLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdGVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRMaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJsaXN0ZW5pbmcgdGFibGUgY2xpY2tzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUYWJsZUxpc3RlbmVycyB7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XHJcbiAgICAgICAgaWYgKFRhYmxlTGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBUYWJsZUxpc3RlbmVycy5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgVGFibGVMaXN0ZW5lcnMoZm9jdXNTdGFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsaXN0ZW4oKSB7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgbGV0IHBhcmVudDogRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgTm9kZSkubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IChldmVudC50YXJnZXQgYXMgTm9kZSkucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IChldmVudC50YXJnZXQgYXMgRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQ/LmNsb3Nlc3QoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtblJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazogcGFyZW50LmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudD8uY2xvc2VzdChcIi5hZGQtdGFibGUtcm93XCIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6IHBhcmVudC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBFbnN1cmUgdGhlIHRhcmdldCBpcyBhIHRhYmxlIGNlbGwgKHRkKSBhbmQgYSBjaGlsZCBvZiBhbiBlbGVtZW50IHdpdGggY2xhc3MgJ2Jsb2NrJ1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjZWxsID0gdGFyZ2V0LmNsb3Nlc3QoXCJ0ZFwiKTtcclxuICAgICAgICAvLyAgICAgaWYgKCFjZWxsIHx8ICFjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikpIHJldHVybjsgXHJcblxyXG4gICAgICAgIC8vICAgICAvLyBHZXQgdGhlIGFzc29jaWF0ZWQgdGFibGUgKGFzc3VtaW5nIGEgdGFibGUgZXhpc3RzKVxyXG4gICAgICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGFibGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIElmIGFuIGVsZW1lbnQgaXMgYWxyZWFkeSBzaG93biBmb3IgdGhpcyBjZWxsLCBkbyBub3RoaW5nXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnNob3duRWxlbWVudHMuaGFzKGNlbGwpKSByZXR1cm47IC8vIFByZXZlbnQgZmxpY2tlcmluZ1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgaW4gdGhlIGxhc3QgY29sdW1uIGFuZCBlbWl0IGV2ZW50XHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdENvbHVtbih0YWJsZSwgY2VsbCkpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGJsb2NrID0gY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQsIGJsb2NrIH0sXHJcbiAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLnNldChjZWxsLCBibG9jayk7IC8vIFRyYWNrIHRoZSBzaG93biBlbGVtZW50XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIGluIHRoZSBsYXN0IHJvdyBhbmQgZW1pdCBldmVudFxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RSb3codGFibGUsIGNlbGwpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBibG9jayA9IGNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5zaG93SW5zZXJ0VGFibGVSb3dFbGVtZW50LCBibG9jayB9LFxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5zZXQoY2VsbCwgYmxvY2spOyAvLyBUcmFjayB0aGUgc2hvd24gZWxlbWVudFxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEVuc3VyZSB0aGUgdGFyZ2V0IGlzIGEgdGFibGUgY2VsbCAodGQpIGFuZCBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAnYmxvY2snXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWNlbGwgfHwgIWNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIHRhYmxlIChhc3N1bWluZyBhIHRhYmxlIGV4aXN0cylcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBpZiAoIXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiB0aGUgbW91c2UgaXMgbGVhdmluZyB0aGUgbGFzdCBjb2x1bW4gY2VsbCBhbmQgbm90IGVudGVyaW5nIHRoZSBhZGQgY29sdW1uIGJ1dHRvblxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RDb2x1bW4odGFibGUsIGNlbGwpICYmICFyZWxhdGVkVGFyZ2V0Py5jbGFzc0xpc3QuY29udGFpbnMoXCJhZGQtdGFibGUtY29sdW1uXCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaG93bkVsZW1lbnQgPSB0aGlzLnNob3duRWxlbWVudHMuZ2V0KGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHNob3duRWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudCwgYmxvY2s6IHNob3duRWxlbWVudCB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5kZWxldGUoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBsYXN0IHJvdyBjZWxsIGFuZCBub3QgZW50ZXJpbmcgdGhlIGFkZCByb3cgYnV0dG9uXHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdFJvdyh0YWJsZSwgY2VsbCkgJiYgIXJlbGF0ZWRUYXJnZXQ/LmNsYXNzTGlzdC5jb250YWlucyhcImFkZC10YWJsZS1yb3dcIikpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IHNob3duRWxlbWVudCA9IHRoaXMuc2hvd25FbGVtZW50cy5nZXQoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc2hvd25FbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50LCBibG9jazogc2hvd25FbGVtZW50IH0sXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLmRlbGV0ZShjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiLi9JRm9jdXNTdGFja1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZvY3VzU3RhY2sgaW1wbGVtZW50cyBJRm9jdXNTdGFjayB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEZvY3VzU3RhY2s7XHJcbiAgICBwcml2YXRlIHN0YWNrOiBIVE1MRWxlbWVudFtdO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXBhY2l0eTogbnVtYmVyID0gMTA7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBGb2N1c1N0YWNrIHtcclxuICAgICAgICBpZiAoIUZvY3VzU3RhY2suaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgRm9jdXNTdGFjay5pbnN0YW5jZSA9IG5ldyBGb2N1c1N0YWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBGb2N1c1N0YWNrLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwdXNoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IHRoaXMuY2FwYWNpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFjay5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YWNrLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBlZWsoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vZWxlbWVudC1mYWN0b3J5L0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiQC9jb3JlL0lGb2N1c1N0YWNrXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgLy8gc3RhdGljIEJMT0NLX09QRVJBVElPTlMgPSB7XG4gICAgLy8gICAgIFRVUk5fSU5UTzogXCJ0dXJuSW50b1wiLFxuICAgIC8vICAgICBDUkVBVEVfREVGQVVMVF9CTE9DSzogXCJDcmVhdGVEZWZhdWx0QmxvY2tcIixcbiAgICAvLyAgICAgREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTOiBcIkRlbGV0ZUFuZEZvY3VzT25QcmV2aW91c1wiLFxuICAgIC8vICAgICBERUxFVEVfRk9DVVNfT05fTkVYVDogXCJEZWxldGVBbmRGb2N1c09uTmV4dFwiLFxuICAgIC8vICAgICBGT0NVU19PTl9GSVJTVDogXCJGb2N1c09uRmlyc3RcIixcbiAgICAvLyAgICAgRk9DVVNfT05fUFJFVklPVVM6IFwiRm9jdXNPblByZXZpb3VzXCIsXG4gICAgLy8gICAgIEZPQ1VTX09OX05FWFQ6IFwiRm9jdXNPbk5leHRcIixcbiAgICAvLyAgICAgREVMRVRFOiBcImRlbGV0ZVwiLFxuICAgIC8vICAgICBEVVBMSUNBVEU6IFwiZHVwbGljYXRlXCIsXG4gICAgLy8gICAgIENPUFk6IFwiY29weVwiLFxuICAgIC8vICAgICBQQVNURTogXCJwYXRlc1wiLFxuICAgIC8vICAgICBDVVQ6IFwiY3V0XCIsXG4gICAgLy8gICAgIFJFTU9WRV9GT1JNQVQ6IFwicmVtb3ZlRm9ybWF0XCIsXG4gICAgLy8gICAgIFRSQU5TRk9STV9CTE9DSzogXCJ0cmFuc2Zvcm1CbG9ja1wiXG4gICAgLy8gfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcbiAgICAgICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2ssXG4gICAgICAgIG1lbWVudG86IElNZW1lbnRvKSB7XG5cbiAgICAgICAgaWYgKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xuXG4gICAgICAgIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VJOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5jb3B5U2VsZWN0ZWQpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvcGllZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjb3BpZWRFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjb3B5IHRleHQnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmN1dFNlbGVjdGVkKSB7XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRTZWxlY3Rpb24gJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWxldGVGcm9tRG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoICdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gY3V0IHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucGFzdCkge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCkge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKS50aGVuKChwYXN0ZWRUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXN0ZWRUZXh0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0VXBkYXRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRleHQgc2VsZWN0ZWQgb3IgY2xpcGJvYXJkIGVtcHR5LicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gcGFzdGluZyB0ZXh0OiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaykge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQmxvY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucmVtb3ZlRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoQ29tbWFuZHMucmVtb3ZlRm9ybWF0LCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5kZWxldGVCbG9jaykge1xuXG4gICAgICAgIC8vICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCB7XG4gICAgICAgIC8vICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmNyZWF0ZURlZmF1bHRCbG9jaykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0QmxvY2soZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmZvY3VzT25GaXJzdEJsb2NrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlRm9jdXNPblByZXZpb3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhlbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRVUk5fSU5UTykge1xuXG4gICAgICAgIC8vICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIC8vICAgICB9XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybWF0QmxvY2soZWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBlbGVtZW50RmFjdG9yeVNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUVsZW1lbnRGYWN0b3J5U2VydmljZT4oXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIpO1xuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKGVsZW1lbnRGYWN0b3J5U2VydmljZSwgZm9jdXNTdGFjaywgbWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RHJhZ2dhYmxlRWxlbWVudEZyb21TZWxlY3Rpb24oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0b3JuYXIgbnVsbCBzZSBuZW5odW1hIHNlbGXDp8OjbyB2w6FsaWRhIGZvciBlbmNvbnRyYWRhIG91IG5lbmh1bSBlbGVtZW50byBjb3JyZXNwb25kZW50ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0VGFnTmFtZUJ5Q29tbWFuZE5hbWUoY29tbWFuZE5hbWU6IHN0cmluZykge1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmROYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9QYXJhZ3JhcGhcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJwXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgxXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgyXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IM1wiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgzXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INFwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg0XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg1XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg2XCI7XG5cbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuXG4gICAgZXhlY01lcmdlV2l0aFByZXZpb3VzQmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNDb250ZW50RWRpdGFibGUgPSBET01VdGlscy5nZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZShjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCA9IHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCArIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5jbG9zZXN0KFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2FyZXRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhckluZGV4OiBjYXJldFBvc2l0aW9uLmNoYXJJbmRleCArIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLnRleHRDb250ZW50IS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3M6IGNhcmV0UG9zaXRpb24uaG9yaXpvbnRhbFBvc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlLCBhZGp1c3RlZENhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNNZXJnZVdpdGhOZXh0QmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dENvbnRlbnRFZGl0YWJsZSA9IERPTVV0aWxzLmdldE5leHRDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIGlmICghbmV4dENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKG5leHRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGN1cnJlbnRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gRE9NVXRpbHMuc2F2ZUNhcmV0UG9zaXRpb24yZChjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5pbm5lckhUTUwgKyBuZXh0Q29udGVudEVkaXRhYmxlLmlubmVySFRNTDtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCJsaVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbSA9IG5leHRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBuZXh0Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKGN1cnJlbnRDb250ZW50RWRpdGFibGUsIGNhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNEdXBsaWNhdGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gKHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IGJsb2NrLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjbHVkZS1mcm9tLWNsb25lJykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBibG9jay5uZXh0U2libGluZztcbiAgICAgICAgYmxvY2sucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGNsb25lLCBuZXh0RWxlbWVudCk7XG5cbiAgICAgICAgY2xvbmUuaWQgPSBgYi0ke1V0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKX1gO1xuXG4gICAgICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tDbG9uZWQsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgYmxvY2sgPSAodGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IERPTVV0aWxzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNPbk5leHQoYmxvY2spO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGJsb2NrKTtcblxuICAgICAgICBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmJsb2NrRGVsZXRlZCwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPblByZXZpb3VzKCk7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyBhcHBseVNlbGVjdGVkQmxvY2tUeXBlKGRyYWdnYWJsZUJsb2NrOiBIVE1MRWxlbWVudCwgbmV3QmxvY2tUeXBlOiBzdHJpbmcpIHtcblxuICAgIC8vICAgICAvLyBjb25zdCBkcmFnZ2FibGVCbG9jayA9IHJlYWxGb2N1c2VkRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcbiAgICAvLyAgICAgLy8gY29uc3QgbmV3QmxvY2tUeXBlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5vcHRpb24nKSA/XG4gICAgLy8gICAgIC8vICAgICBldmVudC50YXJnZXQuY2xvc2VzdCgnLm9wdGlvbicpLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgOlxuICAgIC8vICAgICAvLyAgICAgY3VycmVudEZha2VGb2N1c2VkT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XG5cbiAgICAvLyAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0Lmxhc3RJbmRleE9mKCcvJyk7XG4gICAgLy8gICAgIHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQgPSBsYXN0U2xhc2hJbmRleCAhPT0gLTEgPyByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0LnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KSA6IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQ7XG5cblxuICAgIC8vICAgICB0cmFuc2Zvcm1CbG9jayhkcmFnZ2FibGVCbG9jaywgbmV3QmxvY2tUeXBlKTtcblxuICAgIC8vICAgICBoaWRlQW5kQ2xlYXJCbG9ja09wdGlvbnMoKTtcbiAgICAvLyAgICAgaGlkZUFsbERlcGVuZGVudEJveCgpO1xuICAgIC8vICAgICBoaWRlZmxvYXRpbmdUb29sYmFyKCk7XG4gICAgLy8gfVxuXG4gICAgLy8gZm9ybWF0QmxvY2soZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbnRlbnRUeXBlOiBzdHJpbmcpXG4gICAgdHJhbnNmb3JtQmxvY2sodHlwZTogc3RyaW5nLCBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG5cbiAgICAgICAgbGV0IGJsb2NrRWxlbWVudDogRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmNsb3Nlc3QoXCIuYmxvY2tcIikgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbGVtZW50KXtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5ibG9ja1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250ZW50RWxlbWVudCA9IGJsb2NrRWxlbWVudCEucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmZvY3VzKCk7XG5cbiAgICAgICAgRE9NVXRpbHMucmVtb3ZlRmlsdGVyVGV4dCgpO1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50Py5pbm5lclRleHQ7XG5cbiAgICAgICAgbGV0IGZvY3VzU3RhY2tUb0FkZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuXG4gICAgICAgIGxldCBuZXdDb250ZW50QmxvY2s7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVDb250ZW50ID0gRE9NVXRpbHMucXVlcnlTZWxlY3RvckluY2x1ZGluZ1NlbGYoY29udGVudEVsZW1lbnQsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVySFRNTCA9IGVkaXRhYmxlQ29udGVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xKTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMik7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzM6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzMpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80OiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80KTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNToge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSk7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzY6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzYpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREU6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEU6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1Q6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1QsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNFUEFSQVRPUjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlRBQkxFOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlRBQkxFLCBcIiwsXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLklNQUdFOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLklNQUdFLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU86IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU8sIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TUE9USUZZOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNQT1RJRlksIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRIVUJfR0lTVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRIVUJfR0lTVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFja1RvQWRkID0gbmV3Q29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVExBQl9TTklQUEVUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVExBQl9TTklQUEVULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERVBFTjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFUEVOLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0FMTE9VVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DQUxMT1VUKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxvdXQgPSBuZXdDb250ZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0LXRleHRcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVDb250ZW50ID0gRE9NVXRpbHMucXVlcnlTZWxlY3RvckluY2x1ZGluZ1NlbGYoY29udGVudEVsZW1lbnQsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsb3V0ICYmIGVkaXRhYmxlQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsb3V0LmlubmVySFRNTCA9IGVkaXRhYmxlQ29udGVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld0NvbnRlbnRCbG9jaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2tFbGVtZW50IS5yZXBsYWNlQ2hpbGQobmV3Q29udGVudEJsb2NrLCBjb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld0NvbnRlbnRCbG9jay5jbG9zZXN0KCcuZm9jdXNhYmxlJykgfHwgYmxvY2tFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJykpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUpO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAoZm9jdXNTdGFja1RvQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCgoZm9jdXNTdGFja1RvQWRkIGFzIEhUTUxFbGVtZW50KSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT0gXCJpbWFnZVwiIHx8IHR5cGUgPT0gXCJ2aWRlb1wiIHx8IHR5cGUgPT0gXCJzcG90aWZ5XCIgfHwgdHlwZSA9PSBcImdpdGh1Yi1naXN0XCIgfHwgdHlwZSA9PSBcImdpdGxhYi1zbmlwcGV0XCIgfHwgdHlwZSA9PSBcImNvZGVwZW5cIikge1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGZvY3VzU3RhY2tUb0FkZD8ucXVlcnlTZWxlY3RvcihcIi5jb250ZW50LXBsYWNlaG9sZGVyXCIpO1xuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvcGFhYWFhYVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChwbGFjZWhvbGRlciBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dFbGVtZW50RXZlbnQoXCJtZWRpYUlucHV0dGVyXCIpO1xuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXIgPSBibG9ja0VsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuYmxvY2stdG9vbGJhci13cmFwcGVyXCIpO1xuICAgICAgICBpZiAoYmxvY2tUb29sYmFyKSB7XG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgLy8ncmVxdWVzdEhpZGVGbG9hdGluZ1Rvb2xiYXInXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5ibG9ja1R5cGVDaGFuZ2VkLCB7XG4gICAgICAgIC8vICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAvLyAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNlbGVjdGlvbkV2ZW50KTtcbiAgICB9XG5cbiAgICAvL05PVyBUSEUgZm9ybWF0QmxvY2sgQU5EIHRyYW5zZm9ybUJsb2NrIElTIFRIRSBTQU1FLiBmb3JtYXRCbG9jayBJUyBERVBSRUNFVEVEIFVTRSB0cmFuc2Zvcm1CbG9jayBJTlNURURcbiAgICAvLyBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50LmlubmVyVGV4dDtcblxuICAgIC8vICAgICBsZXQgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKGNvbnRlbnRUeXBlLCBjb250ZW50KTtcblxuICAgIC8vICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgIC8vICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgLy8gICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNhYmxlKTtcbiAgICAvLyB9XG5cblxuXG4gICAgY3JlYXRlTmV3RWxlbWVudChldmVudDogRXZlbnQpIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50ICYmIGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUxpc3RJdGVtKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEJsb2NrKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUxpc3RJdGVtKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBuZXdDb250ZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveC1saXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwiY2hlY2tib3hJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShcImxpc3RJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgcGFyZW50QmxvY2sgPSBudWxsO1xuXG4gICAgICAgIC8vIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuXG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGNvbnRlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGFjdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vICAgICBpZiAodGV4dENvbnRlbnQgPT09ICcnKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gY3JlYXRlTmV3RHJhZ2dhYmxlUGFyYWdyYXBoRWxlbWVudCgpO1xuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdDb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmxpc3QtaXRlbScpO1xuICAgICAgICAvLyAgICAgICAgIGFjdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcGFyZW50QmxvY2sgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIC8vICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50QmxvY2submV4dFNpYmxpbmcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyZW50QmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Q29udGVudEVsZW1lbnQsIHBhcmVudEJsb2NrLm5leHRTaWJsaW5nKTtcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBlbGVtZW50IChwYXJhZ3JhcGggb3IgbGlzdCBpdGVtKSBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGFjY29yZGluZ2x5LlxuICAgICogVGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgcHJlc3NpbmcgJ0VudGVyJyBpbiBhbiBlZGl0YWJsZSBjb250ZW50IGFyZWEsIGZhY2lsaXRhdGluZyBkeW5hbWljIGNvbnRlbnQgY3JlYXRpb24gYW5kIG9yZ2FuaXphdGlvblxuICAgICogd2l0aGluIHRoZSBkb2N1bWVudC4gSXQgc3VwcG9ydHMgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMgaW5jbHVkaW5nIGNoZWNrbGlzdHMsIGJ1bGxldGVkIGxpc3RzLCBudW1iZXJlZCBsaXN0cywgYW5kIGdlbmVyYWwgdGV4dCBibG9ja3MuXG4gICAgKlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBleGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhdGggdGFrZW4uXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFR5cGljYWxseSBjYWxsZWQgd2l0aGluIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGtleXByZXNzIGV2ZW50c1xuICAgICogZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAqICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgKiAgICAgICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTtcbiAgICAqICAgICB9XG4gICAgKiB9KTtcbiAgICAqXG4gICAgKiBAZGVzY3JpcHRpb25cbiAgICAqIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyB1bmRlciBzZXZlcmFsIGNvbmRpdGlvbnMgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZTpcbiAgICAqIC0gRm9yIGxpc3QgaXRlbXMgKGNoZWNrbGlzdCwgYnVsbGV0ZWQsIGFuZCBudW1iZXJlZCk6XG4gICAgKiAgIDEuIEZpbmRzIHRoZSBjbG9zZXN0IGxpc3QgaXRlbSBhbmNlc3RvciBvZiB0aGUgYWN0aXZlIGVsZW1lbnQuXG4gICAgKiAgIDIuIElmIHRoZSBsaXN0IGl0ZW0gY29udGFpbnMgdGV4dCwgaXQgY2xvbmVzIHRoaXMgaXRlbSBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgY2xvbmUuXG4gICAgKiAgIDMuIElmIHRoZSBsaXN0IGl0ZW0gaXMgZW1wdHkgYW5kIGlzIHRoZSBvbmx5IGl0ZW0sIGl0IHJlbW92ZXMgdGhlIGVudGlyZSBibG9jayBhZnRlciBjcmVhdGluZyBhIG5ldyBwYXJhZ3JhcGguXG4gICAgKiAtIEZvciBvdGhlciBibG9ja3MgKGxpa2UgcGFyYWdyYXBocyk6XG4gICAgKiAgIDEuIENsb25lcyB0aGUgY3VycmVudCBibG9jayBhbmQgcmVhcnJhbmdlcyBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgbmV3IGNsb25lLlxuICAgICogICAyLiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgc3RhcnQgb2YgdGhlIG5ldyBlbGVtZW50IHRvIGNvbnRpbnVlIGVkaXRpbmcuXG4gICAgKlxuICAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgcmVtYWlucyBjb2hlcmVudCB3aGlsZSBwcm92aWRpbmcgYSBzZWFtbGVzcyB1c2VyIGV4cGVyaWVuY2UgaW4gdGV4dCBlZGl0aW5nIGVudmlyb25tZW50cy5cbiAgICAqL1xuICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gRE9NVXRpbHMuZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuVGFibGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gSnVtcCB0byB0aGUgbmV4dCBsaW5lIGlmIGV4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkNoZWNrTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkJ1bGxldGVkTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwibGlzdC1pdGVtXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgRE9NVXRpbHMuaGFzVGV4dENvbnRlbnQoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50Q2xvbmUgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5yZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdChjb250ZW50Q3VycmVudCwgY29udGVudENsb25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCbG9jayA9IGN1cnJlbnRJdGVtLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHBhcmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubGlzdC1pdGVtXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCBwYXJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld1BhcmFncmFwaCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcInBcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkQmxvY2sgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENsb25lID0gY2xvbmVkQmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY29udGVudEN1cnJlbnQsIGNvbnRlbnRDbG9uZSk7XG5cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgsIGNsb25lZEJsb2NrKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IChjbG9uZWRCbG9jayBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNhYmxlIGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cbiAgICBjcmVhdGVBTmV3UGFyYWdyYXBoRnJvbVRpdGxlKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLnRpdGxlIGgxXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNsb25lZFRpdGxlID0gRE9NVXRpbHMuY2xvbmVBbmRJbnNlcnRBZnRlcih0aXRsZSk7XG4gICAgICAgIGlmIChjbG9uZWRUaXRsZSkge1xuICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQodGl0bGUgYXMgTm9kZSwgY2xvbmVkVGl0bGUgYXMgTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CTE9DS19QQVJBR1JBUEgsIFwiXCIpO1xuICAgICAgICBjb25zdCBwID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gY2xvbmVkVGl0bGU/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnRcIik7XG5cbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHJlcGVuZChuZXdCbG9jayk7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3QmxvY2sgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXCIuZm9jdXNhYmxlXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmVkVGl0bGU/LnJlbW92ZSgpO1xuICAgIH1cblxuXG5cblxuXG4gICAgLy8gc3BsaXRDb250ZW50QXRDdXJzb3IoKTogdm9pZCB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcblxuICAgIC8vICAgICAvLyBDcmlhbmRvIHJhbmdlIHBhcmEgbyBjb250ZcO6ZG8gYW50ZXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgcmFuZ2VCZWZvcmUuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRhaW5lcik7XG4gICAgLy8gICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xuXG4gICAgLy8gICAgIC8vIENyaWFuZG8gcmFuZ2UgcGFyYSBvIGNvbnRlw7pkbyBkZXBvaXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQWZ0ZXIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhjb250YWluZXIpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcblxuICAgIC8vICAgICAvLyBFeGVtcGxvOiBJc29sYW5kbyBvIHRleHRvIGRlIGNhZGEgcGFydGVcbiAgICAvLyAgICAgY29uc3QgdGV4dEJlZm9yZSA9IHJhbmdlQmVmb3JlLnRvU3RyaW5nKCk7XG4gICAgLy8gICAgIGNvbnN0IHRleHRBZnRlciA9IHJhbmdlQWZ0ZXIudG9TdHJpbmcoKTtcblxuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gYW50ZXMgZG8gY3Vyc29yOicsIHRleHRCZWZvcmUpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gZGVwb2lzIGRvIGN1cnNvcjonLCB0ZXh0QWZ0ZXIpO1xuXG4gICAgLy8gICAgIC8vIEFxdWkgdm9jw6ogcG9kZSBtYW5pcHVsYXIgbyBET00gY29tbyBuZWNlc3PDoXJpbywgcG9yIGV4ZW1wbG86XG4gICAgLy8gICAgIC8vIGluc2VyaXIgbm92b3MgZWxlbWVudG9zLCBtb2RpZmljYXIgbyB0ZXh0bywgZXRjLlxuICAgIC8vIH1cblxuXG4gICAgY3JlYXRlRGVmYXVsdEJsb2NrKGV2ZW50UGFyYWdyYXBoOiBFbGVtZW50IHwgbnVsbCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCwgXCJcIik7XG5cbiAgICAgICAgaWYgKGV2ZW50UGFyYWdyYXBoICYmIGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpKSB7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gZXZlbnRQYXJhZ3JhcGguY2xvc2VzdCgnLmJsb2NrJykhO1xuICAgICAgICAgICAgc2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3QmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudFwiKSEuYXBwZW5kQ2hpbGQobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcignLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2gobmV3QmxvY2spO1xuXG4gICAgICAgIHJldHVybiBuZXdCbG9jaztcblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzYWJsZSk7XG4gICAgfVxuXG4gICAgZXhlY0ZvY3VzT25OZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgfHwgRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE7XG5cbiAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBleGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRBY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uUHJldmlvdXMoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQgPSBhY3R1YWxFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGlmICghcHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgJiYgcHJldmlvdXNFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IHByZXZpb3VzRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhFbmRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzW2ZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoIC0gMV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmV2aW91c0ZvY3VzYWJsZUVsZW1lbnQoYWN0dWFsRWxlbWVudDogRWxlbWVudCk6IEVsZW1lbnQgfCBudWxsIHtcblxuICAgICAgICBsZXQgdGFnID0gYWN0dWFsRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGxldCBmb2N1c2VkRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gJ0xJJykge1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKCFwcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpYmxpbmcgPSBwYXJlbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggLSAxXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uTmV4dChhY3R1YWxFbGVtZW50OiBFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFjdHVhbEVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknIC8qIGZvY3VzYWJsZSBTUEFOIGluc2lkZSBMSSovKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJ2xpJyk/Lm5leHRFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGdldE5leHRGb2N1c2FibGVFbGVtZW50KGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ubmV4dEVsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0RWxlbWVudCAmJiBuZXh0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBuZXh0RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuXG4gICAgLy8gICAgICAgICBsZXQgbGFzdENoaWxkID0gY29udGVudEJsb2NrO1xuXG4gICAgLy8gICAgICAgICB3aGlsZSAobGFzdENoaWxkLmxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAobGFzdENoaWxkLmxhc3RDaGlsZCkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Q2hpbGQsIGxhc3RDaGlsZC50ZXh0Q29udGVudCEubGVuZ3RoKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0sIDEwKTtcbiAgICAvLyB9XG5cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cblxuICAgIGp1c3RpZnlMZWZ0KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICB0aGlzLnJlbW92ZUp1c3RpZnkoYmxvY2spO1xuICAgICAgICBibG9jay5jbGFzc0xpc3QuYWRkKFwianVzdGlmeS1sZWZ0XCIpO1xuICAgIH1cblxuICAgIGp1c3RpZnlDZW50ZXIoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LWNlbnRlclwiKTtcbiAgICB9XG5cbiAgICBqdXN0aWZ5UmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LXJpZ2h0XCIpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlKGJsb2NrOiBIVE1MRWxlbWVudCwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjb2RlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcImNvZGVcIik7XG5cbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIERPTVV0aWxzLnJlbW92ZUNsYXNzZXNXaXRoUHJlZml4KGNvZGUgYXMgRWxlbWVudCwgXCJsYW5ndWFnZS1cIik7XG4gICAgICAgICAgICBjb2RlLmNsYXNzTGlzdC5hZGQoYGxhbmd1YWdlLSR7dmFsdWV9YCk7XG4gICAgICAgICAgICBjb2RlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaGlnaGxpZ2h0ZWRcIik7XG5cbiAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudChcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiLCBibG9jay5pZCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVKdXN0aWZ5KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChcImp1c3RpZnktXCIpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIGV4ZWNDaGFuZ2VDYWxsb3V0QmFja2dyb3VuZChibG9jazogSFRNTEVsZW1lbnQsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBjYWxsb3V0RGl2ID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0ID4gZGl2XCIpO1xuXG4gICAgICAgIGlmKGNhbGxvdXREaXYpe1xuICAgICAgICAgICAgRE9NVXRpbHMucmVtb3ZlQ2xhc3Nlc1dpdGhQcmVmaXgoY2FsbG91dERpdiBhcyBFbGVtZW50LCBcImNhbGxvdXQtYmFja2dyb3VuZC1cIik7XG4gICAgICAgICAgICBjYWxsb3V0RGl2LmNsYXNzTGlzdC5hZGQoY29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgSVRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuL0lUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5cbnR5cGUgVGFyZ2V0Tm9kZSA9IHtcbiAgICBub2RlVHlwZTogc3RyaW5nO1xuICAgIGNsYXNzZXM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBUZXh0T3BlcmF0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgICBwcml2YXRlIG1lbWVudG86IElNZW1lbnRvO1xuXG4gICAgdGV4dE9wZXJhdGlvblNlcnZpY2U6IGFueTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IobWVtZW50bzogSU1lbWVudG8pIHtcbiAgICAgICAgaWYgKFRleHRPcGVyYXRpb25zU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRleHRPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICAgICAgY29uc3QgbWVtZW50byA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJTWVtZW50bz4oXCJJTWVtZW50b1wiKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVGV4dE9wZXJhdGlvbnNTZXJ2aWNlKG1lbWVudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgZXhlY0luc2VydExpbmsodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY3JlYXRlTGlua1wiLCBmYWxzZSwgdXJsKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuTGluaywgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQW5jaG9ycygpO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVBbmNob3JzKCkge1xuICAgICAgICBjb25zdCBhbmNob3JzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudCBhXCIpO1xuXG4gICAgICAgIGFuY2hvcnMuZm9yRWFjaChhbmNob3IgPT4ge1xuICAgICAgICAgICAgaWYgKCFhbmNob3IuaGFzQXR0cmlidXRlKCd0aXRsZScpKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAoYW5jaG9yIGFzIEhUTUxBbmNob3JFbGVtZW50KS5ocmVmKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYW5jaG9yLm5vcm1hbGl6ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNUb2dnbGVMaW5rKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlBbmNob3JDb21tYW5kU3RhdGUoKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93RWxlbWVudEV2ZW50KFwibGlua0JveFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCd1bmxpbmsnLCBmYWxzZSk7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoXCJsaW5rQnV0dG9uXCIsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNCb2xkKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJib2xkXCIpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJib2xkXCIpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5Cb2xkLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkJvbGQsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNJbmxpbmVDb2RlKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy50b2dnbGVJbmxpbmVDb2RlKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5SW5saW5lQ29kZUNvbW1hbmRTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5JbmxpbmVDb2RlLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLklubGluZUNvZGUsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRvZ2dsZUlubGluZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcblxuICAgIC8vICAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ/LnRhZ05hbWUgPT09IFwiQ09ERVwiKSB7XG4gICAgLy8gICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlbGVjdGVkQ29udGVudC50ZXh0Q29udGVudCB8fCAnJyk7XG4gICAgLy8gICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIGNvbnN0IGNvZGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNvZGVcIik7XG4gICAgLy8gICAgICAgICBjb2RlRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RlZENvbnRlbnQpO1xuICAgIC8vICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjb2RlRWxlbWVudCk7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgLy8gICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gfVxuXG4gICAgdG9nZ2xlSW5saW5lQ29kZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgIGxldCBzZWxlY3RlZENvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBIVE1MU3BhbkVsZW1lbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcblxuICAgICAgICBsZXQgaXNDb2RlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zQ29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgY29udGFpbnNDb2RlLmFwcGVuZENoaWxkKHNlbGVjdGVkQ29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIGlmIChjb250YWluc0NvZGUucXVlcnlTZWxlY3RvcignY29kZScpKSB7XG4gICAgICAgICAgICBpc0NvZGUgPSB0cnVlO1xuICAgICAgICAgICAgY29udGFpbnNDb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvZGUnKS5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29kZS50ZXh0Q29udGVudCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgY29kZS5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQodGV4dE5vZGUsIGNvZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZENvbnRlbnQgPSBjb250YWluc0NvZGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50Q29kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICB3aGlsZSAocGFyZW50Q29kZSAmJiBwYXJlbnRDb2RlLm5vZGVOYW1lICE9PSBcIkNPREVcIiAmJiBwYXJlbnRDb2RlLm5vZGVOYW1lICE9PSBcIkJPRFlcIikge1xuICAgICAgICAgICAgcGFyZW50Q29kZSA9IHBhcmVudENvZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnRDb2RlICYmIHBhcmVudENvZGUubm9kZU5hbWUgPT09IFwiQ09ERVwiKSB7XG4gICAgICAgICAgICBpc0NvZGUgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJlbnRDb2RlLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgICAgICAgIHBhcmVudENvZGUucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKHRleHROb2RlLCBwYXJlbnRDb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgICAgICAgICAgY29kZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZWN0ZWRDb250ZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoY29kZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjb250YWluc0NvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IERPTVV0aWxzLmdldEFjdGl2ZUNvbnRlbnRFZGl0YWJsZSgpO1xuICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgICAgY29udGVudC5ub3JtYWxpemUoKTtcblxuICAgICAgICAgICAgRE9NVXRpbHMubWVyZ2VJbmxpbmVFbGVtZW50cyhjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGV4ZWNJdGFsaWMoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcIml0YWxpY1wiKSkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKFwiaXRhbGljXCIpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5JdGFsaWMsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuSXRhbGljLCBDb2xvcnMuSWNvbkRlZmF1bHRCbGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjU3RyaWtlVGhyb3VnaCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwic3RyaWtlVGhyb3VnaFwiKSkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKFwic3RyaWtlVGhyb3VnaFwiKSkge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuU3RyaWtldGhyb3VnaCwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoLCBDb2xvcnMuSWNvbkRlZmF1bHRCbGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjVW5kZXJsaW5lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwidW5kZXJsaW5lXCIpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJ1bmRlcmxpbmVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5VbmRlcmxpbmUsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5VbmRlcmxpbmUsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjSGlsaXRlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImhpbGl0ZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0ZvcmVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImZvcmVDb2xvclwiLCBmYWxzZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlBbmNob3JDb21tYW5kU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5VW5kZXJsaW5lQ29tbWFuZFN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5SGlsaXRlQ29sb3IodmFsdWUhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5Rm9yZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlSW5saW5lQ29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZCk7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBxdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgIC8vICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAvLyAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICAvLyBWZXJpZmljYSBzZSBhbGd1bSBuw7MgcGFpIMOpIHVtYSDDom5jb3JhXG4gICAgLy8gICAgIHdoaWxlIChub2RlKSB7XG4gICAgLy8gICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAvLyAgICAgICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnQScpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIHNlbGXDp8OjbyBlc3TDoSBkZW50cm8gZGUgdW1hIMOibmNvcmFcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xvc2VzdCgnYScpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gQSBzZWxlw6fDo28gZXN0w6EgZGVudHJvIGRlIGFsZ28gcXVlIGVzdMOhIGRlbnRybyBkZSB1bWEgw6JuY29yYVxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICAvLyBWZXJpZmljYSBzZSBhIHNlbGXDp8OjbyBjb250w6ltIHVtYSDDom5jb3JhIGNvbXBsZXRhXG4gICAgLy8gICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgLy8gICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20ocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIuY2hpbGROb2Rlcyk7XG4gICAgLy8gICAgICAgICBsZXQgc2VsZWN0ZWRBbmNob3I6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgLy8gICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIC8vICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKGNoaWxkIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lID09PSAnQScpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLmludGVyc2VjdHNOb2RlKGNoaWxkKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBbmNob3IgPSBjaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgaWYgKHNlbGVjdGVkQW5jaG9yICYmIHJhbmdlLnRvU3RyaW5nKCkgPT09IHNlbGVjdGVkQW5jaG9yLnRleHRDb250ZW50KSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIHNlbGXDp8OjbyDDqSBleGF0YW1lbnRlIG8gdGV4dG8gZGUgdW1hIMOibmNvcmFcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cblxuICAgIC8vT1JJR0lOQUxcbiAgICAvLyBwcml2YXRlIHF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgLy8gICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IG51bGwpIHtcbiAgICAvLyAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdhJykpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuXG4gICAgLy8gbXVsdGlwbGVzIGVsZW1lbnRzXG4gICAgcHJpdmF0ZSBxdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBjb25zdCBzdGFydENvbnRhaW5lciA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgICAgICBjb25zdCBlbmRDb250YWluZXIgPSByYW5nZS5lbmRDb250YWluZXI7XG5cbiAgICAgICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBub2RlIG9yIGl0cyBwYXJlbnRzIGFyZSBhbiA8YT4gZWxlbWVudFxuICAgICAgICBjb25zdCBpc05vZGVJbnNpZGVBbmNob3IgPSAobm9kZTogTm9kZSB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2EnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpcyB3aXRoaW4gYW4gPGE+IGVsZW1lbnRcbiAgICAgICAgaWYgKGlzTm9kZUluc2lkZUFuY2hvcihzdGFydENvbnRhaW5lcikgfHwgaXNOb2RlSW5zaWRlQW5jaG9yKGVuZENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgYWxsIGVsZW1lbnRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBpZiBuZWNlc3NhcnlcbiAgICAgICAgY29uc3Qgbm9kZXNJblJhbmdlID0gcmFuZ2UuY2xvbmVDb250ZW50cygpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcbiAgICAgICAgcmV0dXJuIG5vZGVzSW5SYW5nZS5sZW5ndGggPiAwO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBxdWVyeUlubGluZUNvZGVDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ2NvZGUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgcXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ3UnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBxdWVyeUZvcmVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvbnRDb2xvciA9IChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiZm9udFtjb2xvcl1cIik7XG4gICAgICAgIGlmICghZm9udENvbG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmb250Q29sb3IpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmNvbG9yO1xuXG4gICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpO1xuXG4gICAgICAgIHJldHVybiBoZXhDb2xvci50b1VwcGVyQ2FzZSgpID09PSBleHBlY3RlZENvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcXVlcnlIaWxpdGVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbldpdGhCYWNrZ3JvdW5kID1cbiAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwic3BhbltzdHlsZSo9J2JhY2tncm91bmQtY29sb3InXVwiKSB8fFxuICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJmb250W3N0eWxlKj0nYmFja2dyb3VuZC1jb2xvciddXCIpO1xuXG4gICAgICAgIGlmICghc3BhbldpdGhCYWNrZ3JvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuV2l0aEJhY2tncm91bmQpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4Q29sb3IudG9VcHBlckNhc2UoKSA9PT0gZXhwZWN0ZWRDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGdldFRhcmdldEVsZW1lbnRNYXAoY29tbWFuZDogc3RyaW5nKToga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJib2xkXCI6XG4gICAgICAgICAgICBjYXNlIFwiYlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAnc3Ryb25nJztcblxuICAgICAgICAgICAgY2FzZSBcIml0YWxpY1wiOlxuICAgICAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJlbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImVtXCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJ1bmRlcmxpbmVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidVwiO1xuXG4gICAgICAgICAgICBjYXNlIFwic3RyaWtldGhyb3VnaFwiOlxuICAgICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3MnO1xuXG4gICAgICAgICAgICBjYXNlIFwiYmFja2dyb3VuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcInNwYW5cIjtcblxuICAgICAgICAgICAgY2FzZSBcImNvbG9yXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNlbGVjdGVkSFRNTEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cbiAgICBnZXRTZWxlY3RlZFRleHROb2RlcygpOiBOb2RlW10ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0Tm9kZXM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uLnJhbmdlQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJdGVyYXRvciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihcbiAgICAgICAgICAgICAgICByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdE5vZGUobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLmludGVyc2VjdHNOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9SRUpFQ1Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICBub2RlUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5FTkRfVE9fU1RBUlQsIG5vZGVSYW5nZSkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBub2RlUmFuZ2UpID09PSAxXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dE5vZGVzO1xuICAgIH1cblxuICAgIGZpbmRDbG9zZXN0TWF0Y2hpbmdQYXJlbnQoZWxlbWVudDogTm9kZSB8IG51bGwsIHRhcmdldDogVGFyZ2V0Tm9kZSk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudCBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFyZ2V0Lm5vZGVUeXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuY2xhc3NlcyB8fCB0YXJnZXQuY2xhc3Nlcy5ldmVyeShjbHMgPT4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBleHRyYWN0U2VsZWN0ZWRUZXh0KHRleHROb2RlOiBOb2RlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cbiAgICAgICAgaWYgKHRleHROb2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRleHROb2RlLnRleHRDb250ZW50IHx8IFwiXCI7XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgICBpZiAoIXJhbmdlLmludGVyc2VjdHNOb2RlKHRleHROb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IHRleHROb2RlKSB7XG4gICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLmNvbnRhaW5zKHRleHROb2RlKSkge1xuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhbmdlLmVuZENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIGVuZCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5lbmRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBlbmQgPSB0ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgSU1lbWVudG8gfSBmcm9tIFwiQC9jb3JlL0lNZW1lbnRvXCI7XG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCIuL1RhYmxlU2NvcGVzXCI7XG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCJAL2NvbW1vbi9ET01FbGVtZW50c1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcbmltcG9ydCB7IFRvb2xiYXJJRHMgfSBmcm9tIFwiQC9jb3JlL1Rvb2xiYXJJRHNcIjtcblxuZXhwb3J0IGNsYXNzIFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBJVGFibGVPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGFibGVPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjayxcbiAgICAgICAgbWVtZW50bzogSU1lbWVudG8pIHtcbiAgICAgICAgaWYgKFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XG4gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87XG4gICAgfVxuXG4gICAgaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ29sdW1uKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcblxuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgVGFibGVVdGlscy5yZW1vdmVDb2x1bW5CeUNlbGwoY2VsbCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICB9XG5cbiAgICByZW1vdmVSb3coKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcblxuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgVGFibGVVdGlscy5yZW1vdmVSb3dCeUNlbGwoY2VsbCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICB9XG5cblxuICAgIGV4ZWNDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XG5cbiAgICAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYWN0aXZlQ2VsbC5jbG9zZXN0KCd0YWJsZScpITtcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnNlbGVjdGVkJyk7XG5cbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY2VsbCBub3QgZm91bmRcIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgc3RhdGljIGlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgdGFyZ2V0SGV4Q29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWNlbGwgfHwgY2VsbC50YWdOYW1lICE9PSAnVEQnIHx8ICFjZWxsLmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcblxuICAgICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHRhcmdldEhleENvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xuXG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmFja2dyb3VuZENvbG9yID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhleEJhY2tncm91bmRDb2xvciA9IFV0aWxzLnJnYlRvSGV4KGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IpO1xuXG4gICAgICAgICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gY29uc3QgYSA9IERPTVV0aWxzLlxuXG4gICAgICAgIC8vICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgLy8gRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XG5cbiAgICAgICAgLy8gY29uc3QgYWN0aXZlQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XG5cbiAgICAgICAgLy8gaWYgKGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlID0gYWN0aXZlQ2VsbC5jbG9zZXN0KCd0YWJsZScpITtcblxuICAgICAgICAvLyAgICAgY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnNlbGVjdGVkJyk7XG5cbiAgICAgICAgLy8gICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgLy8gICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuXG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmVycm9yKFwiY2VsbCBub3QgZm91bmRcIik7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBxdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcihlbGVtZW50czogSFRNTFRhYmxlQ2VsbEVsZW1lbnRbXSwgY29sb3I6IENvbG9ycyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGxldCBpczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNvbG9yID09IENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JOb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGNlbGwgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpO1xuICAgICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoaGV4Q29sb3IgIT09IGNvbG9yLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBpcyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXM7XG4gICAgfVxuXG5cbiAgICAvLyBleGVjSGlsaXRlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgIC8vICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJoaWxpdGVDb2xvclwiLCBmYWxzZSwgdmFsdWUpKSB7XG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcbiAgICAvLyAgICAgfWVsc2V7XG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgdmFsdWUsIFwiaGlkZVwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlKGZvY3VzU3RhY2ssIG1lbWVudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zZXJ0Um93QWJvdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTsgLy8gQWdvcmEsIGBjZWxsYCDDqSBhIGB0ZGAgZGlyZXRhbWVudGVcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gY2VsbC5wYXJlbnRFbGVtZW50OyAvLyBPYnRlbSBhIGxpbmhhIChgdHJgKSBwYWkgZGEgY8OpbHVsYVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIHJvdyBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSByb3cuY2xvc2VzdChcInRhYmxlXCIpOyAvLyBFbmNvbnRyYSBhIHRhYmVsYSBxdWUgY29udMOpbSBhIGxpbmhhXG4gICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKSB8fCB0YWJsZTsgLy8gQXNzdW1lIHRhYmxlIHNlIHRib2R5IG7Do28gZXhpc3RpclxuICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGJvZHkuY2hpbGRyZW4pLmluZGV4T2Yocm93KTsgLy8gRW5jb250cmEgbyDDrW5kaWNlIGRhIGxpbmhhIGRlbnRybyBkbyB0Ym9keSBvdSBkYSB0YWJlbGFcblxuICAgICAgICBpZiAocm93SW5kZXggPCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUm93IGluZGV4IG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIFRhYmxlVXRpbHMuYWRkUm93KHRhYmxlLCByb3dJbmRleCk7IC8vIEluc2VyZSB1bWEgbm92YSBsaW5oYSBubyDDrW5kaWNlIGVuY29udHJhZG9cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XG4gICAgfVxuXG4gICAgaW5zZXJ0Um93QmVsb3coYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRyOmxhc3QtY2hpbGRcIik7XG4gICAgICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGFibGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmluZGV4T2Yocm93KSArIDE7XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkUm93KHRhYmxlLCByb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIHJvd3MgaW4gdGhlIHRhYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGFibGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmluZGV4T2Yocm93KSArIDE7XG4gICAgICAgICAgICAgICAgVGFibGVVdGlscy5hZGRSb3codGFibGUsIHJvd0luZGV4KTtcblxuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpbnNlcnRDb2x1bW4oZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKTogdm9pZCB7XG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTsgIC8vIFNhbHZhIG8gZXN0YWRvIGF0dWFsIHBhcmEgcG9zc8OtdmVsIGRlc2ZhemltZW50b1xuXG4gICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpOyAgLy8gUGVnYSBvIGVsZW1lbnRvIGF0dWFsbWVudGUgZm9jYWRvXG4gICAgLy8gICAgIGlmICghZWxlbWVudCkge1xuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGZvY3VzZWQgZWxlbWVudCBhdmFpbGFibGVcIik7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7ICAvLyBFbmNvbnRyYSBhIGPDqWx1bGEgZm9jYWRhIGRlbnRybyBkYSB0YWJlbGFcbiAgICAvLyAgICAgaWYgKCFjZWxsKSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTsgIC8vIEVuY29udHJhIGEgdGFiZWxhIGNvbnRlbmRvIGEgY8OpbHVsYVxuICAgIC8vICAgICBpZiAoIXRhYmxlKSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpOyAgLy8gRGV0ZXJtaW5hIG8gw61uZGljZSBkYSBjb2x1bmEgYXR1YWxcbiAgICAvLyAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgLy8gICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXgpOyAgLy8gQWRpY2lvbmEgY29sdW5hIMOgIGVzcXVlcmRhXG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXggKyAxKTsgIC8vIEFkaWNpb25hIGNvbHVuYSDDoCBkaXJlaXRhXG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBpbnNlcnRDb2x1bW5MZWZ0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGZvY3VzZWQgZWxlbWVudCBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7XG4gICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gQXJyYXkuZnJvbShjZWxsLnBhcmVudEVsZW1lbnQhLmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpO1xuICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuXG4gICAgfVxuXG4gICAgaW5zZXJ0Q29sdW1uUmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGZvY3VzZWQgZWxlbWVudCBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7XG4gICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihjZWxsKTtcbiAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCArIDEpO1xuXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3dJbnNlcnRMaW5lRWxlbWVudChibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLXJvd1wiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaW5zZXJ0TGluZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgfVxuXG4gICAgc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1jb2x1bW5cIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuICAgIH1cblxuICAgIGhpZGVJbnNlcnRSb3dFbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtcm93XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIH1cblxuICAgIGhpZGVJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtY29sdW1uXCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIH1cblxuICAgIC8vIGlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIHJldHVybiBUYWJsZVV0aWxzLmlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZSk7XG4gICAgLy8gfVxuXG4gICAgLy8gZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCA9IChzY29wZTogVGFibGVTY29wZXMsIGNvbG9yOiBDb2xvcnMpOiB2b2lkID0+IHtcbiAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ29tbWFuZHMuLCB7XG4gICAgLy8gICAgICAgICBkZXRhaWw6IHsgc2NvcGU6IHNjb3BlIH1cbiAgICAvLyAgICAgfSk7XG5cbiAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgLy8gfVxuXG5cbiAgICBjaGFuZ2VUYWJsZUJvcmRlckNvbG9yKHNjb3BlOiBUYWJsZVNjb3BlcywgY29sb3I6IENvbG9ycyk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSk7XG5cbiAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICBUYWJsZVV0aWxzLmNoYW5nZUNlbGxCb3JkZXJDb2xvcih0YWJsZSwgc2NvcGUsIGNvbG9yKVxuICAgICAgICB9XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQ29tbW9uQ2xhc3NlcyB9IGZyb20gXCJAL2NvbW1vbi9Db21tb25DbGFzc2VzXCI7XHJcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIi4vSU1lbWVudG9cIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlcnk6IHN0cmluZyA9IFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50LXdyYXBwZXJcIjtcclxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogTWVtZW50bztcclxuXHJcbiAgcHJpdmF0ZSB1bmRvU3RhY2s6IHsgaHRtbDogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIsIHZlcnRpY2FsUG9zOiBudW1iZXIgfSB9W10gPSBbXTtcclxuICBwcml2YXRlIHJlZG9TdGFjazogeyBodG1sOiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9IH1bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGdldCBjb250ZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1lbWVudG8ucXVlcnkpITtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAoTWVtZW50by5pbnN0YW5jZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgTWVtZW50by5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHNhdmVTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2FyZXRQb3NpdGlvbiA9IERPTVV0aWxzLnNhdmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50KTtcclxuXHJcbiAgICAgICAgY2xvbmUucXVlcnlTZWxlY3RvckFsbChgLiR7Q29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5fWApLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpO1xyXG5cclxuICAgICAgICB0aGlzLnVuZG9TdGFjay5wdXNoKHsgaHRtbDogY2xvbmUuaW5uZXJIVE1MLCBjYXJldFBvc2l0aW9uIH0pO1xyXG4gICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XHJcbiAgICAgIH0sIDEwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5kbygpIHtcclxuICAgIGlmICh0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2goeyBodG1sOiB0aGlzLmNvbnRlbnQuaW5uZXJIVE1MLCBjYXJldFBvc2l0aW9uOiBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCkgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVRvUmVzdG9yZSA9IHRoaXMudW5kb1N0YWNrLnBvcCgpO1xyXG4gICAgICBpZiAoc3RhdGVUb1Jlc3RvcmUpIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnQuaW5uZXJIVE1MID0gc3RhdGVUb1Jlc3RvcmUuaHRtbDtcclxuICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCwgc3RhdGVUb1Jlc3RvcmUuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVkbygpIHtcclxuICAgIGlmICh0aGlzLnJlZG9TdGFjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudW5kb1N0YWNrLnB1c2goeyBodG1sOiB0aGlzLmNvbnRlbnQuaW5uZXJIVE1MLCBjYXJldFBvc2l0aW9uOiBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCkgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVRvQXBwbHkgPSB0aGlzLnJlZG9TdGFjay5wb3AoKTtcclxuICAgICAgaWYgKHN0YXRlVG9BcHBseSkge1xyXG4gICAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvQXBwbHkuaHRtbDtcclxuICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCwgc3RhdGVUb0FwcGx5LmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdHRhY2hFdmVudHMoKSB7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAneicpIHtcclxuICAgICAgICB0aGlzLnVuZG8oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAneScpIHtcclxuICAgICAgICB0aGlzLnJlZG8oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgLy8gICBjb25zdCBpbnB1dEV2ZW50ID0gZXZlbnQgYXMgSW5wdXRFdmVudDtcclxuICAgIC8vICAgaWYgKCFpbnB1dEV2ZW50LmlzQ29tcG9zaW5nICYmICFpbnB1dEV2ZW50LmlucHV0VHlwZS5zdGFydHNXaXRoKFwiZGVsZXRlXCIpKSB7XHJcbiAgICAvLyAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZXIpO1xyXG4gICAgLy8gICAgIHRoaXMuZGVib3VuY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XHJcbiAgICAvLyAgICAgfSwgdGhpcy5kZWJvdW5jZURlbGF5KTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcblxyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuU3BhY2UpIHtcclxuICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTWVtZW50byB7XHJcbiAgICBpZiAoIU1lbWVudG8uaW5zdGFuY2UpIHtcclxuICAgICAgTWVtZW50by5pbnN0YW5jZSA9IG5ldyBNZW1lbnRvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE1lbWVudG8uaW5zdGFuY2U7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBJRWRpdGFibGVOYXZpZ2F0aW9uIH0gZnJvbSBcIi4vSUVkaXRhYmxlTmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XG5pbXBvcnQgeyBCb3VuZGFyaWVzIH0gZnJvbSBcIkAvY29tbW9uL0JvdW5kYXJpZXNcIjtcbmltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVGFibGVVdGlsc1wiO1xuaW1wb3J0IHsgSVF1aWNrTWVudSB9IGZyb20gXCJAL2NvbXBvbmVudHMvcXVpY2stbWVudS9JUXVpY2tNZW51XCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIi4vRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyBrZXlib2FyZCBldmVudHMgdG8gbmF2aWdhdGUgYmV0d2VlbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMgdXNpbmcgYXJyb3cga2V5cyxcbiAqIGFuZCBlbnN1cmVzIGZvY3VzIG1hbmFnZW1lbnQgYW5kIGNhcmV0IHBsYWNlbWVudCB3aXRoaW4gdGhlc2UgZWxlbWVudHMuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBgSUVkaXRhYmxlTmF2aWdhdGlvbmAgaW50ZXJmYWNlIGFuZCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFuYWdlIGl0cyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRhYmxlTmF2aWdhdGlvbiBpbXBsZW1lbnRzIElFZGl0YWJsZU5hdmlnYXRpb24ge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVkaXRhYmxlTmF2aWdhdGlvbjtcblxuICAgIHF1aWNrTWVudTogSVF1aWNrTWVudTtcblxuICAgIC8qKlxuICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBleHRlcm5hbCBpbnN0YW50aWF0aW9uLlxuICAgICAqIEl0IGJpbmRzIHRoZSBgaGFuZGxlQXJyb3dLZXlzYCBtZXRob2QgdG8ga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHF1aWNrTWVudTogSVF1aWNrTWVudSkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVBcnJvd0tleXMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5xdWlja01lbnUgPSBxdWlja01lbnU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWN0cyBhcyBhIHRyaWdnZXIgd2l0aGluIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbiBjb250YWluZXIgdG8gZW5zdXJlIGluc3RhbnRpYXRpb24gb2YgdGhpcyBzaW5nbGV0b24gY2xhc3MuXG4gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBhbnkgb3BlcmF0aW9ucyBpdHNlbGYgYnV0IGVuc3VyZXMgdGhhdCBhbiBpbnN0YW5jZSBvZiBFZGl0YWJsZU5hdmlnYXRpb25cbiAgICAgKiBpcyBjcmVhdGVkIGFuZCByZWFkeSB0byBsaXN0ZW4gdG8ga2V5Ym9hcmQgZXZlbnRzLiBUaGlzIGlzIGNydWNpYWwgZm9yIHNldHRpbmcgdXAgdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIHRoYXQgbWFuYWdlIG5hdmlnYXRpb24gd2l0aGluIGVkaXRhYmxlIGNvbnRlbnQgYXJlYXMsIGFzIGl0IHRyaWdnZXJzIHRoZSBuZWNlc3NhcnkgYmluZGluZ3MgdXBvbiBpbnN0YW50aWF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJFZGl0YWJsZU5hdmlnYXRpb24gaXMgbm93IGxpc3RlbmluZyBmb3Iga2V5IGV2ZW50cy5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVkaXRhYmxlTmF2aWdhdGlvbiBjbGFzcy5cbiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm5zIHtFZGl0YWJsZU5hdmlnYXRpb259IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVkaXRhYmxlTmF2aWdhdGlvbiBjbGFzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEVkaXRhYmxlTmF2aWdhdGlvbiB7XG5cbiAgICAgICAgaWYgKCFFZGl0YWJsZU5hdmlnYXRpb24uaW5zdGFuY2UpIHtcblxuICAgICAgICAgICAgY29uc3QgcXVpY2tNZW51ID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElRdWlja01lbnU+KFwiSVF1aWNrTWVudVwiKTtcblxuICAgICAgICAgICAgRWRpdGFibGVOYXZpZ2F0aW9uLmluc3RhbmNlID0gbmV3IEVkaXRhYmxlTmF2aWdhdGlvbihxdWlja01lbnUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZGl0YWJsZU5hdmlnYXRpb24uaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleXMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcblxuICAgICAgICBpZiAoIXRoaXMucXVpY2tNZW51LmlzVmlzaWJsZSAmJiBldmVudC5rZXkuc3RhcnRzV2l0aCgnQXJyb3cnKSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5tZXRhS2V5KSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0YWJsZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50RWRpdGFibGUgJiYgY3VycmVudEVkaXRhYmxlLmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkU3dpdGNoRWRpdGFibGUoY3VycmVudEVkaXRhYmxlLCBldmVudC5rZXkgYXMgRGlyZWN0aW9ucykpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWRpdGFibGUgPSB0aGlzLmZpbmROZXh0RWRpdGFibGUoY3VycmVudEVkaXRhYmxlLCBldmVudC5rZXkgYXMgRGlyZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RWRpdGFibGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dVcCB8fCBldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbihjdXJyZW50RWRpdGFibGUsIG5leHRFZGl0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQobmV4dEVkaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93UmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChuZXh0RWRpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lcyBpZiBuYXZpZ2F0aW9uIHNob3VsZCBzd2l0Y2ggZnJvbSB0aGUgY3VycmVudCBlZGl0YWJsZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBhcnJvdyBkaXJlY3Rpb24gYW5kIGNhcmV0IHBvc2l0aW9uLlxuICAgICogSXQgY2hlY2tzIGlmIHRoZSBjYXJldCBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBjb250ZW50IGFuZCBldmFsdWF0ZXMgYm91bmRhcnkgY29uZGl0aW9ucyBmb3IgdmVydGljYWwgbmF2aWdhdGlvbi5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBjdXJyZW50IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGJlaW5nIGV2YWx1YXRlZC5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIG5hdmlnYXRpb24gZGlyZWN0aW9uIGluZGljYXRlZCBieSB0aGUgYXJyb3cga2V5IHByZXNzLlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgbmF2aWdhdGlvbiBzaG91bGQgbW92ZSB0byBhbm90aGVyIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIHByaXZhdGUgc2hvdWxkU3dpdGNoRWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGRpcmVjdGlvbjogRGlyZWN0aW9ucyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gSWYgaGFzIHNlbGVjdGlvbiBpZ25vcmUgbmF2aWdhdGlvbiBcbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVuZE9mZnNldCAhPSByYW5nZS5zdGFydE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB7IGF0U3RhcnQsIGF0RW5kIH0gPSBET01VdGlscy5nZXRTZWxlY3Rpb25UZXh0SW5mbyhlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRGaXJzdExpbmUgPSB0aGlzLmlzQXRMaW5lQm91bmRhcnkoZWxlbWVudCwgQm91bmRhcmllcy5GaXJzdCk7XG4gICAgICAgICAgICBjb25zdCBpc0F0TGFzdExpbmUgPSB0aGlzLmlzQXRMaW5lQm91bmRhcnkoZWxlbWVudCwgQm91bmRhcmllcy5MYXN0KTtcblxuICAgICAgICAgICAgaWYgKChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dMZWZ0ICYmIGF0U3RhcnQpIHx8IChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dSaWdodCAmJiBhdEVuZCkgfHxcbiAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93VXAgJiYgKGF0U3RhcnQgfHwgaXNBdEZpcnN0TGluZSkpIHx8XG4gICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24gJiYgKGF0RW5kIHx8IGlzQXRMYXN0TGluZSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQXRMaW5lQm91bmRhcnkoZWxlbWVudDogSFRNTEVsZW1lbnQsIGJvdW5kYXJ5OiBCb3VuZGFyaWVzKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3QgaGFzVGV4dENvbnRlbnQgPSBlbGVtZW50LnRleHRDb250ZW50Py50cmltKCkgIT09IFwiXCI7XG5cbiAgICAgICAgaWYgKCFoYXNUZXh0Q29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldENsaWVudFJlY3RzKClbMF07XG5cbiAgICAgICAgaWYgKCFyZWN0KSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IDExO1xuXG4gICAgICAgIGlmIChib3VuZGFyeSA9PT0gQm91bmRhcmllcy5GaXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHJlY3QudG9wIC0gZWxlbWVudFJlY3QudG9wKSA8IHRvbGVyYW5jZTtcbiAgICAgICAgfSBlbHNlIGlmIChib3VuZGFyeSA9PT0gQm91bmRhcmllcy5MYXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocmVjdC5ib3R0b20gLSBlbGVtZW50UmVjdC5ib3R0b20pIDwgdG9sZXJhbmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogTG9jYXRlcyB0aGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gZGlyZWN0aW9uLlxuICAgICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgYm90aCBob3Jpem9udGFsIChsZWZ0L3JpZ2h0KSBhbmQgdmVydGljYWwgKHVwL2Rvd24pIGRpcmVjdGlvbnMgYW5kIGhhbmRsZXMgdGFibGUgY2VsbCBib3VuZGFyaWVzLlxuICAgICogXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjdXJyZW50IC0gVGhlIGN1cnJlbnQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgdGhlIGFycm93IGtleSBuYXZpZ2F0aW9uLlxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gVGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgaW4gdGhlIGRlc2lyZWQgZGlyZWN0aW9uIG9yIG51bGwgaWYgbm8gc3VpdGFibGUgZWxlbWVudCBpcyBmb3VuZC5cbiAgICAqL1xuICAgIHByaXZhdGUgZmluZE5leHRFZGl0YWJsZShjdXJyZW50OiBIVE1MRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgYWxsRWRpdGFibGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBhbGxFZGl0YWJsZXMuaW5kZXhPZihjdXJyZW50KTtcblxuICAgICAgICAvLyBUaGUgdGFibGUgbmF2aWdhdGlvbiBiZWhhdmlvciBpcyBhIGxpdHRsZSBkaWZmZXJlbnRcbiAgICAgICAgaWYgKGN1cnJlbnQuY2xvc2VzdChcInRkXCIpKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGN1cnJlbnQuY2xvc2VzdChcInRhYmxlXCIpO1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGN1cnJlbnQuY2xvc2VzdChcInRkXCIpO1xuICAgICAgICAgICAgaWYgKHRhYmxlICYmIGNlbGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWlnaGJvckNlbGwgPSBUYWJsZVV0aWxzLmdldE5laWdoYm9yQ2VsbCh0YWJsZSwgY2VsbCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAobmVpZ2hib3JDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZWlnaGJvckNlbGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5leHRJbmRleCA9IC0xO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93TGVmdCB8fCBkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dSaWdodCkge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93TGVmdCA/IGN1cnJlbnRJbmRleCAtIDEgOiBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gdGhpcy5maW5kVmVydGljYWxFZGl0YWJsZUluZGV4KGN1cnJlbnQsIGFsbEVkaXRhYmxlcywgZGlyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCAwIHx8IG5leHRJbmRleCA+PSBhbGxFZGl0YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGxFZGl0YWJsZXNbbmV4dEluZGV4XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogRmluZHMgdGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgaW4gYSB2ZXJ0aWNhbCBkaXJlY3Rpb24gKHVwIG9yIGRvd24pIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgKiBJdCBjYWxjdWxhdGVzIHRoZSBjbG9zZXN0IGVkaXRhYmxlIGVsZW1lbnQgYmFzZWQgb24gdmVydGljYWwgZGlzdGFuY2UgYW5kIG1pbmltYWwgaG9yaXpvbnRhbCBzaGlmdCwgZmF2b3JpbmcgZWxlbWVudHMgZGlyZWN0bHkgYWJvdmUgb3IgYmVsb3cuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudGx5IGZvY3VzZWQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGFsbEVkaXRhYmxlcyAtIEFuIGFycmF5IG9mIGFsbCBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgbmF2aWdhdGlvbiwgZWl0aGVyIHVwIG9yIGRvd24uXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgdmVydGljYWwgZWRpdGFibGUgZWxlbWVudCBvciB0aGUgY3VycmVudCBpbmRleCBpZiBub25lIGFyZSBjbG9zZXIuXG4gICAgKi9cbiAgICAvLyBwcml2YXRlIGZpbmRWZXJ0aWNhbEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBhbGxFZGl0YWJsZXM6IEhUTUxFbGVtZW50W10sIGRpcmVjdGlvbjogRGlyZWN0aW9ucyk6IG51bWJlciB7XG4gICAgLy8gICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgIC8vICAgICBjb25zdCBjdXJyZW50UmVjdCA9IGN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGxldCBjbG9zZXN0SW5kZXggPSAtMTtcbiAgICAvLyAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXG4gICAgLy8gICAgIGFsbEVkaXRhYmxlcy5mb3JFYWNoKChlZGl0YWJsZSwgaW5kZXgpID0+IHtcbiAgICAvLyAgICAgICAgIGlmIChlZGl0YWJsZSAhPT0gY3VycmVudCkge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlZGl0YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3RhbmNlID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93VXAgPyBjdXJyZW50UmVjdC50b3AgLSByZWN0LmJvdHRvbSA6IHJlY3QudG9wIC0gY3VycmVudFJlY3QuYm90dG9tO1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKGN1cnJlbnRSZWN0LmxlZnQgLSByZWN0LmxlZnQpO1xuXG4gICAgLy8gICAgICAgICAgICAgaWYgKHZlcnRpY2FsRGlzdGFuY2UgPiAwICYmICh2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlO1xuICAgIC8vICAgICAgICAgICAgICAgICBjbG9zZXN0SW5kZXggPSBpbmRleDtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuXG4gICAgLy8gICAgIHJldHVybiBjbG9zZXN0SW5kZXggPT09IC0xID8gY3VycmVudEluZGV4IDogY2xvc2VzdEluZGV4O1xuICAgIC8vIH1cbiAgICBwcml2YXRlIGZpbmRWZXJ0aWNhbEVkaXRhYmxlSW5kZXgoY3VycmVudDogSFRNTEVsZW1lbnQsIGFsbEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gYWxsRWRpdGFibGVzLmluZGV4T2YoY3VycmVudCk7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCkge1xuICAgICAgICAgICAgbmV4dEluZGV4LS07XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93RG93bikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgaWYgKG5leHRJbmRleCA+PSAwICYmIG5leHRJbmRleCA8IGFsbEVkaXRhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUGxhY2VzIHRoZSBjYXJldCBpbiBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgbmV4dCBlbGVtZW50IHRoYXQgY2xvc2VseSBtYXRjaGVzIGl0cyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBtb3ZpbmcgZm9jdXMgYmV0d2VlbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZS5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY3VycmVudCAtIFRoZSBjdXJyZW50IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHdoZXJlIHRoZSBjYXJldCBpcyBsb2NhdGVkLlxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmV4dCAtIFRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBjYXJldCB3aWxsIG1vdmUuXG4gICAgKi9cbiAgICBwcml2YXRlIHBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbihjdXJyZW50OiBIVE1MRWxlbWVudCwgbmV4dDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gY3VycmVudFJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobmV4dCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgIGxldCBiZXN0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XG4gICAgICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgIGlmIChiZXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlIHx8ICFub2RlLm5vZGVWYWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC5sZWZ0IC0gcmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKTtcblxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobmV4dCk7XG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSIsImltcG9ydCAnLi9hc3NldHMvY3NzL21haW4uY3NzJztcclxuaW1wb3J0IHsgVUlCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVycy9VSUJ1aWxkZXInO1xyXG5pbXBvcnQgeyBDb21tYW5kRGlzcGF0Y2hlciB9IGZyb20gJy4vY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXInO1xyXG5pbXBvcnQgeyBTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gJy4vY29yZS9TaG9ydGN1dExpc3RlbmVycyc7XHJcbmltcG9ydCB7IFRhYmxlTGlzdGVuZXJzIH0gZnJvbSAnLi9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycyc7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudSc7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tICcuL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEZvY3VzU3RhY2sgfSBmcm9tICcuL2NvcmUvRm9jdXNTdGFjayc7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZSc7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gJy4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcic7XHJcbmltcG9ydCB7IE1lbWVudG8gfSBmcm9tICcuL2NvcmUvTWVtZW50byc7XHJcbmltcG9ydCB7IEVkaXRhYmxlTmF2aWdhdGlvbiB9IGZyb20gJy4vY29yZS9FZGl0YWJsZU5hdmlnYXRpb24nO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9CbG9ja1Rvb2xib3gnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgc2NyaXB0IGluaXRpYWxpemVzIHRoZSBlZGl0b3IgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIG9uY2UgdGhlIERPTSBjb250ZW50IGhhcyBmdWxseSBsb2FkZWQuXHJcbiAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIHN0YXJ0aW5nIHRoZSBldmVudCBsaXN0ZW5pbmcgcHJvY2VzcyB0byBoYW5kbGUgY29tbWFuZHMuXHJcbiAqXHJcbiAqIFRoZSBgRE9NQ29udGVudExvYWRlZGAgZXZlbnQgZW5zdXJlcyB0aGF0IGFsbCB0aGUgRE9NIGNvbnRlbnQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkIGFuZCBsb2FkZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBiZWdpbnMuXHJcbiAqIGBVSUJ1aWxkZXIuYnVpbGQoKS5zdGFydCgpO2AgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYW5kIGFjdGl2YXRlIHRoZSB1c2VyIGludGVyZmFjZS5cclxuICogYENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCkubGlzdGVuKCk7YCByZXRyaWV2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbW1hbmREaXNwYXRjaGVyIGFuZCBzdGFydHMgbGlzdGVuaW5nIGZvciBldmVudHMuXHJcbiAqL1xyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJTWVtZW50b1wiLCAoKSA9PiBNZW1lbnRvLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklTaG9ydGN1dExpc3RlbmVyc1wiLCAoKSA9PiBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGFibGVMaXN0ZW5lcnNcIiwgKCkgPT4gVGFibGVMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklGb2N1c1N0YWNrXCIsICgpID0+IEZvY3VzU3RhY2suZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiLCAoKSA9PiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRleHRPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBUZXh0T3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIiwgKCkgPT4gVGFibGVPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIC8vVXNlckludGVyZmFjZVxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklRdWlja01lbnVcIiwgKCkgPT4gUXVpY2tNZW51LmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIiwgKCkgPT4gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklFZGl0YWJsZU5hdmlnYXRpb25cIiwgKCkgPT4gRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7XHJcblxyXG4gICAgQ29tbWFuZERpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5saXN0ZW4oKTtcclxuICAgIEVkaXRhYmxlTmF2aWdhdGlvbi5nZXRJbnN0YW5jZSgpLmxpc3RlbigpO1xyXG4gICAgQmxvY2tUb29sYm94LmdldEluc3RhbmNlKCkubGlzdGVuKCk7XHJcblxyXG59KTsiXSwibmFtZXMiOlsiX19fQ1NTX0xPQURFUl9FWFBPUlRfX18iLCJwdXNoIiwibW9kdWxlIiwiaWQiLCJleHBvcnRzIiwiY3NzV2l0aE1hcHBpbmdUb1N0cmluZyIsImxpc3QiLCJ0b1N0cmluZyIsInRoaXMiLCJtYXAiLCJpdGVtIiwiY29udGVudCIsIm5lZWRMYXllciIsImNvbmNhdCIsImxlbmd0aCIsImpvaW4iLCJpIiwibW9kdWxlcyIsIm1lZGlhIiwiZGVkdXBlIiwic3VwcG9ydHMiLCJsYXllciIsInVuZGVmaW5lZCIsImFscmVhZHlJbXBvcnRlZE1vZHVsZXMiLCJrIiwiX2siLCJjc3NNYXBwaW5nIiwiYnRvYSIsImJhc2U2NCIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImRhdGEiLCJzb3VyY2VNYXBwaW5nIiwic3R5bGVzSW5ET00iLCJnZXRJbmRleEJ5SWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJyZXN1bHQiLCJtb2R1bGVzVG9Eb20iLCJvcHRpb25zIiwiaWRDb3VudE1hcCIsImlkZW50aWZpZXJzIiwiYmFzZSIsImNvdW50IiwiaW5kZXhCeUlkZW50aWZpZXIiLCJvYmoiLCJjc3MiLCJzb3VyY2VNYXAiLCJyZWZlcmVuY2VzIiwidXBkYXRlciIsImFkZEVsZW1lbnRTdHlsZSIsImJ5SW5kZXgiLCJzcGxpY2UiLCJhcGkiLCJkb21BUEkiLCJ1cGRhdGUiLCJuZXdPYmoiLCJyZW1vdmUiLCJsYXN0SWRlbnRpZmllcnMiLCJuZXdMaXN0IiwiaW5kZXgiLCJuZXdMYXN0SWRlbnRpZmllcnMiLCJfaSIsIl9pbmRleCIsIm1lbW8iLCJpbnNlcnQiLCJzdHlsZSIsInRhcmdldCIsInN0eWxlVGFyZ2V0IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwid2luZG93IiwiSFRNTElGcmFtZUVsZW1lbnQiLCJjb250ZW50RG9jdW1lbnQiLCJoZWFkIiwiZSIsImdldFRhcmdldCIsIkVycm9yIiwiYXBwZW5kQ2hpbGQiLCJlbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzIiwic3R5bGVFbGVtZW50Iiwibm9uY2UiLCJzZXRBdHRyaWJ1dGUiLCJpbnNlcnRTdHlsZUVsZW1lbnQiLCJzdHlsZVRhZ1RyYW5zZm9ybSIsImFwcGx5IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVtb3ZlU3R5bGVFbGVtZW50Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJmaXJzdENoaWxkIiwiY3JlYXRlVGV4dE5vZGUiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkIiwiYSIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIm5jIiwiQ29udGVudFR5cGVzIiwiSWNvbnMiLCJUb29sYm94T3B0aW9ucyIsIkNvbW1vbkNsYXNzZXMiLCJDdXN0b21VSUV2ZW50cyIsIkRlZmF1bHRKU0V2ZW50cyIsIkN1c3RvbUV2ZW50cyIsIlpJbmRleCIsIkNvbG9ycyIsIkNvbG9yc05hbWVzIiwiQ29tbWFuZHMiLCJCdXR0b25JRHMiLCJLZXlib2FyZEtleXMiLCJEcm9wZG93bkl0ZW1JRHMiLCJET01FbGVtZW50cyIsIkRyb3Bkb3duTGlzdElEcyIsIkRyb3Bkb3duTWVudUlEcyIsImxvY2FscyIsIlV0aWxzIiwiZ2VuZXJhdGVVbmlxdWVJZCIsInRpbWVQYXJ0IiwiRGF0ZSIsIm5vdyIsInJhbmRvbUFycmF5IiwiVWludDMyQXJyYXkiLCJjcnlwdG8iLCJnZXRSYW5kb21WYWx1ZXMiLCJyZ2JUb0hleCIsInJnYiIsIm1hdGNoIiwiTnVtYmVyIiwieCIsImhleCIsImlzVmFsaWRVcmwiLCJ1cmwiLCJwYXR0ZXJuIiwiUmVnRXhwIiwiaW5jbHVkZXMiLCJ0b0xvd2VyQ2FzZSIsInRlc3QiLCJFbGVtZW50RmFjdG9yeVNlcnZpY2UiLCJjcmVhdG9ycyIsInN0YXRpYyIsIkJMT0NLX1BBUkFHUkFQSCIsIlBBUkFHUkFQSCIsIkNIRUNLQk9YX0lURU0iLCJMSVNUX0lURU0iLCJDT0RFIiwiUVVPVEUiLCJCVUxMRVRFRF9MSVNUIiwiTlVNQkVSRURfTElTVCIsIkNIRUNLX0xJU1QiLCJIRUFERVJfMSIsIkhFQURFUl8yIiwiSEVBREVSXzMiLCJIRUFERVJfNCIsIkhFQURFUl81IiwiSEVBREVSXzYiLCJEUkFHX0hBTkRMRV9CVVRUT04iLCJUQUJMRSIsIklNQUdFIiwiVklERU8iLCJTUE9USUZZIiwiR0lUSFVCX0dJU1QiLCJHSVRMQUJfU05JUFBFVCIsIkNPREVQRU4iLCJDQUxMT1VUIiwiU0VQQVJBVE9SIiwiX2luc3RhbmNlIiwicmVnaXN0ZXIiLCJFTEVNRU5UX1RZUEVTIiwiYmxvY2tQYXJhZ3JhcGhDcmVhdG9yIiwicGFyYWdyYXBoQ3JlYXRvciIsImNoZWNrYm94SXRlbUNyZWF0b3IiLCJsaXN0SXRlbUNyZWF0b3IiLCJjb2RlQ3JlYXRvciIsInF1b3RlQ3JlYXRvciIsImNoZWNrTGlzdENyZWF0b3IiLCJidWxsZXRlZExpc3RDcmVhdG9yIiwibnVtYmVyZWRMaXN0Q3JlYXRvciIsImhlYWRpbmdDcmVhdG9yIiwiZHJhZ0hhbmRsZUJ1dHRvbkNyZWF0b3IiLCJ0YWJsZUNyZWF0b3IiLCJwbGFjZWhvbGRlckNyZWF0b3IiLCJJbWFnZSIsIkltYWdlMiIsIlNob3dNZWRpYUlucHV0VXBsb2FkIiwiU2hvd01lZGlhSW5wdXRFbWJlZCIsIklmcmFtZSIsIllvdVR1YmUiLCJTcG90aWZ5IiwiR2l0SHViIiwiQ29kZVBlbiIsImNhbGxvdXRDcmVhdG9yIiwic2VwYXJhdG9yQ3JlYXRvciIsImdldEluc3RhbmNlIiwidHlwZSIsImNyZWF0b3IiLCJjcmVhdGUiLCJUeXBlRXJyb3IiLCJibG9ja1BhcmFncmFwaCIsInBhcmFncmFwaCIsImxldmVsIiwiaGVhZGluZyIsImNoZWNrYm94SXRlbSIsImxpc3RJdGVtXzIiLCJkcmFnSGFuZGxlQnV0dG9uIiwiY29udGFpbmVyIiwiY2xhc3NMaXN0IiwiYWRkIiwiY29kZUJsb2NrIiwicHJlIiwiSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzIiwiTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MiLCJFeHRyYU9wdGlvbnNDbGFzcyIsImNvZGUiLCJjb250ZW50RWRpdGFibGUiLCJ0ZXh0Q29udGVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBdHRyaWJ1dGUiLCJobGpzIiwiaGlnaGxpZ2h0RWxlbWVudCIsImNvbnRlbnRFbGVtZW50IiwiYmxvY2txdW90ZSIsImdldFJhbmRvbVF1b3RlIiwicXVvdGF0aW9ucyIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInVsIiwiQ2hlY2tMaXN0IiwiaW5pdGlhbEl0ZW0iLCJCdWxsZXRlZExpc3QiLCJOdW1iZXJlZExpc3QiLCJ0YWJsZVNoZWxsIiwidGFibGVDb250cm9sbGVyIiwidGFibGVXcmFwcGVyIiwidGFibGUiLCJBbGlnblRvb2xDbGFzcyIsIlRhYmxlIiwidGJvZHkiLCJyb3dEYXRhIiwic3BsaXQiLCJyb3ciLCJmb3JFYWNoIiwiY2VsbENvbnRlbnQiLCJjZWxsIiwiYWRkUm93IiwiaW5uZXJIVE1MIiwiYWRkQ29sdW1uIiwiY29udGVudFR5cGUiLCJpY29uIiwidGV4dCIsImNsYXNzZXMiLCJDb250ZW50RWxlbWVudCIsInBsYWNlaG9sZGVyIiwiU2hvd01lZGlhSW5wdXRPbkNsaWNrIiwicGxhY2Vob2xkZXJJY29uIiwiY3JlYXRlSWNvbiIsInBsYWNlaG9sZGVyVGV4dCIsImlubmVyVGV4dCIsImpvaGFubmVzQ2FsbG91dCIsIkNvbG9yVG9vbENsYXNzIiwiY2FsbG91dFdyYXBwZXIiLCJ0ZXh0QXJlYSIsIndyYXBwZXIiLCJzZXBhcmF0b3IiLCJwIiwiUGFyYWdyYXBoIiwiaCIsImNoZWNrYm94Iiwic3BhbiIsImRpdiIsIm5ld0RpdiIsIm5ld0VsZW1lbnQiLCJkcmFnSGFuZGxlcldyYXBwZXIiLCJFZGl0b3JPbmx5IiwiYnV0dG9uIiwiZHJhZ2dhYmxlIiwiaWNvbklkIiwiQmFzZVVJQ29tcG9uZW50IiwiX2NhbkhpZGUiLCJwcm9wcyIsImh0bWxFbGVtZW50IiwicGFyZW50IiwiY29uc3RydWN0b3IiLCJpbml0IiwiZGlzcGxheSIsInNldElkIiwiYWRkQ3NzQ2xhc3MiLCJ0b2tlbnMiLCJhcHBlbmRUbyIsImlzVmlzaWJsZSIsInZpc2liaWxpdHkiLCJjb250YWlucyIsImdldENvbXB1dGVkU3R5bGUiLCJwYXJlbnRFbGVtZW50Iiwic2hvdyIsImhpZGUiLCJsb2NrSGlkZSIsInVubG9ja0hpZGUiLCJjYW5IaWRlIiwidmFsdWUiLCJmb2N1cyIsImNoYW5nZUNvbG9yIiwiY29sb3IiLCJyZW1vdmVDb2xvciIsImNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUiLCJjaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4iLCJkb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuIiwib3JpZ2luYWxEaXNwbGF5Iiwib3JpZ2luYWxWaXNpYmlsaXR5Iiwib3JpZ2luYWxQb3NpdGlvbiIsInBvc2l0aW9uIiwiZWxlbWVudFJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJzY3JlZW5XaWR0aCIsImlubmVyV2lkdGgiLCJyaWdodCIsImxlZnQiLCJlbnN1cmVWaXNpYmxlIiwiY2xvc2VzdCIsInNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJibG9jayIsImlubGluZSIsImNvbnNvbGUiLCJ3YXJuIiwiaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQiLCJldmVudCIsImRldGFpbHMiLCJkZXRhaWwiLCJ0YXJnZXRJZCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImhhbmRsZVNob3dFbGVtZW50RXZlbnQiLCJhdHRhY2hVSUV2ZW50IiwiQ2xvc2VFbGVtZW50IiwiYmluZCIsIlNob3dFbGVtZW50IiwiRGVwZW5kZW5jeUNvbnRhaW5lciIsImRlcGVuZGVuY2llcyIsIkluc3RhbmNlIiwiaW5zdGFuY2UiLCJyZXNvbHZlIiwiRE9NVXRpbHMiLCJpc1NlbGVjdGlvbkluVGFibGVDZWxsIiwic2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uIiwicmFuZ2VDb3VudCIsIm5vZGUiLCJhbmNob3JOb2RlIiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwidGFnTmFtZSIsImdldFNlbGVjdGlvblRleHRJbmZvIiwiZWwiLCJzZWxSYW5nZSIsInRlc3RSYW5nZSIsImF0U3RhcnQiLCJhdEVuZCIsInNlbCIsImdldFJhbmdlQXQiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNldEVuZCIsInN0YXJ0Q29udGFpbmVyIiwic3RhcnRPZmZzZXQiLCJzZXRTdGFydCIsImVuZENvbnRhaW5lciIsImVuZE9mZnNldCIsImluc2VydEFmdGVyIiwibmV3Tm9kZSIsInJlZmVyZW5jZU5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsImhhc1RleHRDb250ZW50IiwidHJpbSIsImhhc0NoaWxkTm9kZXMiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwic29tZSIsImNoaWxkTm9kZSIsImNsb25lQW5kSW5zZXJ0QWZ0ZXIiLCJjbG9uZWRFbGVtZW50IiwiY2xvbmVOb2RlIiwicHJlZml4IiwiZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MiLCJjbGFzc05hbWUiLCJhY3RpdmVFbGVtZW50IiwiY3VycmVudEVsZW1lbnQiLCJmaW5kQ2xvc2VzdEFuY2VzdG9yT2ZTZWxlY3Rpb25CeUNsYXNzIiwiY29tbW9uQW5jZXN0b3JDb250YWluZXIiLCJURVhUX05PREUiLCJyZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdCIsImN1cnJlbnROb2RlIiwiY3Vyc29yUG9zaXRpb24iLCJnZXRDdXJzb3JQb3NpdGlvbiIsInJhbmdlczEiLCJzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwiZGVsZXRlRnJvbURvY3VtZW50Iiwic2V0Q3Vyc29yUG9zaXRpb24iLCJyYW5nZXMyIiwicmFuZ2UiLCJpbnRlcnNlY3RzTm9kZSIsInRyZWVXYWxrZXIiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsImFjY2VwdE5vZGUiLCJGSUxURVJfQUNDRVBUIiwiY2hhckNvdW50IiwibmV4dE5vZGUiLCJjdXJyZW50UG9zIiwidGV4dExlbmd0aCIsImNvbGxhcHNlIiwiZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCIsImdldEN1cnJlbnRBY3RpdmVCbG9jayIsImdldEF0dHJpYnV0ZSIsInJvb3ROb2RlIiwicmFuZ2VzIiwicmFuZ2VCZWZvcmUiLCJyYW5nZUFmdGVyIiwibGFzdENoaWxkIiwic2V0RW5kQWZ0ZXIiLCJwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudCIsImVkaXRhYmxlRWxlbWVudCIsInNldFRpbWVvdXQiLCJpc0NvbnRlbnRFZGl0YWJsZSIsInBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudCIsImNvbnRlbnRCbG9jayIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImxhc3ROb2RlIiwiaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YiLCJwYXJlbnRTZWxlY3RvciIsInJlbW92ZUZpbHRlclRleHQiLCJsYXN0U2xhc2hQb3NpdGlvbiIsIm9mZnNldCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiZGVsZXRlQ29udGVudHMiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlEYXRhQ29udGVudFR5cGUiLCJkYXRhQ29udGVudFR5cGUiLCJjbGlja2VkRWxlbWVudCIsImRhdGFzZXQiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZCIsImZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzIiwiY2xhc3NLZXkiLCJpc0V2ZW50VGFyZ2V0RGVzY2VuZGFudE9mIiwic2VsZWN0b3IiLCJFbGVtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwibWF0Y2hlcyIsImdldFBhcmVudFRhcmdldEJ5U2VsZWN0b3IiLCJnZXRQYXJlbnRGcm9tU2VsZWN0aW9uIiwicmVtb3ZlQ2xhc3Nlc1dpdGhQcmVmaXgiLCJmaWx0ZXIiLCJjbHMiLCJzdGFydHNXaXRoIiwiaXNUYXJnZXREZXNjZW5kYW50T2ZTZWxlY3RvciIsIkhUTUxFbGVtZW50IiwiVGV4dCIsInF1ZXJ5U2VsZWN0b3JJbmNsdWRpbmdTZWxmIiwic2FuaXRpemVDb250ZW50RWRpdGFibGUiLCJzaG91bGRSZXN0b3JlQ2FyZXQiLCJjYXJldFBvcyIsImVuZHNXaXRoIiwibm9kZU5hbWUiLCJSYW5nZSIsInRleHROb2RlcyIsImdldFRleHROb2Rlc0luIiwidGV4dE5vZGUiLCJub2RlTGVuZ3RoIiwiY2hpbGRyZW4iLCJnZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZSIsImFsbENvbnRlbnRFZGl0YWJsZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW5kZXhPZiIsImdldE5leHRDb250ZW50RWRpdGFibGUiLCJnZXRBY3RpdmVDb250ZW50RWRpdGFibGUiLCJmaW5kQ29udGVudEVkaXRhYmxlSW5EZXNjZW5kYW50cyIsImNoaWxkIiwic2F2ZUNhcmV0UG9zaXRpb24yZCIsInJlY3QiLCJjaGFySW5kZXgiLCJzbGljZSIsImFuY2hvck9mZnNldCIsImhvcml6b250YWxQb3MiLCJyZXN0b3JlQ2FyZXRQb3NpdGlvbjJkIiwid2Fsa2VyIiwiYmVzdE5vZGUiLCJiZXN0T2Zmc2V0IiwiYmVzdERpc3RhbmNlIiwiSW5maW5pdHkiLCJub2RlVmFsdWUiLCJ0ZXN0UmVjdCIsImhvcml6b250YWxEaXN0YW5jZSIsImFicyIsInNhdmVDYXJldFBvc2l0aW9uM2QiLCJ2ZXJ0aWNhbFBvcyIsInRvcCIsInJlc3RvcmVDYXJldFBvc2l0aW9uM2QiLCJ2ZXJ0aWNhbERpc3RhbmNlIiwidG90YWxEaXN0YW5jZSIsInNxcnQiLCJtZXJnZUlubGluZUVsZW1lbnRzIiwibm9ybWFsaXplIiwiY2hpbGRFbGVtZW50IiwiRmxvYXRpbmdUb29sYmFyIiwiZHJvcGRvd25zIiwic2VwYXJhdG9ycyIsImN1cnJlbnRTZWxlY3Rpb25SYW5nZSIsImh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUiLCJzdXBlciIsInpJbmRleCIsIlNsaWdodGx5SW1wb3J0YW50Iiwic2VsZWN0V3JhcHBlciIsImFueURyb3Bkb3duVmlzaWJsZSIsImhpZGVBbGxEcm9wZG93blZpc2libGUiLCJhcHBlbmREcm9wZG93biIsImRyb3Bkb3duIiwiYXBwZW5kQnV0dG9uR3JvdXAiLCJidXR0b25Hcm91cCIsImFwcGVuZFNlcGFyYXRvciIsImFwcGVuZFRleHRUb29sYmFyIiwiZHJvcGRvd25MaXN0IiwiYXR0YWNoRXZlbnRzIiwiQ2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsIk1vdXNlZG93biIsInJlc3RvcmVSYW5nZVNlbGVjdGlvbiIsImJsb2NrRGVsZXRlZCIsImJsb2NrVHlwZUNoYW5nZWQiLCJpc1NlbGVjdGlvbkVtcHR5IiwiQ2hhbmdlQ29sb3IiLCJTaG93SGlkZUFjdGl2ZUJ1dHRvbiIsImludGVudGlvbiIsIlJlc2V0QWN0aXZlQnV0dG9ucyIsIkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlIiwibGFuZ3VhZ2UiLCJibG9ja0lkIiwiRXZlbnRFbWl0dGVyIiwiZW1pdENvZGVCbG9ja0xhbmd1YWdlQ2hhbmdlZEV2ZW50IiwidGFyZ2V0Q2xhc3MiLCJjdXN0b21FdmVudCIsIkN1c3RvbUV2ZW50IiwiYWN0aW9uIiwiZGlzcGF0Y2hFdmVudCIsImVtaXRTaG93RWxlbWVudEV2ZW50IiwiZW1pdENsb3NlRWxlbWVudEV2ZW50IiwiZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQiLCJDb2xvckNoYW5nZVJlcXVlc3QiLCJlbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQiLCJpbnRlbnNpb24iLCJIaWxpdGVDb2xvck5vbmUiLCJGb3JlQ29sb3JJbml0aWFsIiwiQmFja2dyb3VuZENvbG9yTm9uZSIsImVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQiLCJlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50Iiwic2NvcGUiLCJlbWl0dGVkQ29tbWFuZCIsImNvbW1hbmQiLCJjaGFuZ2VUYWJsZUJvcmRlckNvbG9yIiwiVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIiLCJ0ZXh0T3BlcmF0aW9uc1NlcnZpY2UiLCJpbml0aWFsUmVjdCIsImxvY2tlZEhpZGUiLCJkZWJvdW5jZVRpbWVyIiwiVmVyeUltcG9ydGFudCIsInByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzIiwiaXNMaW5rIiwicXVlcnlDb21tYW5kU3RhdGUiLCJpc0JvbGQiLCJpc0l0YWxpYyIsImlzVW5kZXJsaW5lIiwiaXNJbmxpbmVDb2RlIiwiaXNTdHJpa2VUaHJvdWdoIiwiaGlsaXRlQ29sb3JzIiwiSGlsaXRlQ29sb3JSZWQiLCJxdWVyeUhpbGl0ZUNvbG9yIiwiSGlsaXRlQ29sb3JHcmVlbiIsIkhpbGl0ZUNvbG9yQmx1ZSIsIkhpbGl0ZUNvbG9yWWVsbG93IiwiSGlsaXRlQ29sb3JHcmV5IiwiZm9yZUNvbG9ycyIsIkZvcmVDb2xvclJlZCIsInF1ZXJ5Rm9yZUNvbG9yIiwiRm9yZUNvbG9yR3JlZW4iLCJGb3JlQ29sb3JCbHVlIiwiRm9yZUNvbG9yWWVsbG93IiwiRm9yZUNvbG9yR3JleSIsImVudHJpZXMiLCJhY3RpdmUiLCJMaW5rIiwiQm9sZCIsIkl0YWxpYyIsIklubGluZUNvZGUiLCJVbmRlcmxpbmUiLCJTdHJpa2V0aHJvdWdoIiwiSWNvbkFjdGl2ZUJsdWUiLCJJY29uRGVmYXVsdEJsYWNrIiwibG9nU2VsZWN0aW9uQ2hhbmdlIiwiaXNDb2xsYXBzZWQiLCJsb2ciLCJpc1NlbGVjdGluZyIsIk1vdXNldXAiLCJCYmxDbGljayIsIlNlbGVjdGlvbkNoYW5nZSIsIktleWRvd24iLCJzaGlmdEtleSIsIktleXVwIiwiU2hpZnQiLCJzaG93SGlkZSIsImNsZWFyVGltZW91dCIsIkVzY2FwZSIsInNob3VsZFVwZGF0ZVBvc2l0aW9uIiwiY3VycmVudFJlY3QiLCJoYXNDb250ZW50IiwiaGFzU2VsZWN0aW9uIiwiY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uIiwiZXJyb3IiLCJyZWN0cyIsImdldENsaWVudFJlY3RzIiwiZmlyc3RSZWN0IiwiY19maXJzdFJlY3RMZWZ0IiwiY19maXJzdFJlY3RUb3AiLCJjX2ZpcnN0UmVjdEJvdHRvbSIsImJvdHRvbSIsImVsZW1lbnRXaWR0aCIsIm9mZnNldFdpZHRoIiwibGVmdFBvc2l0aW9uIiwic2Nyb2xsWCIsImVsZW1lbnRIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ0b3BQb3NpdGlvbiIsInNjcm9sbFkiLCJoaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsIiwiaXNDZWxsIiwidXBkYXRlUG9zaXRpb24iLCJzZXRQb3NpdGlvbiIsIklucHV0TGlua0JveCIsInBhcmVudFdyYXBwZXIiLCJzZXRQYXJlbnRXcmFwcGVyIiwiSW5wdXRMaW5rQm94V3JhcHBlciIsImlucHV0TGlua0JveCIsImhpZ2hsaWdodHMiLCJ0ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciIsImF0dGFjaEV2ZW50IiwiaGVhZGVyIiwic2hlbGwiLCJDb250cm9sIiwiYm9keSIsIkVudGVyIiwiaW5zZXJ0TGluayIsImN0cmxLZXkiLCJocmVmIiwib3BlbiIsInVybFdpdGhQcm90b2NvbCIsImxpbmtSZWFkeVRvSW5zZXJ0IiwiaW5wdXQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwb3NpdGlvbkxpbmtDb21wb25lbnRCZWxvd1NlbGVjdGlvbiIsImhpZ2hsaWdodFNlbGVjdGVkVGV4dCIsInJlbW92ZUhpZ2hsaWdodHMiLCJoaWdobGlnaHQiLCJ3aWR0aCIsImhlaWdodCIsIm9wYWNpdHkiLCJwb2ludGVyRXZlbnRzIiwiRWRpdG9yIiwiZWxlbWVudEZhY3RvcnlTZXJ2aWNlIiwibWVtZW50byIsInRpdGxlIiwiYWRkQmxvY2siLCJ0ZXh0RmxvYXRpbmdUb29sYmFyIiwicXVpY2tNZW51IiwidGFibGVDb250ZXh0VG9vbGJhciIsIm1lZGlhSW5wdXR0ZXIiLCJpbnB1dExpbmtCb3hXcmFwcGVyIiwiYmxvY2tPcGVyYXRpb25zU2VydmljZSIsImZsb2F0aW5nVG9vbGJhciIsInRhYmxlVG9vbGJhciIsInNhdmVTdGF0ZSIsImdldEVsZW1lbnRCeUlkIiwiZWRpdG9ySWQiLCJjb250ZW50V3JhcHBlciIsImVkaXRvckNvbmZpZyIsInRhYmxlRmxvYXRpbmdUb29sYmFyIiwiYmxvY2tFbGVtZW50IiwiYXBwZW5kRHJhZ0hhbmRsZXIiLCJyZWFkeVN0YXRlIiwiZmlyc3RQYXJhZ3JhcGgiLCJjbGlwYm9hcmREYXRhIiwiZ2V0RGF0YSIsImluc2VydFRleHRBdEN1cnNvciIsImF0dGFjaERyYWdIYW5kbGVyIiwiaW5zZXJ0Tm9kZSIsInNldFN0YXJ0QWZ0ZXIiLCJkcmFnSGFuZGxlciIsInByZXBlbmQiLCJyZW1vdmVEcmFnSGFuZGxlciIsImV4dHJhY3RDb250ZW50IiwiZHJhZ2dlZEl0ZW0iLCJkcm9wTGluZSIsImJvdW5kaW5nIiwieSIsImNsaWVudFkiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiQWRkQmxvY2tCdXR0b24iLCJleGVjQ29tbWFuZCIsImNyZWF0ZURlZmF1bHRCbG9jayIsIkFkZEJsb2NrV3JhcHBlciIsIlNpemVzIiwiU1ZHSWNvbiIsInVzZUVsZW1lbnQiLCJzaXplIiwiY3JlYXRlRWxlbWVudE5TIiwidXNlIiwic2V0QXR0cmlidXRlTlMiLCJjbG9uZSIsInNpemVzIiwic2V0VXNlVG8iLCJBZGRCbG9ja0J1aWxkZXIiLCJidWlsZCIsIlBsdXMiLCJtZWRpdW0iLCJEcm9wZG93bk1lbnUiLCJkcm9wZG93bkJ1dHRvbiIsInByZWZpeElkIiwiY2xhc3Nlc0tleSIsIkJhc2VEb3VibHlMaW5rZWRMaXN0IiwidGFpbCIsImdldEZpcnN0IiwiZ2V0TGFzdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY3VycmVudCIsImNhbGxiYWNrIiwiYW55IiwicHJlZGljYXRlIiwiZmluZEZpcnN0IiwiZmluZExhc3QiLCJwcmV2aW91c05vZGUiLCJmaW5kIiwiSk5vZGUiLCJwYXJlbnRMaXN0Iiwic2V0TmV4dCIsInNldFByZXZpb3VzIiwiZ2V0TmV4dFNhdGlzZnlpbmciLCJzdGFydE5vZGUiLCJnZXRQcmV2aW91c1NhdGlzZnlpbmciLCJDaXJjdWxhckRvdWJseUxpbmtlZExpc3QiLCJhcHBlbmQiLCJEcm9wZG93bk1lbnVMaXN0SXRlbSIsImFjdGl2ZUljb24iLCJsZWZ0SWNvbiIsIm9uRm9jdXNGdW5jdGlvbkxpc3QiLCJvbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdCIsInBhcmVudERyb3Bkb3duTWVudUxpc3QiLCJzaG9ydGN1dCIsImFkZENsYXNzIiwiYXR0YWNoT25Gb2N1cyIsImZ1bmMiLCJhcmdzIiwiYXR0YWNoT25Mb3NlRm9jdXMiLCJyZW1vdmVGb2N1cyIsInRhYkluZGV4IiwidGV4dE9wdGlvbiIsInNob3J0Q3V0IiwiZW1pdENvbW1hbmRFdmVudCIsIk1vdXNlbW92ZSIsImFzeW5jIiwiZHJvcGRvd25JdGVtcyIsInN3aXRjaFZpc3VhbEZvY3VzIiwiaGFuZGxlQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VFdmVudCIsImV2ZW50VmFsdWVzIiwiaGFuZGxlU2hvd0hpZGVBY3RpdmVCdXR0b25FdmVudCIsImhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50IiwiZXZlbnRDb2xvciIsIkRyb3Bkb3duTWVudUxpc3QiLCJwYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiIsImN1cnJlbnRGb2N1c2VkTWVudUl0ZW0iLCJtYXhIZWlnaHQiLCJvdmVyZmxvd1kiLCJFeHRyZW1lbHlJbXBvcnRhbnQiLCJkcm9wZG93bkl0ZW0iLCJzZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24iLCJkcm9wZG93blBhcmVudEJ1dHRvbiIsImNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlIiwia2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUiLCJmb2N1c05leHRWaXNpYmxlSXRlbSIsImZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSIsImhhbmRsZXJLZXlEb3duRXZlbnQiLCJibG9ja0Nsb25lZCIsImFwcGx5RmlsdGVyIiwiQmFja3NwYWNlIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJzdmdJY29uIiwibmV4dFZpc2libGVJdGVtIiwicHJldmlvdXNWaXNpYmxlSXRlbSIsIkZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciIsImJvcmRlclJpZ2h0IiwibWFyZ2luIiwiQnV0dG9uR3JvdXAiLCJCdXR0b25Hcm91cEl0ZW0iLCJzaG93VUkiLCJ0b2dnbGVMaW5rIiwiQ29sb3JJY29uIiwiYm9yZGVyUmFkaXVzIiwiYm9yZGVyIiwiYm94U2l6aW5nIiwiRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSIsImNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUiLCJnZXRMZWZ0SWNvbkJhY2tncm91bmRDb2xvciIsInJlc2V0QWN0aXZlSWNvbiIsIkJsb2NrVG9vbGJveEJ1aWxkZXIiLCJhbGlnblRvb2wiLCJncm91cEJ1dHRvbiIsIkp1c3RpZnlMZWZ0IiwiSnVzdGlmeVN0YXJ0IiwibGFyZ2UiLCJKdXN0aWZ5Q2VudGVyIiwiSnVzdGlmeVJpZ2h0IiwiSnVzdGlmeUVuZCIsImNvbG9yVG9vbCIsImNvbG9yRHJvcGRvd25MaXN0IiwiY29sb3JCdXR0b24iLCJEcm9wZG93bk1lbnVCdXR0b24iLCJjb2xvckRyb3Bkb3duIiwiaGlsaXRlQ29sb3JSZWQiLCJCYWNrZ3JvdW5kT3B0aW9uUmVkIiwiY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciIsIkNhbGxvdXRCYWNrZ3JvdW5kUmVkIiwiQmFja2dyb3VuZE9wdGlvbkdyZWVuIiwiQ2FsbG91dEJhY2tncm91bmRHcmVlbiIsImhpbGl0ZUNvbG9yQmx1ZSIsIkJhY2tncm91bmRPcHRpb25CbHVlIiwiQ2FsbG91dEJhY2tncm91bmRCbHVlIiwiaGlsaXRlQ29sb3JZZWxsb3ciLCJCYWNrZ3JvdW5kT3B0aW9uWWVsbG93IiwiQ2FsbG91dEJhY2tncm91bmRZZWxsb3ciLCJoaWxpdGVDb2xvckdyZXkiLCJCYWNrZ3JvdW5kT3B0aW9uR3JleSIsIkNhbGxvdXRCYWNrZ3JvdW5kR3JleSIsImhpbGl0ZUNvbG9yTm9uZSIsIkJhY2tncm91bmRPcHRpb25Ob25lIiwiQ2FsbG91dEJhY2tncm91bmROb25lIiwibGFuZ3VhZ2VTZWxlY3Rpb25Ub29sIiwic2VsZWN0IiwibWVudSIsIkJsb2NrVG9vbGJveCIsImxhbmd1YWdlTWFwIiwic29ydCIsImIiLCJsb2NhbGVDb21wYXJlIiwibmFtZSIsImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlIiwiZXh0cmFPcHRpb25zIiwiZHVwbGljYXRlQmxvY2siLCJEdXBsaWNhdGUiLCJkZWxldGVJdGVtIiwiZGVsZXRlQmxvY2siLCJUcmFzaCIsImxpc3RlbiIsIk1vdXNlb3ZlciIsImluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlIiwiRm9jdXNpbiIsImhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luIiwiRm9jdXNvdXQiLCJoYW5kbGVUYWJsZUJlaGF2aW9yRm9jdXNPdXQiLCJoYW5kbGVDbGlja0V2ZW50IiwidGFyZ2V0RWxlbWVudCIsInRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlciIsImZvcmNlSGlkZUVsZW1lbnQiLCJvcHRpb25zV3JhcHBlciIsImluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wiLCJpbmNsdWRlQWxpZ25Ub29sIiwiaW5jbHVkZUNvbG9yVG9vbCIsImluY2x1ZGVFeHRyYU9wdGlvbnMiLCJ0b29sYm94V3JhcHBlciIsImNyZWF0ZVRvb2xib3giLCJNb3VzZWVudGVyIiwicmVzZXRUb29sYm94IiwiYmxvY2tUb29sYmFySWQiLCJ0b29sYmFyIiwiaGlkZUJsb2NrVG9vbGJveCIsIk1vdXNlbGVhdmUiLCJpZnJhbWUiLCJjaGFuZ2VUb29sYmFyQ29sb3IiLCJjb2xvckludGVyYWN0aXZlQnV0dG9uIiwiYm9yZGVyQ29sb3IiLCJpc0FueURlcGVuZGVudEJveFZpc2libGUiLCJkZXBlbmRlbnRCb3hlcyIsImJveCIsImJsb2NrVG9vbGJhciIsIm1vcmUiLCJodG1sRWxlbWVudFdyYXBwZXIiLCJpbmNsdWRlQ2hldnJvbkljb24iLCJyb2xlIiwiY2hhbmdlVGl0bGUiLCJUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJmbG9hdGluZ0JhciIsInR1cm5JbnRvRHJvcGRvd24iLCJtb3JlT3B0aW9uc0Ryb3Bkb3duIiwidHVybkludG9CYXJMaXN0IiwidHVybkludG9CYXJCdXR0b24iLCJ0cmFuc2Zvcm1CbG9jayIsIlNWR0ljb25zIiwidG9kb19saXN0IiwiYl9saXN0Iiwibl9saXN0IiwicXVvdGUiLCJoZWFkMiIsImhlYWQzIiwiaGVhZDQiLCJsaW5rIiwiYm9sZCIsInRvZ2dsZUJvbGQiLCJpdGFsaWMiLCJ0b2dnbGVJdGFsaWMiLCJ1bmRlcmxpbmUiLCJ0b2dnbGVVbmRlcmxpbmUiLCJpbmxpbmVDb2RlIiwidG9nZ2xlSW5saW5lQ29kZSIsInN0cmlrZXRocm91Z2giLCJ0b2dnbGVTdHJpa2VUaHJvdWdoIiwiU3RyaWtlVGhyb3VnaCIsIkNvbG9yVGV4dE9wdGlvblNlbGVjdCIsIkNvbG9yVGV4dE9wdGlvbnNNZW51IiwidG9nZ2xlSGlsaXRlQ29sb3IiLCJoaWxpdGVDb2xvckdyZWVuIiwiZm9yZUNvbG9yUmVkIiwidG9nZ2xlRm9yZUNvbG9yIiwiZm9yZUNvbG9yR3JlZW4iLCJmb3JlQ29sb3JCbHVlIiwiZm9yZUNvbG9yWWVsbG93IiwiZm9yZUNvbG9yR3JleSIsImZvcmVDb2xvck5vbmUiLCJtb3JlT3B0aW9uc0xpc3QiLCJtb3JlT3B0aW9uc0J1dHRvbiIsImNvcHlTZWxlY3RlZCIsImNvcHkiLCJjdXRTZWxlY3RlZCIsImN1dCIsInBhc3QiLCJwYXN0ZSIsImR1cGxpY2F0ZSIsInJlbW92ZUZvcm1hdCIsImVyYXNlciIsImRlbGV0ZSIsImhlYWQxIiwiaGVhZDUiLCJoZWFkNiIsIlF1aWNrTWVudUVtcHR5IiwiaHRtbEVtcHR5SW5kaWNhdG9yIiwicGFkZGluZyIsIlF1aWNrTWVudSIsIm1lbnVTZWN0aW9ucyIsInF1aWNrTWVudUVtcHR5IiwiZmlsdGVySW5wdXQiLCJmb2N1c1N0YWNrIiwiYmxvY2tPcHRpb25zIiwibWVudUl0ZW0iLCJibG9ja09wZXJhdGlvblNlcnZpY2UiLCJwZWVrIiwiZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0iLCJmaXJzdFNlY3Rpb25Ob2RlIiwiY3VycmVudFNlY3Rpb25Ob2RlIiwiaXRlbU5vZGUiLCJtZW51SXRlbXMiLCJwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZSIsImltbWVkaWF0ZVBhcmVudCIsInNlY3Rpb24iLCJsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlIiwibmV4dFZpc2libGVTZWN0aW9uTm9kZSIsImZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlIiwiZmlsdGVySXRlbXMiLCJmaWx0ZXJTZWN0aW9uIiwicmVzdG9yZSIsImFsdEtleSIsInJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlciIsImNvbmNhdEZpbHRlcklucHV0Iiwic3RvcFByb3BhZ2F0aW9uIiwiYmxvY2tUeXBlIiwidHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSIsInN0ZyIsIkRvdWJseUxpbmtlZExpc3QiLCJRdWlja01lbnVTZWN0aW9uIiwicXVpY2tNZW51SW5zdGFuY2UiLCJhcHBlbmRRdWlja01lbnVJdGVtcyIsImFwcGVuZFF1aWNrTWVudUl0ZW0iLCJmaWx0ZXJWYWx1ZSIsIlF1aWNrTWVudUl0ZW0iLCJfYmxvY2tUeXBlIiwiX2ZpbHRlclZhbHVlIiwiX2ltbWVkaWF0ZVBhcmVudCIsImRlc2NyaXB0aW9uIiwib3B0aW9uSW1hZ2UiLCJzdmciLCJvcHRpb25UZXh0IiwiYmxvY2tUaXRsZSIsImJsb2NrRGVzY3JpcHRpb24iLCJRdWlja01lbnVCdWlsZGVyIiwiYmFzaWNCbG9ja3NTZWN0aW9uIiwiQ2FsbG91dCIsIm1lZGlhQmxvY2tzU2VjdGlvbiIsImhlYWRpbmdCbG9ja3NTZWN0aW9uIiwibGlzdEJsb2Nrc1NlY3Rpb24iLCJlbWJlZFNlY3Rpb24iLCJUaXRsZSIsImgxIiwiVGl0bGVCdWlsZGVyIiwiRGlyZWN0aW9ucyIsIlRhYmxlU2NvcGVzIiwiU2VsZWN0aW9uTW9kZXMiLCJFbWJlZFR5cGVzIiwiVG9vbGJhcklEcyIsIkJvdW5kYXJpZXMiLCJUYWJsZVV0aWxzIiwiaW5zZXJ0UG9zaXRpb24iLCJyb3dzIiwibmV3Um93IiwiaW5zZXJ0Um93IiwibnVtQ29sdW1ucyIsInJlZHVjZSIsIm1heCIsImNlbGxzIiwiYWZmZWN0ZWRDZWxscyIsImluc2VydENlbGwiLCJpc0xhc3RDb2x1bW4iLCJjZWxsUm93IiwiaXNMYXN0Um93IiwicmVtb3ZlQ29sdW1uQnlDZWxsIiwiY29sdW1uSW5kZXgiLCJjZWxsSW5kZXgiLCJkZWxldGVDZWxsIiwicmVtb3ZlUm93QnlDZWxsIiwiZGVsZXRlUm93Iiwicm93SW5kZXgiLCJnZXRBY3RpdmVUYWJsZUNlbGwiLCJnZXRMYXN0VGFibGVDZWxsIiwiaiIsImdldEZpcnN0VGFibGVDZWxsIiwiZ2V0TmVpZ2hib3JDZWxsIiwiZGlyZWN0aW9uIiwiQXJyb3dSaWdodCIsIkFycm93TGVmdCIsIkFycm93VXAiLCJBcnJvd0Rvd24iLCJjaGFuZ2VDZWxsQm9yZGVyQ29sb3IiLCJjZWxsc1RvQ2hhbmdlIiwiQ29sdW1uIiwiUm93Iiwic2VsZWN0ZWRDZWxsIiwiQ2VsbCIsIlNlbGVjdGVkQ2VsbHMiLCJtb3ZlRm9jdXNUb0JlbG93Q2VsbCIsIm5leHRSb3ciLCJiZWxvd0NlbGwiLCJDb250ZW50IiwiY2xlYXJTZWxlY3Rpb25PbkRyYWciLCJyZVJlbmRlclBsYWNlaG9sZGVyIiwic2VsZWN0ZWQiLCJwYXJlbnRCbG9jayIsIkJsdXIiLCJjb3B5RWxlbWVudEl0ZW0iLCJET01Db250ZW50TG9hZGVkIiwiZWRpdG9yIiwiYmxvY2tzIiwicHJlc3NlZEVudGVyT25UaXRsZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzIiwic2VsZWN0ZWRDb250ZW50IiwibWVyZ2VXaXRoUHJldmlvdXNCbG9jayIsIkRlbGV0ZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQiLCJtZXJnZVdpdGhOZXh0QmxvY2siLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsInRhYkNoYXJhY3RlciIsImFjdGl2ZUNlbGwiLCJmb2N1c09uTmV4dEJsb2NrIiwiaW5zZXJ0TmV3Iiwic2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyIiwiSW5wdXQiLCJoYXNBdHRyaWJ1dGUiLCJjdXN0b21QbGFjZWhvbGRlciIsImZvY3VzYWJsZVBhcmVudCIsImVuZE5vZGUiLCJjb2xsYXBzZWQiLCJpc0F0Rmlyc3RWaXNpYmxlTGluZSIsImNsb25lUmFuZ2UiLCJpc0F0TGFzdFZpc2libGVMaW5lIiwiZGlkQ3Vyc29yTW92ZSIsIlByb21pc2UiLCJvcmlnaW5hbFJlY3QiLCJuZXdSZWN0IiwiZGlkTW92ZSIsIkNvbnRlbnRCdWlsZGVyIiwiVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwic2VsZWN0ZWRDZWxscyIsImFjdHVhbEZvY3VzZWRDZWxsIiwidGFibGVPcGVyYXRpb25zU2VydmljZSIsImNvbnRyb2xsZXIiLCJzZWxlY3Rpb25Nb2RlIiwic2VsZWN0aW9uRmxhZyIsInNlbGVjdGVkVGV4dCIsImNsZWFyQW5kSGlkZSIsIk1vZGVyYXRlbHlJbXBvcnRhbnQiLCJBYm9ydENvbnRyb2xsZXIiLCJoYW5kbGVNb3VzZURvd24iLCJoYW5kbGVNb3VzZU1vdmUiLCJoYW5kbGVNb3VzZVVwIiwiaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duIiwiaGFuZGxlQ2VsbFNlbGVjdGlvbkNvbnRpbnVhdGlvbk9uS2V5RG93biIsImhhbmRsZUtleURvd24iLCJoYW5kbGVLZXlVcCIsIlREIiwiYWJvcnQiLCJjbGVhckFsbCIsImFkZFNlbGVjdGVkQ2VsbCIsInVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQiLCJyZXNldFNlbGVjdGlvblN0YXRlIiwiY3VycmVudENlbGwiLCJtZXRhS2V5IiwicmVwZWF0IiwibmV4dENlbGwiLCJub3JtYWxpemVUZXh0IiwicmVwbGFjZSIsInVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZSIsImFjdHVhbFNlbGVjdGlvbiIsImN1cnJlbnRDZWxsVGV4dCIsImNlbGxSZWN0IiwibW91c2VYIiwiY2xpZW50WCIsIm1vdXNlWSIsInJlc2V0QWJvcnRDb250cm9sbGVyIiwiY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvIiwic2lnbmFsIiwiYmFja2dyb3VuZENvbG9ycyIsIkJhY2tncm91bmRDb2xvclJlZCIsInF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yIiwiQmFja2dyb3VuZENvbG9yR3JlZW4iLCJCYWNrZ3JvdW5kQ29sb3JCbHVlIiwiQmFja2dyb3VuZENvbG9yWWVsbG93IiwiQmFja2dyb3VuZENvbG9yR3JleSIsIlRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJ0YWJsZU9wZXJhdGlvblNlcnZpY2UiLCJ0YWJsZU9wdGlvbnMiLCJ0YWJsZUNvbG9yRHJvcGRvd24iLCJpbnNlcnRUYWJsZUNvbHVtbkxlZnQiLCJDb2x1bW5MZWZ0IiwiaW5zZXJ0VGFibGVDb2x1bW5SaWdodCIsIkNvbHVtblJpZ2h0IiwiaW5zZXJ0VGFibGVSb3dBYm92ZSIsIlJvd0Fib3ZlIiwiaW5zZXJ0VGFibGVSb3dCZWxvdyIsIlJvd0JlbG93IiwiZGVsZXRlQ29sdW1uSXRlbSIsInJlbW92ZUNvbHVtbiIsImRlbGV0ZVN3ZWVwIiwiZGVsZXRlUm93SXRlbSIsInJlbW92ZVJvdyIsImNlbGxCYWNrZ3JvdW5kQ29sb3JSZWQiLCJ0b2dnbGVDZWxsSGlsaXRlQ29sb3IiLCJjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4iLCJjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSIsImNlbGxCYWNrZ3JvdW5kQ29sb3JZZWxsb3ciLCJjZWxsQmFja2dyb3VuZENvbG9yR3JleSIsImNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lIiwiRW1iZWRUb29sIiwiZW1iZWRJbWFnZSIsInVybE9iaiIsImxhc3RGb2N1c2VkRWxlbWVudCIsIlVSTCIsInZhbGlkYXRlSW1hZ2UiLCJjcmVhdGVFbWJlZENvbnRhaW5lciIsImltYWdlIiwic3JjIiwiYWx0IiwibWF4V2lkdGgiLCJmaW5hbGl6ZUVtYmVkIiwidXJsVG9DaGVjayIsInJlamVjdCIsIm9ubG9hZCIsIm9uZXJyb3IiLCJlbWJlZEdvb2dsZVNoZWV0Iiwic2hlZXRJZCIsInBhdGhuYW1lIiwic2FmZVNoZWV0SWQiLCJmcmFtZUJvcmRlciIsImFsbG93RnVsbHNjcmVlbiIsImVtYmVkWW91VHViZVZpZGVvQXNJZnJhbWUiLCJ2aWRlb0lkIiwic2VhcmNoUGFyYW1zIiwic2FmZVZpZGVvSWQiLCJhbGxvdyIsImVtYmVkWW91VHViZVNob3J0QXNJZnJhbWUiLCJwYXRoU2VnbWVudHMiLCJzaG9ydElkIiwic2FmZVNob3J0SWRJZCIsImVtYmVkWW91VHViZVBsYXlsaXN0QXNJZnJhbWUiLCJsaXN0SWQiLCJzYWZlTGlzdElkIiwiZW1iZWRTcG90aWZ5Q29udGVudCIsImNvbnRlbnRJZCIsInBvcCIsInNhZmVDb250ZW50SWQiLCJTcG90aWZ5VHJhY2siLCJTcG90aWZ5UGxheWxpc3QiLCJTcG90aWZ5U2hvdyIsIlNwb3RpZnlFcGlzb2RlIiwiU3BvdGlmeUFydGlzdCIsImVtYmVkR2lzdEFzU2NyaXB0IiwiZ2lzdElkIiwic2hhZG93RWxlbWVudCIsIm1pbkhlaWdodCIsInNoYWRvd1Jvb3QiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwic2NyaXB0U3JjIiwic2NyaXB0Iiwib3JpZ2luYWxXcml0ZSIsIndyaXRlIiwic2NyaXB0T3V0cHV0IiwidGVtcERpdiIsImVtYmVkQ29kZXBlbkFzSWZyYW1lIiwicGFydHMiLCJ1c2VyIiwicGVuIiwic2FmZVVzZXIiLCJzYWZlUGVuIiwib3ZlcmZsb3ciLCJyZXNpemVPYnNlcnZlciIsIlJlc2l6ZU9ic2VydmVyIiwiZW50cnkiLCJjb250ZW50UmVjdCIsIm9ic2VydmUiLCJmaWd1cmUiLCJjb250ZW50RWxlbWVudENsYXNzZXMiLCJ0b29sYmFyV3JhcHBlciIsImRldGVybWluZUVtYmVkVHlwZSIsImRvbWFpbiIsImhvc3RuYW1lIiwicGF0aCIsImhhcyIsIllvdVR1YmVQbGF5bGlzdCIsIllvdVR1YmVWaWRlbyIsIllvdVR1YmVTaG9ydCIsIlZpbWVvVmlkZW8iLCJHb29nbGVTaGVldCIsIlR3ZWV0IiwiR29vZ2xlTWFwIiwiR2l0SHViR2lzdCIsIkdpdExhYlNuaXBwZXQiLCJNZWRpYUlucHV0dGVyIiwidXBsb2FkVGFiIiwiY3JlYXRlTmF2SXRlbSIsImVtYmVkVGFiIiwidXBsb2FkQ29udGVudCIsImNyZWF0ZVVwbG9hZENvbnRlbnQiLCJlbWJlZENvbnRlbnQiLCJjcmVhdGVFbWJlZENvbnRlbnQiLCJsaSIsImxhYmVsIiwidGV4dEluZm8iLCJlbWJlZEdlbmVyaWMiLCJyZXNldElucHV0QmdDb2xvciIsInN0cmluZ1VSTCIsImZvY3VzZWRFbGVtZW50IiwiZW1iZWRUeXBlIiwiaW5wdXRWYWx1ZSIsImlucHV0VGV4dCIsInNldEFjdGl2ZVRhYiIsImhhbmRsZXJLZXlkb3duRXZlbnRzIiwiaGFuZGxlckNsaWNrRXZlbnRzIiwiaGlkZU1lZGlhSW5wdXR0ZXJPbkV4dGVybmFsQ2xpY2siLCJzaG93TWVkaWFJbnB1dHRlck9uTWVkaWFJbnB1dHRlckVsZW1lbnRDbGljayIsImNsaWNrZWRPbkVsZW1lbnRXaXRoU2hvd01lZGlhSW5wdXRDbGFzcyIsImZpbmRDbGFzc1dpdGhTdWZmaXgiLCJzdWZmaXgiLCJyZWdleCIsImdldFRhYiIsInRhYklkIiwiZ2V0Q29udGVudCIsImxhc3RGb2N1c2VkIiwic2hvd0lucHV0TWVkaWEiLCJ0ZXh0UGxhY2Vob2xkZXIiLCJzZXRJbnB1dFBsYWNlaG9sZGVyIiwiYWN0aXZhdGVNZWRpYVVwbG9hZCIsImlzRWxlbWVudFZpc2libGUiLCJlbWJlZCIsIm9mZnNldFBhcmVudCIsIk1lZGlhSW5wdXR0ZXJCdWlsZGVyIiwiRWRpdG9yQnVpbGRlciIsIlVJQnVpbGRlciIsInN0YXJ0IiwiaW5zZXJ0SWNvbnMiLCJzdmdDb250YWluZXIiLCJDb21tYW5kRGlzcGF0Y2hlciIsInRleHRPcGVyYXRpb25TZXJ2aWNlIiwiaGFuZGxlQ29tbWFuZEV2ZW50IiwiY3JlYXRlQU5ld1BhcmFncmFwaEZyb21UaXRsZSIsInRhcmdldEJsb2NrVHlwZSIsImV4ZWNJbnNlcnRMaW5rIiwiZXhlY1RvZ2dsZUxpbmsiLCJleGVjQm9sZCIsImV4ZWNJbmxpbmVDb2RlIiwiZXhlY0l0YWxpYyIsImV4ZWNVbmRlcmxpbmUiLCJleGVjU3RyaWtlVGhyb3VnaCIsImV4ZWNIaWxpdGVDb2xvciIsImV4ZWNGb3JlQ29sb3IiLCJleGVjRHVwbGljYXRlQmxvY2siLCJleGVjRGVsZXRlQmxvY2siLCJleGVjRGVsZXRlRm9jdXNPblByZXZpb3VzIiwiZXhlY0RlbGV0ZUFuZEZvY3VzT25OZXh0IiwiZXhlY0ZvY3VzT25OZXh0IiwiZXhlY1JlbW92ZUZvcm1hdCIsImp1c3RpZnlMZWZ0IiwianVzdGlmeUNlbnRlciIsImp1c3RpZnlSaWdodCIsImV4ZWNDcmVhdGVEZWZhdWx0QmxvY2siLCJleGVjSW5zZXJ0TmV3IiwiZm9jdXNPblByZXZpb3VzQmxvY2siLCJleGVjRm9jdXNPblByZXZpb3VzQmxvY2siLCJleGVjTWVyZ2VXaXRoTmV4dEJsb2NrIiwiZXhlY01lcmdlV2l0aFByZXZpb3VzQmxvY2siLCJpbnNlcnRDb2x1bW5MZWZ0IiwiaW5zZXJ0Q29sdW1uUmlnaHQiLCJpbnNlcnRSb3dBYm92ZSIsImluc2VydFJvd0JlbG93IiwiZXhlY0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJleGVjQ2hhbmdlQ2FsbG91dEJhY2tncm91bmQiLCJmb3JtYXQiLCJjcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50IiwiU2hvcnRjdXRMaXN0ZW5lcnMiLCJzdGFydExpc3RlbiIsImdldE1vZGlmaWVyU3RhdGUiLCJpc051bVBhZCIsIm51bUxvY2tPbiIsImFsZXJ0IiwiVGFibGVMaXN0ZW5lcnMiLCJzaG93bkVsZW1lbnRzIiwiTWFwIiwiRm9jdXNTdGFjayIsInN0YWNrIiwiY2FwYWNpdHkiLCJzaGlmdCIsImNsZWFyIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInRoZW4iLCJjb3BpZWRFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY2F0Y2giLCJlcnIiLCJyZWFkVGV4dCIsInBhc3RlZFRleHQiLCJzZWxlY3Rpb25FdmVudCIsImdldEN1cnJlbnRTZWxlY3RlZEJsb2NrIiwiZm9jdXNPbkZpcnN0QmxvY2siLCJnZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbiIsImN1cnJlbnRDb250ZW50RWRpdGFibGUiLCJwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSIsImNhcmV0UG9zaXRpb24iLCJsaXN0SXRlbSIsImFkanVzdGVkQ2FyZXRQb3NpdGlvbiIsIm5leHRDb250ZW50RWRpdGFibGUiLCJuZXh0RWxlbWVudCIsImhpZGVFdmVudCIsImZvY3VzT25OZXh0IiwiZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkiLCJuZXdDb250ZW50QmxvY2siLCJmb2N1c1N0YWNrVG9BZGQiLCJlZGl0YWJsZUNvbnRlbnQiLCJjYWxsb3V0IiwicmVwbGFjZUNoaWxkIiwiZm9jdXNhYmxlIiwiY3JlYXRlTmV3RWxlbWVudCIsImNyZWF0ZUxpc3RJdGVtIiwibmV3Q29udGVudEVsZW1lbnQiLCJjdXJyZW50SXRlbSIsImNvbnRlbnRDdXJyZW50IiwiY29udGVudENsb25lIiwiY291bnRlciIsIm5ld1BhcmFncmFwaCIsImN1cnJlbnRCbG9jayIsImNsb25lZEJsb2NrIiwiY2xvbmVkVGl0bGUiLCJuZXdCbG9jayIsImV2ZW50UGFyYWdyYXBoIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJmb2N1c09uUHJldmlvdXMiLCJhY3R1YWxFbGVtZW50IiwidG9VcHBlckNhc2UiLCJwcmV2aW91c0VsZW1lbnQiLCJhcHBseUN1cnNvclhFbmRQb3NpdGlvbiIsInNpYmxpbmciLCJmb2N1c2FibGVDYW5kaWRhdGVzIiwiZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50IiwiYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbiIsImdldE5leHRGb2N1c2FibGVFbGVtZW50IiwiYWN0dWFsIiwieFBvc2l0aW9uIiwiYWRqdXN0Q3Vyc29yT2Zmc2V0IiwicHJldmlvdXNTaWJsaW5nIiwiY2xvc2VzdE5vZGUiLCJjbG9zZXN0T2Zmc2V0IiwiY2xvc2VzdERpZmYiLCJsZWZ0RGlmZiIsInJpZ2h0RGlmZiIsIm1pbiIsImdldEN1cnJlbnRTZWxlY3RlZEZvY3VzYWJsZSIsInJlbW92ZUp1c3RpZnkiLCJjYWxsb3V0RGl2IiwiVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwibm9ybWFsaXplQW5jaG9ycyIsImFuY2hvciIsInF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlIiwicXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlIiwiZXh0cmFjdENvbnRlbnRzIiwiaXNDb2RlIiwiY29udGFpbnNDb2RlIiwicGFyZW50Q29kZSIsImNvZGVFbGVtZW50IiwicXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUiLCJpc05vZGVJbnNpZGVBbmNob3IiLCJjbG9uZUNvbnRlbnRzIiwiZXhwZWN0ZWRDb2xvciIsImZvbnRDb2xvciIsInJnYkNvbG9yIiwic3BhbldpdGhCYWNrZ3JvdW5kIiwiZ2V0VGFyZ2V0RWxlbWVudE1hcCIsImdldFNlbGVjdGVkSFRNTEVsZW1lbnQiLCJnZXRTZWxlY3RlZFRleHROb2RlcyIsIm5vZGVJdGVyYXRvciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJFTkRfVE9fU1RBUlQiLCJTVEFSVF9UT19FTkQiLCJmaW5kQ2xvc2VzdE1hdGNoaW5nUGFyZW50IiwiZWxlbSIsImV2ZXJ5IiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsImVuZCIsIlRhYmxlT3BlcmF0aW9uc1NlcnZpY2UiLCJpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJUYWJsZVRvb2xiYXIiLCJpc0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJ0YXJnZXRIZXhDb2xvciIsImN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJlbGVtZW50cyIsImlzIiwic2hvd0luc2VydExpbmVFbGVtZW50Iiwic2hvd0luc2VydENvbHVtbkVsZW1lbnQiLCJoaWRlSW5zZXJ0Um93RWxlbWVudCIsImhpZGVJbnNlcnRDb2x1bW5FbGVtZW50IiwiTWVtZW50byIsInVuZG9TdGFjayIsInJlZG9TdGFjayIsInF1ZXJ5IiwiaHRtbCIsInVuZG8iLCJzdGF0ZVRvUmVzdG9yZSIsInJlZG8iLCJzdGF0ZVRvQXBwbHkiLCJTcGFjZSIsIkVkaXRhYmxlTmF2aWdhdGlvbiIsImhhbmRsZUFycm93S2V5cyIsImN1cnJlbnRFZGl0YWJsZSIsInNob3VsZFN3aXRjaEVkaXRhYmxlIiwibmV4dEVkaXRhYmxlIiwiZmluZE5leHRFZGl0YWJsZSIsInBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbiIsImlzQXRGaXJzdExpbmUiLCJpc0F0TGluZUJvdW5kYXJ5IiwiRmlyc3QiLCJpc0F0TGFzdExpbmUiLCJMYXN0IiwiYm91bmRhcnkiLCJhbGxFZGl0YWJsZXMiLCJjdXJyZW50SW5kZXgiLCJuZWlnaGJvckNlbGwiLCJuZXh0SW5kZXgiLCJmaW5kVmVydGljYWxFZGl0YWJsZUluZGV4IiwibmV4dCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +(()=>{"use strict";var e={282:(e,t,n)=>{n.d(t,{A:()=>s});var o=n(354),i=n.n(o),r=n(314),l=n.n(r)()(i());l.push([e.id,'/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n font: inherit;\n line-height: normal;\n}\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n}\n\n.list-item-checkable input {\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n background-color: white;\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n margin-bottom: 200px;\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n font-size: 0.86rem;\n color: #37352fd9;\n font-weight: 600;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper ul {\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper>button {\n color: #37352fd9;\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.item>button,\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n /* background-color: inherit; */\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n.johannes-editor *::selection {\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #feebeb;\n border-color: #FDDEDE;\n}\n\n.callout-background-green {\n background-color: #ebfbee;\n border-color: #D7F7DC;\n}\n\n.callout-background-blue {\n background-color: #e8f4fa;\n border-color: #D9EDF6;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #FAF4D1;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #E1E0E0;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #37352fd9;\n font-weight: 600;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n.embed-content button {\n cursor: pointer;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Resize handler */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n/** Resize handler **/\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n\n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n /* color: inherit; */\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: #2383e2;\n color: white;\n border: none;\n padding: 3px;\n border-radius: 5px;\n font-weight: 500;\n}\n\n\n/** separator **/\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n.separator-wrapper hr {\n outline: none !important;\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n.separator-selected hr {\n color: white !important;\n border-color: white !important;\n}\n\n/** end separator */\n\n\n\n\n#linkBoxInput{\n\n}\n\n.content-data input:focus,\n#linkBoxInput:focus {\n outline: 2px solid #4A90E2;\n box-shadow: 0 0 5px rgba(74, 144, 226, 0.5);\n}\n\n\n.d-none{\n display: none !important;\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n font: inherit;\n line-height: normal;\n}\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n}\n\n.list-item-checkable input {\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n background-color: white;\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n margin-bottom: 200px;\n}\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n font-size: 0.86rem;\n color: #37352fd9;\n font-weight: 600;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper ul {\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper>button {\n color: #37352fd9;\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.item>button,\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n cursor: pointer;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n /* background-color: inherit; */\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n.johannes-editor *::selection {\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #feebeb;\n border-color: #FDDEDE;\n}\n\n.callout-background-green {\n background-color: #ebfbee;\n border-color: #D7F7DC;\n}\n\n.callout-background-blue {\n background-color: #e8f4fa;\n border-color: #D9EDF6;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #FAF4D1;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #E1E0E0;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #37352fd9;\n font-weight: 600;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n.embed-content button {\n cursor: pointer;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Resize handler */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n/** Resize handler **/\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n\n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n cursor: pointer;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n /* color: inherit; */\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: #2383e2;\n color: white;\n border: none;\n padding: 3px;\n border-radius: 5px;\n font-weight: 500;\n}\n\n\n/** separator **/\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n.separator-wrapper hr {\n outline: none !important;\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n.separator-selected hr {\n color: white !important;\n border-color: white !important;\n}\n\n/** end separator */\n\n\n\n\n#linkBoxInput{\n\n}\n\n.content-data input:focus,\n#linkBoxInput:focus {\n outline: 2px solid #4A90E2;\n box-shadow: 0 0 5px rgba(74, 144, 226, 0.5);\n}\n\n\n.d-none{\n display: none !important;\n}'],sourceRoot:""}]);const s=l},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var l={};if(o)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[t].concat([r]).join("\n")}return[t].join("\n")}},72:e=>{var t=[];function n(e){for(var n=-1,o=0;o{var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var o,i,r,l,s,a,c,d,u,m,h,A,p,C,g,b,E,f=n(72),B=n.n(f),v=n(825),w=n.n(v),I=n(659),k=n.n(I),y=n(56),x=n.n(y),T=n(540),S=n.n(T),L=n(113),M=n.n(L),N=n(282),q={};q.styleTagTransform=M(),q.setAttributes=x(),q.insert=k().bind(null,"head"),q.domAPI=w(),q.insertStyleElement=S(),B()(N.A,q),N.A&&N.A.locals&&N.A.locals,function(e){e.Paragraph="p",e.Heading_1="h1",e.Heading_2="h2",e.Heading_3="h3",e.Heading_4="h4",e.Heading_5="h5",e.Heading_6="h6",e.CheckList="checkList",e.BulletedList="bulletedList",e.NumberedList="numberedList",e.List="list",e.Table="table",e.Image="image",e.Script="script",e.Iframe="iframe"}(o||(o={}));class O{static generateUniqueId(){const e=Date.now().toString(36),t=new Uint32Array(1);return window.crypto.getRandomValues(t),e+t[0].toString(36)}static rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join("")}static isValidUrl(e){const t=new RegExp("^(https?:\\/\\/)(?!-)[a-zA-Z\\d-]{1,63}(?H.blockParagraph(e)}static paragraphCreator(){return e=>H.paragraph(e)}static headingCreator(e){return t=>H.heading(e,t)}static checkboxItemCreator(){return e=>H.checkboxItem(e||"")}static listItemCreator(){return e=>H.listItem_2(e)}static dragHandleButtonCreator(){return()=>H.dragHandleButton()}static codeCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","ignore-events");const n=document.createElement("div");n.classList.add("code-block","ignore-quick-menu","ignore-text-floating-toolbar");const o=document.createElement("pre");o.classList.add(r.IncludeBlockToolbarClass,r.LanguageSelectionToolClass,r.ExtraOptionsClass);const i=document.createElement("code");return i.contentEditable="true",i.setAttribute("data-placeholder","/* Code snippet */"),i.textContent=e||"",i.classList.add("johannes-code","focusable","hljs","language-plaintext","editable"),i.setAttribute("spellCheck","false"),o.appendChild(i),i.addEventListener("blur",(()=>{i.removeAttribute("data-highlighted"),hljs.highlightElement(i)})),n.appendChild(o),t.appendChild(n),hljs.highlightElement(i),t}}static quoteCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","swittable");const n=document.createElement("blockquote");return n.classList.add("focusable","editable"),n.textContent=e||"",n.contentEditable="true",n.setAttribute("data-placeholder",H.getRandomQuote()),t.appendChild(n),t}}static getRandomQuote(){const e=["Talk is cheap. Show me the code. - Linus Torvalds","Premature optimization is the root of all evil. - Donald Knuth","The most dangerous phrase in the language is, 'We've always done it this way.' - Grace Hopper","Simplicity is prerequisite for reliability. - Edsger W. Dijkstra","Any fool can write code that a computer can understand. Good programmers write code that humans can understand. - Martin Fowler","First, solve the problem. Then, write the code. - John Johnson","In programming, the hard part isn't solving problems, but deciding what problems to solve. - Paul Graham","Code is like humor. When you have to explain it, it's bad. - Cory House","Make it work, make it right, make it fast. - Kent Beck","Before software can be reusable it first has to be usable. - Ralph Johnson"];return e[Math.floor(Math.random()*e.length)]}static checkListCreator(){return e=>{const t=document.createElement("ul");t.classList.add("johannes-content-element","swittable","list","checkbox-list"),t.setAttribute("data-content-type",o.CheckList);const n=H.checkboxItem(e||"");return t.appendChild(n),t}}static bulletedListCreator(){return e=>{const t=document.createElement("ul");t.setAttribute("data-content-type",o.BulletedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=H.listItem_2(e||"");return t.appendChild(n),t}}static numberedListCreator(){return e=>{const t=document.createElement("ol");t.setAttribute("data-content-type",o.NumberedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=H.listItem_2(e||"");return t.appendChild(n),t}}static tableCreator(){return e=>{const t=document.createElement("div");t.classList.add("table-shell","ignore-quick-menu");const n=document.createElement("div");n.classList.add("table-controller");const i=document.createElement("div");i.classList.add("table-wrapper");const l=document.createElement("table");l.classList.add("johannes-content-element","swittable","table",r.IncludeBlockToolbarClass,r.AlignToolClass,r.ExtraOptionsClass),l.setAttribute("data-content-type",o.Table),t.appendChild(n),n.appendChild(i),i.appendChild(l);const s=document.createElement("tbody");l.appendChild(s);const a=e?e.split(","):[],c=document.createElement("tr");a.forEach((e=>{const t=document.createElement("td");t.classList.add("focusable","editable"),t.setAttribute("data-placeholder","cell"),t.textContent=e,t.contentEditable="true",c.appendChild(t)})),s.appendChild(c);const d=document.createElement("div");d.classList.add("add-table-row"),d.innerHTML='';const u=document.createElement("div");return u.classList.add("add-table-column"),u.innerHTML='',n.appendChild(d),n.appendChild(u),t}}static placeholderCreator(e,t,n,o=[]){return i=>{const s=document.createElement("div");s.classList.add(l.ContentElement,"swittable","no-selection",r.IncludeBlockToolbarClass,r.ExtraOptionsClass),s.setAttribute("data-content-type",e);const a=document.createElement("div");a.classList.add("content-placeholder",l.ShowMediaInputOnClick,...o);const c=this.createIcon(t),d=document.createElement("span");return d.classList.add("no-selection"),d.innerText=n,s.appendChild(a),a.appendChild(c),a.appendChild(d),s}}static calloutCreator(){return e=>{const t=document.createElement("div");t.classList.add("ignore-quick-menu","callout","johannes-content-element","swittable",r.IncludeBlockToolbarClass,r.ColorToolClass,r.ExtraOptionsClass);const n=document.createElement("div");n.classList.add("callout-background-grey","callout-wrapper");const o=document.createElement("p");return o.setAttribute("data-placeholder","Type something..."),o.contentEditable="true",o.classList.add("callout-text","editable","focusable"),n.appendChild(o),t.appendChild(n),t}}static separatorCreator(){return()=>{const e=document.createElement("div");e.classList.add("johannes-content-element");const t=document.createElement("div");t.classList.add("separator-wrapper");const n=document.createElement("hr");return n.classList.add("separator"),t.appendChild(n),e.appendChild(t),e}}static paragraph(e=null){const t=document.createElement("p");return t.innerText=e||"",t.contentEditable="true",t.setAttribute("data-content-type",o.Paragraph),t.classList.add("johannes-content-element","swittable","focusable","key-trigger","editable"),t.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),t}static heading(e,t=null){const n=document.createElement(`h${e}`);return n.innerText=t||"",n.contentEditable="true",n.setAttribute("data-content-type",`h${e}`),n.classList.add("johannes-content-element","swittable","focusable","focus","key-trigger","editable"),n.setAttribute("data-placeholder",`Heading ${e}`),n}static checkboxItem(e){const t=O.generateUniqueId();let n=document.createElement("li");n.classList.add("deletable","no-list-style","list-item","list-item-checkable");let o=document.createElement("input");o.id=t,o.setAttribute("type","checkbox");let i=document.createElement("div");return i.textContent=e,i.setAttribute("data-placeholder","To-do"),i.contentEditable="true",i.setAttribute("for",t),i.classList.add("focusable","editable","focus"),n.appendChild(o),n.appendChild(i),n}static listItem_2(e=null){let t=document.createElement("li");t.classList.add("deletable"),t.classList.add("list-item");const n=document.createElement("div");return n.classList.add("focusable","editable","focus","key-trigger"),n.contentEditable="true",n.setAttribute("data-placeholder","Item"),t.appendChild(n),n.innerText=e||"",t}static blockParagraph(e=null){let t=document.createElement("div");t.id=`b-${O.generateUniqueId()}`;let n=H.paragraph(e);return t.appendChild(n),t.classList.add("block"),t.classList.add("deletable"),t}static dragHandleButton(){const e=document.createElement("div");e.classList.add("drag-handler-wrapper",l.EditorOnly);let t=document.createElement("button");return t.innerHTML='',t.classList.add(l.EditorOnly,"drag-handler","button-reset"),t.draggable=!0,e.appendChild(t),e}static createIcon(e){let t=document.createElement("div");return t.classList.add("icon-wrapper"),t.innerHTML=``,t}}!function(e){e.ColorChangeRequest="ColorChangeRequest",e.ShowHideActiveButton="ShowHideActiveButton",e.ResetActiveButtons="ResetActiveButtons",e.CloseElement="HideComponent",e.ShowElement="ShowElement",e.ChangeBlockToolbarLanguage="ChangeBlockToolbarLanguage"}(s||(s={}));class R{id;_canHide;classList=[];props;htmlElement;parent;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}setId(e){this.id=e,this.htmlElement.id=e}addCssClass(...e){this.classList.push(...e),this.htmlElement.classList.add(...e)}appendTo(e){this.parent=e,e.htmlElement.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this.htmlElement.style.display=this.display}hide(){this.htmlElement.style.display="none"}lockHide(){this._canHide=!1}unlockHide(){this._canHide=!0}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,t=this.htmlElement.style.visibility,n=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=t,this.htmlElement.style.position=n),o.right>i||o.left<0}ensureVisible(){this.htmlElement.closest("select, ul")?this.htmlElement.scrollIntoView({behavior:"smooth",block:"nearest",inline:"start"}):console.warn("Attempted to make a non-relevant item visible")}handleCloseElementEvent(e){const t=e.detail;this.id&&this.id==t.targetId&&(e.stopImmediatePropagation(),this.hide())}handleShowElementEvent(e){e.detail.targetId==this.id&&(e.stopImmediatePropagation(),this.show())}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this)),document.addEventListener(s.ShowElement,this.handleShowElementEvent.bind(this))}}class D{static instance=new D;dependencies={};constructor(){}static get Instance(){return D.instance}register(e,t){this.dependencies[e]=t}resolve(e){if(!this.dependencies[e])throw new Error(`Dependency ${e} not found.`);return this.dependencies[e]()}}!function(e){e.Load="load",e.Mouseenter="mouseenter",e.Mouseleave="mouseleave",e.Mousedown="mousedown",e.Mousemove="mousemove",e.Mouseup="mouseup",e.Mouseover="mouseover",e.Keyup="keyup",e.Keydown="keydown",e.Blur="blur",e.SelectStart="selectstart",e.SelectionChange="selectionchange",e.Click="click",e.Focusin="focusin",e.Focusout="focusout",e.DOMContentLoaded="DOMContentLoaded",e.Input="input",e.BblClick="dblclick"}(a||(a={}));class P{static isSelectionInTableCell(){let e=window.getSelection();if(!e?.rangeCount)return!1;let t=e.anchorNode;for(;t;){if(t.nodeType===Node.ELEMENT_NODE&&("TD"===t.tagName||"TH"===t.tagName))return!0;t=t.parentNode}return!1}static getSelectionTextInfo(e){let t,n,o=!1,i=!1;if(""==e.textContent)return o=!0,i=!0,{atStart:o,atEnd:i};const r=window.getSelection();return r&&r.rangeCount>0&&(t=r.getRangeAt(0),n=document.createRange(),n.selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),o=""===n.toString(),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),i=""===n.toString()),{atStart:o,atEnd:i}}static insertAfter(e,t){t.parentNode&&t.parentNode.insertBefore(e,t.nextSibling)}static hasTextContent(e){return""!==e.textContent?.trim()||e.hasChildNodes()&&Array.from(e.childNodes).some((e=>this.hasTextContent(e)))}static cloneAndInsertAfter(e){const t=e.cloneNode(!0),n=e.parentNode;if(!n)return null;if(n.insertBefore(t,e.nextSibling),t.id){const e=t.id.match(/^(.+?)-/);if(e){const n=e[1];t.id=n+"-"+O.generateUniqueId()}else t.id=O.generateUniqueId()}return t}static findClosestAncestorOfActiveElementByClass(e){const t=document.activeElement;if(!t)return null;let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static findClosestAncestorOfSelectionByClass(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;for(n&&n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static rearrangeContentAfterSplit(e,t){const n=P.getCursorPosition(e),o=this.splitContentAtCursorSelection(e);if(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(o[1]),document.getSelection()?.deleteFromDocument(),t&&n){this.setCursorPosition(t,n);const e=this.splitContentAtCursorSelection(t);document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e[0]),document.getSelection()?.deleteFromDocument()}}static getCursorPosition(e){const t=window.getSelection();if(!t||!e)return null;const n=t.getRangeAt(0);if(!n.intersectsNode(e))return null;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>NodeFilter.FILTER_ACCEPT});let i=0,r=o.firstChild();for(;r;){if(r===n.startContainer){i+=n.startOffset;break}i+=r.textContent?.length||0,r=o.nextNode()}return i}static setCursorPosition(e,t){const n=window.getSelection();if(!n)return;n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:()=>NodeFilter.FILTER_ACCEPT});let r=i.nextNode(),l=0;for(;r;){const e=r.textContent?.length||0;if(l+e>=t){o.setStart(r,t-l),o.collapse(!0);break}l+=e,r=i.nextNode()}n.addRange(o)}static getContentTypeFromActiveElement(){const e=P.getCurrentActiveBlock(),t=e?.querySelector(".johannes-content-element");return t&&t.getAttribute("data-content-type")||null}static splitContentAtCursorSelection(e){const t=[],n=window.getSelection();if(!n||0===n.rangeCount)return t;const o=n.getRangeAt(0),i=document.createRange();i.selectNodeContents(e),i.setEnd(o.startContainer,o.startOffset);const r=document.createRange();return r.selectNodeContents(e),r.setStart(o.endContainer,o.endOffset),e.lastChild&&r.setEndAfter(e.lastChild),t.push(i),t.push(r),t}static placeCursorAtStartOfEditableElement(e){setTimeout((()=>{if(e.isContentEditable){e.focus();const t=document.createRange();t.selectNodeContents(e),t.collapse(!0);const n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}else console.warn("The element is not editable.")}))}static placeCursorAtEndOfEditableElement(e){e.isContentEditable?requestAnimationFrame((()=>{e.focus();const t=document.createRange(),n=window.getSelection();t.selectNodeContents(e);let o=e;for(;o.lastChild;)o=o.lastChild;t.setEnd(o,o.nodeType===Node.TEXT_NODE?o.textContent.length:0),t.collapse(!1),n?.removeAllRanges(),n?.addRange(t)})):console.warn("The element is not editable.")}static getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}static isSelectedTextDescendantOf(e){const t=document.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).startContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!!n&&null!==n.closest(e)}static removeFilterText(){let e=null;const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0),o=n.commonAncestorContainer;if(o.nodeType===Node.TEXT_NODE&&o.parentElement?.isContentEditable){let i=o,r=n.startOffset;for(;i&&r>0;){if(e=(i.textContent?.substring(0,r)||"").lastIndexOf("/"),-1!==e){n.setStart(i,e),n.deleteContents();break}r=i.parentNode?.textContent?.lastIndexOf("/")||-1,i=i.parentNode}t.removeAllRanges(),t.addRange(n)}else console.warn("The cursor is not within a contentEditable element or a text node.")}else console.warn("No active selection.");return e}static findClickedElementOrAncestorByDataContentType(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.dataset.contentType===t)return n;let o=n.parentElement;for(;o;){if(o.dataset.contentType===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorById(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.id===t)return n;let o=n.parentElement;for(;o;){if(o.id===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorByClass(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.classList.contains(t))return n;let o=n.parentElement;for(;o;){if(o.classList.contains(t))return o;o=o.parentElement}return null}static isEventTargetDescendantOf(e,t){let n=e.target;if(!(e.target instanceof Element))return!1;for(;n&&n!==document.documentElement;){if(n.matches(t))return!0;n=n.parentElement}return!1}static getParentTargetBySelector(e,t){let n=e.target instanceof Element?e.target:e.target instanceof Node?e.target.parentElement:null;if(!n)return null;for(;n&&n!==document.documentElement;){if(n.matches(t))return n;n=n.parentElement}return null}static getParentFromSelection(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;if(n instanceof Element&&n.matches(e))return n;let o=n instanceof Element?n:n.parentElement;for(;o&&o!==document.documentElement;){if(o.matches(e))return o;o=o.parentElement}return null}static removeClassesWithPrefix(e,t){Array.from(e.classList).filter((e=>e.startsWith(t))).forEach((t=>e.classList.remove(t)))}static isTargetDescendantOfSelector(e,t){let n=null;return e.target instanceof HTMLElement?n=e.target:e.target instanceof Text&&(n=e.target.parentElement),!!n&&null!==n.closest(t)}static querySelectorIncludingSelf(e,t){return e.matches(t)?e:e.querySelector(t)}static sanitizeContentEditable(e){const t=e.innerHTML,n=window.getSelection();if(!n)return;let o=!1,i=0;if(n.rangeCount>0){const r=n.getRangeAt(0);r.endOffset===e.innerText.length&&t.endsWith("
")&&(o=!0,i=r.endOffset)}if(t.endsWith("
")){const t=e.lastChild;t&&"BR"===t.nodeName&&e.removeChild(t)}if(o){const t=new Range,o=this.getTextNodesIn(e);let r=0;for(const e of o){const n=e.length;if(r+n>=i){t.setStart(e,i-r),t.setEnd(e,i-r);break}r+=n}n.removeAllRanges(),n.addRange(t)}}static getTextNodesIn(e){let t=[];if(e.nodeType===Node.TEXT_NODE)t.push(e);else{const n=e.childNodes;for(let e=0;e0?t[n-1]:null}static getNextContentEditable(e){const t=Array.from(document.querySelectorAll('[contenteditable="true"]')),n=t.indexOf(e);return n0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left}}return{charIndex:0,horizontalPos:0}}static restoreCaretPosition2d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos);if(i0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left,verticalPos:n.top}}return{charIndex:0,horizontalPos:0,verticalPos:0}}static restoreCaretPosition3d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos),c=Math.abs(n.top-t.verticalPos),d=Math.sqrt(i**2+c**2);if(d0;)o.appendChild(o.nextSibling.firstChild);e.removeChild(o.nextSibling)}P.mergeInlineElements(o)}}}}!function(e){e.floatingToolbarDisplayed="floatingToolbarDisplayed",e.anchorButtonClicked="anchorButtonClicked",e.boldButtonClicked="boldButtonClicked",e.italicButtonClicked="italicButtonClicked",e.underlineButtonClicked="underlineButtonClicked",e.inlineCodeButtonClicked="inlineCodeButtonClicked",e.strikeThroughButtonClicked="strikeThroughButtonClicked",e.hiliteColorButtonClicked="hiliteColorButtonClicked",e.foreColorButtonClicked="foreColorButtonClicked",e.buttonGroupItemClicked="buttonGroupItemClicked",e.focusOnFirstRequested="focusOnFirstRequested",e.pressedEnterOnTitle="pressedEnterOnTitle",e.transformBlockRequested="transformBlockRequested",e.duplicateBlockRequested="duplicateBlockRequested",e.anchor="anchor",e.bold="bold",e.italic="italic",e.underline="underline",e.inlineCode="inlineCode",e.strikeThrough="strikeThrough",e.hiliteColor="hiliteColor",e.foreColor="foreColor",e.textFormatChanged="textFormatChanged",e.emittedCommand="emittedCommand",e.blockTypeChanged="blockTypeChanged",e.blockDeleted="blockDeleted",e.blockCloned="blockCloned",e.tableCellChanged="tableCellChanged"}(c||(c={})),function(e){e.LowImportance="100",e.SlightlyImportant="200",e.Neutral="300",e.ModeratelyImportant="400",e.VeryImportant="500",e.ExtremelyImportant="600"}(d||(d={}));class F extends R{dropdowns;separators;currentSelectionRange;htmlFocusedElementBeforeOpenQuickMenu;constructor(e){super({id:e}),this.dropdowns=[],this.separators=[],this.currentSelectionRange=null,this.htmlFocusedElementBeforeOpenQuickMenu=null}init(){const e=document.createElement("div");e.id=this.props.id,e.style.display="none",e.classList.add("floating-toolbar","select-wrapper","soft-box-shadow"),e.style.zIndex=d.SlightlyImportant;const t=document.createElement("div");return e.appendChild(t),e}get display(){return"flex"}hide(){this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.currentSelectionRange=null,super.hide())}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendButtonGroup(e){this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.separators.push(e),this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener(c.blockDeleted,(()=>{this.hide()})),document.addEventListener(c.blockTypeChanged,(()=>{this.hide()}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}!function(e){e.HiliteColorRed="#FDDEDE",e.HiliteColorGreen="#D7F7DC",e.HiliteColorBlue="#D9EDF6",e.HiliteColorYellow="#FAF4D1",e.HiliteColorGrey="#E1E0E0",e.HiliteColorNone="transparent",e.BackgroundColorCellRed="#FDDEDE",e.BackgroundColorCellGreen="#D7F7DC",e.BackgroundColorCellBlue="#D9EDF6",e.BackgroundColorCellYellow="#FAF4D1",e.BackgroundColorCellGrey="#E1E0E0",e.BackgroundColorCellNone="transparent",e.ForeColorRed="#D44C47",e.ForeColorGreen="#448361",e.ForeColorBlue="#337EA9",e.ForeColorYellow="#CB912F",e.ForeColorGrey="#787774",e.ForeColorInitial="initial",e.BackgroundColorRed="#FDDEDE",e.BackgroundColorGreen="#D7F7DC",e.BackgroundColorBlue="#D9EDF6",e.BackgroundColorYellow="#FAF4D1",e.BackgroundColorGrey="#E1E0E0",e.BackgroundColorNone="transparent",e.IconActiveBlue="#2382e2",e.IconDefaultBlack="#37352fd9",e.Red="red",e.Tomato="#EB5757",e.OriginalTableColor="#84888d"}(u||(u={})),function(e){e.CalloutBackgroundRed="callout-background-red",e.CalloutBackgroundGreen="callout-background-green",e.CalloutBackgroundBlue="callout-background-blue",e.CalloutBackgroundYellow="callout-background-yellow",e.CalloutBackgroundGrey="callout-background-grey",e.CalloutBackgroundNone="callout-background-none"}(m||(m={})),function(e){e.toggleBold="bold",e.toggleItalic="italic",e.toggleHiliteColor="hiliteColor",e.changeCalloutBackgroundColor="changeCalloutBackgroundColor",e.toggleForeColor="foreColor",e.toggleInlineCode="inlineCode",e.toggleLink="createLink",e.linkReadyToInsert="linkReadyToInsert",e.toggleUnderline="underline",e.toggleStrikeThrough="strikeThrough",e.removeFormat="removeFormat",e.copySelected="copySelected",e.cutSelected="cutSelected",e.past="past",e.transformBlock="transformBlock",e.duplicateBlock="duplicateBlock",e.deleteBlock="deleteBlock",e.createDefaultBlock="createDefaultBlock",e.focusOnNextBlock="focusOnNextBlock",e.focusOnPreviousBlock="focusOnPreviousBlock",e.mergeWithPreviousBlock="mergeWithPreviousBlock",e.mergeWithNextBlock="mergeWithNextBlock",e.focusOnFirstBlock="focusOnFirstBlock",e.deleteBlockAndFocusOnPrevious="deleteBlockAndFocusOnPrevious",e.deleteBlockAndFocusOnNext="deleteBlockAndFocusOnNext",e.JustifyLeft="justifyLeft",e.JustifyCenter="justifyCenter",e.JustifyRight="justifyRight",e.insertNew="insertNew",e.insertTableRowAbove="insertTableRowAbove",e.insertTableRowBelow="insertTableRowBelow",e.insertTableColumnLeft="insertTableColumnLeft",e.insertTableColumnRight="insertTableColumnRight",e.showInsertTableColumnElement="showInsertTableColumnElement",e.showInsertTableRowElement="showInsertTableRowElement",e.hideInsertTableColumnElement="hideInsertTableColumnElement",e.hideInsertTableRowElement="hideInsertTableRowElement",e.toggleCellHiliteColor="toggleCellHiliteColor",e.removeColumn="removeColumn",e.removeRow="removeRow",e.changeTableBorderColor="changeTableBorderColor",e.changeCodeBlockLanguage="changeCodeBlockLanguage"}(h||(h={}));class _{color;constructor(e){this.color=e}}class V{classKey;value;intention;constructor(e,t,n){this.classKey=e,this.value=t,this.intention=n}}class j{classKey;constructor(e){this.classKey=e}}class Y{}class z{}class U{language;blockId;constructor(e,t){this.blockId=e,this.language=t}}class G{static emitCodeBlockLanguageChangedEvent(e,t,n){const o=new CustomEvent(s.ChangeBlockToolbarLanguage,{detail:{targetClass:e,action:new U(t,n)}});document.dispatchEvent(o)}static emitShowElementEvent(e){const t=new CustomEvent(s.ShowElement,{detail:{targetId:e,action:new z}});document.dispatchEvent(t)}static emitCloseElementEvent(e){const t=new CustomEvent(s.CloseElement,{detail:{targetId:e,action:new Y}});document.dispatchEvent(t)}static emitChangeComponentColorEvent(e,t){const n=new CustomEvent(s.ColorChangeRequest,{detail:{targetId:e,action:new _(t)}});document.dispatchEvent(n)}static emitShowHideActiveElementEvent(e,t,n){"hiliteColor"==e&&t==u.HiliteColorNone&&(n="hide"),"foreColor"==e&&t==u.ForeColorInitial&&(n="hide"),"backgroundColor"==e&&t==u.BackgroundColorNone&&(n="hide");const o=new CustomEvent(s.ShowHideActiveButton,{detail:{targetClass:e,action:new V(e,t,n)}});document.dispatchEvent(o)}static emitResetActiveButtonsElementEvent(e){const t=new CustomEvent(s.ResetActiveButtons,{detail:{targetClass:e,action:new j(e)}});document.dispatchEvent(t)}static emitChangeTableBorderColorEvent(e,t){const n=new CustomEvent(c.emittedCommand,{detail:{command:h.changeTableBorderColor,value:t,scope:e}});document.dispatchEvent(n)}}!function(e){e.Link="linkButton",e.Bold="boldButton",e.Italic="italicButton",e.Underline="underlineButton",e.InlineCode="inlineCodeButton",e.Strikethrough="strikethroughButton",e.AlignLeft="alignLeft",e.AlignCenter="alignCenter",e.AlignRight="alignRight"}(A||(A={})),function(e){e.Shift="Shift",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Control="Control",e.Space=" ",e.Delete="Delete"}(p||(p={}));class Z extends F{static id="textFloatingToolbar";static instance;textOperationsService;initialRect=null;lockedHide=!1;debounceTimer=null;constructor(e){if(Z.instance)throw new Error("Use TextContextFloatingToolbar.getInstance() to get instance.");super(Z.id),this.htmlElement.style.zIndex=d.VeryImportant,this.textOperationsService=e,this.attachEvents()}static getInstance(){const e=D.Instance.resolve("ITextOperationsService");return Z.instance||(Z.instance=new Z(e)),Z.instance}processSelectionChangeEffects(){setTimeout((()=>{G.emitResetActiveButtonsElementEvent("hiliteColor"),G.emitResetActiveButtonsElementEvent("foreColor");const e=this.textOperationsService.queryCommandState("createLink"),t=this.textOperationsService.queryCommandState("bold"),n=this.textOperationsService.queryCommandState("italic"),o=this.textOperationsService.queryCommandState("underline"),i=this.textOperationsService.queryCommandState("inlineCode"),r=this.textOperationsService.queryCommandState("strikeThrough"),l={};l[u.HiliteColorRed]=this.textOperationsService.queryHiliteColor(u.HiliteColorRed),l[u.HiliteColorGreen]=this.textOperationsService.queryHiliteColor(u.HiliteColorGreen),l[u.HiliteColorBlue]=this.textOperationsService.queryHiliteColor(u.HiliteColorBlue),l[u.HiliteColorYellow]=this.textOperationsService.queryHiliteColor(u.HiliteColorYellow),l[u.HiliteColorGrey]=this.textOperationsService.queryHiliteColor(u.HiliteColorGrey);const s={};s[u.ForeColorRed]=this.textOperationsService.queryForeColor(u.ForeColorRed),s[u.ForeColorGreen]=this.textOperationsService.queryForeColor(u.ForeColorGreen),s[u.ForeColorBlue]=this.textOperationsService.queryForeColor(u.ForeColorBlue),s[u.ForeColorYellow]=this.textOperationsService.queryForeColor(u.ForeColorYellow),s[u.ForeColorGrey]=this.textOperationsService.queryForeColor(u.ForeColorGrey),Object.entries(l).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")})),Object.entries(s).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("foreColor",e,"show")})),this.emitChangeComponentColorEvent(e,A.Link),this.emitChangeComponentColorEvent(t,A.Bold),this.emitChangeComponentColorEvent(n,A.Italic),this.emitChangeComponentColorEvent(i,A.InlineCode),this.emitChangeComponentColorEvent(o,A.Underline),this.emitChangeComponentColorEvent(r,A.Strikethrough)}),20)}emitChangeComponentColorEvent(e,t){e?G.emitChangeComponentColorEvent(t,u.IconActiveBlue):G.emitChangeComponentColorEvent(t,u.IconDefaultBlack)}processAfterChange(e){const t=document.getSelection();t&&!t.isCollapsed&&this.processSelectionChangeEffects()}attachEvents(){let e,t=!1;this.htmlElement.addEventListener(a.Mouseup,(e=>{e.preventDefault()})),document.addEventListener(a.Mouseup,this.processAfterChange.bind(this)),document.addEventListener(a.BblClick,this.processAfterChange.bind(this)),document.addEventListener(a.SelectionChange,this.processAfterChange.bind(this)),document.addEventListener(a.Keydown,(e=>{e.shiftKey&&(t=!0)})),document.addEventListener(a.Keyup,(e=>{e.key===p.Shift&&(t=!1,this.showHide(e,t))})),document.addEventListener(a.Mousedown,(()=>{t=!0})),document.addEventListener(a.Mouseup,(n=>{t=!1,this.showHide(n,t),clearTimeout(e),e=setTimeout((()=>{t=!1,this.showHide(n,t)}),100)})),document.addEventListener(a.SelectionChange,(e=>{this.showHide(e,t)})),document.addEventListener(a.Keydown,(e=>{setTimeout((()=>{this.canHide&&e.key===p.Escape&&!this.lockedHide&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide())}),10)})),super.attachEvents()}shouldUpdatePosition(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0).getBoundingClientRect();return!this.initialRect||(Math.abs(t.left-this.initialRect.left)>10||Math.abs(t.top-this.initialRect.top)>10)}showHide(e,t){const n=this.hasSelection();if(!n){if(this.lockedHide)return;return this.hide(),void(this.initialRect=null)}if(n&&!t)if(this.isVisible){if(this.shouldUpdatePosition()&&(P.isSelectedTextDescendantOf(".gist")||P.isSelectedTextDescendantOf(".gist")))return}else{if(P.isSelectedTextDescendantOf(".ignore-text-floating-toolbar")||P.isSelectedTextDescendantOf(".gist"))return;this.show()}}hasSelection(){const e=window.getSelection();return!!(e&&e.rangeCount>0&&""!==e.toString().trim())}changeToolbarPositionToBeClosedToSelection(){const e=window.getSelection();if(!e||0===e.rangeCount)return void console.error("No selection found");this.currentSelectionRange=e.getRangeAt(0);const t=this.currentSelectionRange.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20);const a=this.htmlElement.offsetHeight;let c=i+window.scrollY-a-10;c<0&&(c=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${c}px`}show(){const e=window.getSelection();e&&0!==e.rangeCount?P.findClosestAncestorOfActiveElementByClass("title")||(this.changeToolbarPositionToBeClosedToSelection(),this.hideTurnIntoDropdownIfInCell()):console.error("No selection found")}hideTurnIntoDropdownIfInCell(){const e=P.isSelectionInTableCell();this.dropdowns.forEach((t=>{"turnIntoMenu"==t.id&&(t.htmlElement.style.display=e?"none":this.display)})),this.separators.forEach((t=>{"turnIntoSeparator"==t.id&&(t.htmlElement.style.display=e?"none":this.display)}))}updatePosition(){const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0).getBoundingClientRect();this.setPosition(t)}}setPosition(e){const t=this.htmlElement.offsetWidth;let n=e.left+window.scrollX-50;n+t>window.innerWidth&&(n=window.innerWidth-t-20);const o=this.htmlElement.offsetHeight;let i=e.top+window.scrollY-o-10;i<0&&(i=e.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}hide(){this.canHide&&(this.currentSelectionRange=null,super.hide())}lockHide(){this.lockedHide=!0}unlockHide(){this.lockedHide=!1}}class K extends R{parentWrapper;constructor(){super({})}init(){const e=document.createElement("input");return e.id="linkBoxInput",e.type="url",e.placeholder="Paste or type a link...",e.style.position="relative",e}setParentWrapper(e){this.parentWrapper=e}}class W extends R{inputLinkBox;highlights=[];button;textContextFloatingToolbar;constructor(){const e=new K,t=document.createElement("button");super({inputLinkBox:e,button:t}),this.id="linkBox",this.inputLinkBox=e,this.button=t,e.setParentWrapper(this),this.textContextFloatingToolbar=Z.getInstance(),this.attachEvent()}init(){const e=document.createElement("div");e.id="linkBox",e.style.display="none",e.classList.add("dependent-box","soft-box-shadow"),e.style.position="absolute";const t=document.createElement("div");t.classList.add("header"),t.innerText="Link";const n=document.createElement("div");return n.appendChild(this.props.inputLinkBox.htmlElement),n.classList.add("link-box-shell"),this.props.button.classList.add("blue-button"),this.props.button.innerHTML="Insert",n.appendChild(this.props.button),e.appendChild(t),e.appendChild(n),e}attachEvent(){document.addEventListener(a.Keydown,(e=>{this.canHide&&e.key===p.Escape&&(e.stopImmediatePropagation(),this.hide())}),!0),document.addEventListener(a.Keydown,(function(e){e.key===p.Control&&document.body.classList.add("ctrl-active")})),document.addEventListener(a.Keyup,(function(e){e.key===p.Control&&document.body.classList.remove("ctrl-active")})),this.inputLinkBox.htmlElement.addEventListener(a.Keydown,(e=>{e.key==p.Enter&&this.insertLink(e)}),!0),document.addEventListener(a.Click,(e=>{if(e.ctrlKey){const t=e.target;if("A"===t.tagName&&t.getAttribute("href")){const e=t.getAttribute("href");return void window.open(e,"_blank")}}!this.canHide||e.target.closest("#linkBox")||e.target.closest("#textFloatingToolbar")||this.hide()})),this.button.addEventListener(a.Click,this.insertLink.bind(this),!0),super.attachUIEvent()}handleShowElementEvent(e){const t=e.detail;t.targetId!=this.id||this.isVisible?t.targetId==this.id&&this.isVisible&&(e.stopImmediatePropagation(),this.hide()):(e.stopImmediatePropagation(),this.show())}insertLink(e){e.preventDefault(),e.stopImmediatePropagation();const t=this.inputLinkBox.htmlElement.value,n=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;if(O.isValidUrl(n))this.hide(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.linkReadyToInsert,value:n}}));else{const e=this.inputLinkBox.htmlElement;e.style.backgroundColor="rgb(253, 222, 222)",e.classList.add("shake-animation"),setTimeout((()=>{e.classList.remove("shake-animation")}),1e3)}}show(){const e=this.inputLinkBox.htmlElement;e.style.backgroundColor="white",this.textContextFloatingToolbar.lockHide();const t=document.getSelection()?.getRangeAt(0);t&&(this.positionLinkComponentBelowSelection(t),this.highlightSelectedText(t),super.show(),setTimeout((()=>{e.focus()}),100))}positionLinkComponentBelowSelection(e){const t=e.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20),this.htmlElement.offsetHeight;let a=i+window.scrollY+40;a<0&&(a=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${a}px`}hide(){this.textContextFloatingToolbar.unlockHide(),super.hide(),this.removeHighlights(),this.inputLinkBox.htmlElement.value="";const e=this.textContextFloatingToolbar.currentSelectionRange;e&&(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e))}highlightSelectedText(e){const t=e.getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class Q extends R{elementFactoryService;static editorId="johannesEditor";static instance;memento;title;content;addBlock;textFloatingToolbar;quickMenu;tableContextToolbar;mediaInputter;inputLinkBoxWrapper;constructor(e,t,n,o,i,r,l,s,a,c,d){if(super({elementFactoryService:e,blockOperationsService:t,title:o,content:i,addBlock:r,floatingToolbar:l,quickMenu:s,tableToolbar:a,mediaInputter:c,inputLinkBoxWrapper:d}),Q.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.inputLinkBoxWrapper=d,this.elementFactoryService=e,this.memento=n,this.addBlock=r,this.textFloatingToolbar=l,this.quickMenu=s,this.tableContextToolbar=a,this.mediaInputter=c,this.attachEvents(),Q.instance=this,this.memento.saveState()}init(){const e=document.getElementById(Q.editorId)||document.createElement("div");e.classList.add("johannes-editor");const t=document.createElement("div");return t.classList.add("content-wrapper"),window.editorConfig,t.appendChild(this.props.title.htmlElement),t.appendChild(this.props.content.htmlElement),e.appendChild(t),window.editorConfig,e.appendChild(this.props.addBlock.htmlElement),window.editorConfig,e.appendChild(this.props.floatingToolbar.htmlElement),window.editorConfig,e.appendChild(this.props.quickMenu.htmlElement),e.appendChild(this.props.tableToolbar.htmlElement),e.appendChild(this.props.mediaInputter.htmlElement),e.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}static getInstance(e,t,n,o,i,r,l){const s=D.Instance.resolve("IElementFactoryService"),a=D.Instance.resolve("IBlockOperationsService"),c=D.Instance.resolve("IMemento"),d=new W;return Q.instance||(Q.instance=new Q(s,a,c,e,t,n,o,i,r,l,d)),Q.instance}attachEvents(){const e=document.getElementById(Q.editorId);if(e?.addEventListener("mouseover",(e=>{const t=e.target;if(t instanceof Node){let e=t;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const t=e.closest(".block");t&&this.appendDragHandler(t)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",t)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const t=e.clipboardData;if(t){const e=t.getData("text/plain");Q.insertTextAtCursor(e)}}}),!0),this.attachDragHandler()}static insertTextAtCursor(e){const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents();const o=document.createTextNode(e);n.insertNode(o),n.setStartAfter(o),n.setEndAfter(o),t.removeAllRanges(),t.addRange(n)}}appendDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");let n=t?.querySelector(".drag-handler");!n&&t&&(n=this.elementFactoryService.create(H.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(n))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");if(t){const e=t.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}attachDragHandler(){let e=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",this.htmlElement.addEventListener("dragstart",(t=>{t.target?.classList?.contains("drag-handler")&&(e=t.target?.closest(".block"),e.setAttribute("draggable","true"),setTimeout((()=>{e.style.opacity="0.5"}),0))})),this.htmlElement.addEventListener("dragend",(()=>{setTimeout((()=>{e&&(e.style.opacity="",e.removeAttribute("draggable"),e=null),t.remove()}),0)})),this.htmlElement.addEventListener("dragover",(n=>{n.preventDefault();let o=n.target?.closest(".block");if(o&&o!==e){let e=o.getBoundingClientRect(),i=e.y+e.height/2;n.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),this.htmlElement.addEventListener("drop",(n=>{n.preventDefault(),e&&t&&t.parentElement&&(t.parentElement.insertBefore(e,t),t.remove())}))}}class X extends R{blockOperationsService;icon;constructor(e,t){super({icon:t}),this.blockOperationsService=e,this.icon=t,this.attachEvents()}init(){const e=document.createElement("button");return e.title="Add a new block",e.classList.add("add-block","block-operation","pointer"),e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(h.createDefaultBlock,!1)}))}static create(e){const t=D.Instance.resolve("IBlockOperationsService");return new X(t,e)}}class $ extends R{button;constructor(e){super({button:e}),this.button=e}init(){const e=document.createElement("div");return e.classList.add("add-block-wrapper"),e.appendChild(this.props.button.htmlElement),e}static create(e){return new $(e)}}class J{static medium="1rem";static large="1.25rem"}class ee extends R{useElement;constructor(e,t){super({iconId:e,size:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="red !important";let t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.iconId}`),t.style.color="red !important",e.appendChild(t),e.setAttribute("width",this.props.size),e.setAttribute("height",this.props.size),e.setAttribute("fill","currentColor"),e}clone(){return new ee(this.props.iconId,this.props.sizes)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}static create(e,t){return new ee(e,t)}}class te{static build(){return $.create(X.create(ee.create(i.Plus,J.medium)))}}class ne extends R{id;dropdownButton;dropdownList;constructor(e,t,n){super({id:e}),this.id=e,this.dropdownButton=t,this.dropdownList=n,t.appendTo(this),n.appendTo(this)}init(){const e=document.createElement("div");return e.id=this.props.id,e.classList.add("select-wrapper"),e}get display(){return"block"}static create(e,t,n,o=[]){const i=new ne(e+O.generateUniqueId(),t,n);return i.addCssClass(...o),i}}class oe{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let t=0;for(let n of this)e(n.value,t,this),t++}any(e){let t=this.head;for(;t;){if(e(t.value))return!0;if(t=t.nextNode,t===this.head)break}return!1}findFirst(e){if(!this.head)return null;let t=this.head;do{if(e(t.value))return t;t=t.nextNode}while(t&&t!==this.head);return null}findLast(e){if(!this.tail)return null;let t=this.tail;do{if(e(t.value))return t;t=t.previousNode}while(t&&t!==this.tail);return null}find(e){let t=this.head;for(;t;){if(t.value==e)return t;if(t=t.nextNode,t===this.head)break}return null}}class ie{parentList;previousNode;nextNode;value;constructor(e,t){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=t}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let t=this.nextNode;const n=this;for(;t;){if(e(t.value))return t;if(t=t.nextNode,t===n)break}return null}getPreviousSatisfying(e){let t=this.previousNode;const n=this;for(;t&&t!==n;){if(e(t.value))return t;if(t=t.previousNode,t===this)break}return null}}class re extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(t.setPrevious(this.tail),t.setNext(this.head),this.tail.setNext(t),this.head.setPrevious(t),this.tail=t):(this.head=t,this.tail=t,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class le extends R{id;command;value;activeIcon;leftIcon;title;onFocusFunctionList=[];onLoseFocusFunctionList=[];parentDropdownMenuList;constructor(e,t,n,o,i,r,l=null){const s=["list-item","option","option-hover","block-operation","no-list-style","no-selection"],a=new ee("icon-material-small-check",J.medium);a.htmlElement.style.visibility="hidden",o&&i&&(i.style.color=o),super({id:e,classList:s,leftIcon:i,title:r,icon:a,shortcut:l}),this.id=e,this.classList=s,this.leftIcon=i,this.command=n,this.value=o,this.title=r,this.parentDropdownMenuList=t,this.activeIcon=a,this.attachEvents()}addClass(e){this.classList.push(e),this.htmlElement.classList.add(e)}attachOnFocus(e,...t){this.onFocusFunctionList.push((()=>e(...t)))}attachOnLoseFocus(e,...t){this.onLoseFocusFunctionList.push((()=>e(...t)))}get display(){return"flex"}focus(){this.htmlElement.classList.add("option-focused"),this.onFocusFunctionList.forEach((e=>e()))}removeFocus(){this.htmlElement.classList.remove("option-focused"),this.onLoseFocusFunctionList.forEach((e=>e()))}init(){const e=document.createElement("li");e.id=this.props.id;const t=this.props.classList;e.classList.add("pointer",...t),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),this.props.leftIcon&&n.appendChild(this.props.leftIcon);const o=document.createElement("span");if(o.innerText=this.props.title,n.appendChild(o),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const t=document.createElement("span");t.innerText=this.props.shortcut,t.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(t)}return e}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:this.command,value:this.value,block:P.getParentFromSelection(".block")||P.getParentTargetBySelector(e,".block")}});document.dispatchEvent(t)}attachEvents(){this.attachUIEvent(),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousemove,(async()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault(),e.stopImmediatePropagation(),this.emitCommandEvent(e)})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&t.targetClass.includes("code-block-language-menu")){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.value==e.language?this.activeIcon?.changeVisibilityToVisible():this.activeIcon?.changeVisibilityToHidden())}}attachUIEvent(){document.addEventListener(s.ShowHideActiveButton,this.handleShowHideActiveButtonEvent.bind(this)),document.addEventListener(s.ResetActiveButtons,this.handleResetActiveButtonsEvent.bind(this))}handleShowHideActiveButtonEvent(e){const t=e.detail;if(this.classList?.includes(t.targetClass)){const e=t.action,n=e.value;this.value?.toLowerCase()==n.toLowerCase()&&"show"==e.intention&&this.activeIcon?.changeVisibilityToVisible()}}handleResetActiveButtonsEvent(e){const t=e.detail;this.classList?.includes(t.targetClass)&&this.activeIcon?.changeVisibilityToHidden()}}class se extends R{parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;filter="";constructor(e){super({id:e}),this.id=e,this.dropdownItems=new re,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e.style.zIndex=d.ExtremelyImportant,e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener(a.Keydown,(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&(e.stopImmediatePropagation(),e.preventDefault(),this.currentFocusedMenuItem.value.emitCommandEvent(e))}),!0),document.addEventListener(a.Click,(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener(a.Keydown,(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()),e.key!=p.Escape||this.htmlElement.closest(".floating-toolbar")||(e.stopImmediatePropagation(),e.preventDefault(),this.hide()))})),document.addEventListener(a.Keydown,this.handlerKeyDownEvent.bind(this)),document.addEventListener(c.blockCloned,(()=>{this.hide()})),this.attachUIEvent()}handlerKeyDownEvent(e){!this.isVisible||!/^[a-zA-Z]$/.test(e.key)||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey?this.isVisible&&e.key===p.Backspace&&(this.filter=this.filter.slice(0,-1),this.applyFilter()):(e.preventDefault(),this.filter+=e.key,this.applyFilter())}applyFilter(){this.dropdownItems.forEach((e=>{""==e.value||e.value?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())||e.title?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())?e.show():e.hide()}))}show(){this.filter="",this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),this.applyFilter(),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}static create(e,t=[]){const n=new se(e+O.generateUniqueId());return n.addCssClass(...t),n}}class ae extends R{id;constructor(e){super({id:e}),this.id=e}init(){const e=document.createElement("div");return e.id=this.props.id,e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class ce extends R{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e}}class de extends R{command;showUI;icon;constructor(e,t,n){super({title:t,icon:n}),this.command=e,this.showUI=e==h.toggleLink,this.icon=n,this.attachEvents()}init(){const e=document.createElement("button");return e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener(a.Click,(async e=>{const t=P.findClickedElementOrAncestorByClass(e,"block");document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:this.command,showUI:this.showUI,block:t}}))})),document.addEventListener(s.ColorChangeRequest,(e=>{const t=e.detail;this.id==t.targetId&&this.icon.changeColor(t.action.color)}))}static create(e,t,n){return new de(e,t,n)}}class ue extends R{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class me extends R{parentDropdownMenuList;constructor(e,t){super({title:t}),this.parentDropdownMenuList=e}title="";activeIcon;value="";changeActiveIconToVisible(){}getLeftIconBackgroundColor(){return null}resetActiveIcon(){}attachOnLoseFocus(e){throw new Error("Method not implemented.")}attachOnFocus(e){throw new Error("Method not implemented.")}emitCommandEvent(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li");e.classList.add("no-list-style");const t=document.createElement("h3");return t.innerText=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}}!function(e){e.BackgroundOptionRed="BackgroundOptionRed",e.BackgroundOptionGreen="BackgroundOptionRed",e.BackgroundOptionBlue="BackgroundOptionRed",e.BackgroundOptionYellow="BackgroundOptionRed",e.BackgroundOptionGrey="BackgroundOptionRed",e.BackgroundOptionNone="BackgroundOptionRed"}(C||(C={}));class he{static alignTool(){const e=new ce;return de.create(h.JustifyLeft,"Left",ee.create(i.JustifyStart,J.large)).appendTo(e),de.create(h.JustifyCenter,"Center",ee.create(i.JustifyCenter,J.large)).appendTo(e),de.create(h.JustifyRight,"Right",ee.create(i.JustifyEnd,J.large)).appendTo(e),e}static colorTool(){const e=new se("colorInteractiveOptionSelect"+O.generateUniqueId()),t=new pe("colorInteractiveButton"+O.generateUniqueId(),new ue("white").htmlElement,e);t.addCssClass("color-interactive-button");const n=new ne("colorInteractionOptionsMenu"+O.generateUniqueId(),t,e);e.append(new me(e,"Background"));const o=new le(C.BackgroundOptionRed+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("block-toolbox-color");const i=new le(C.BackgroundOptionGreen+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("block-toolbox-color");const r=new le(C.BackgroundOptionBlue+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("block-toolbox-color");const l=new le(C.BackgroundOptionYellow+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("block-toolbox-color");const s=new le(C.BackgroundOptionGrey+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("block-toolbox-color");const a=new le(C.BackgroundOptionNone+O.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundNone,new ue(u.HiliteColorNone).htmlElement,"None");return a.addClass("block-toolbox-color"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static languageSelectionTool(){const e=se.create("languageSelectionInteractiveOptionSelect"),t=pe.create("languageSelectionInteractiveButton","Plain Text",e,!0,["code-block-language-menu","color-interactive-button"]),n=ne.create("languageSelectionInteractionOptionsMenu",t,e);return e.append(new me(e,"Language")),Object.entries(Ae.languageMap).sort(((e,t)=>e[1].localeCompare(t[1]))).forEach((([t,n])=>{const o=new le("languageSelectionItem-"+O.generateUniqueId(),e,h.changeCodeBlockLanguage,t,null,n);"plaintext"==o.value&&o.activeIcon?.changeVisibilityToVisible(),e.append(o)})),n}static extraOptions(){const e=new ee("icon-material-more",J.large),t=se.create("moreInteractiveOptionSelect",["media-more-option-select"]),n=pe.create("moreInteractiveOptionButton",e.htmlElement,t,!1,["moreMediaOptionsButton"]),o=ne.create("moreInteractiveOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("duplicateOption"+O.generateUniqueId(),t,h.duplicateBlock,null,ee.create(i.Duplicate,J.large).htmlElement,"Clone","Ctrl+D"));const r=new le("deleteOption"+O.generateUniqueId(),t,h.deleteBlock,null,ee.create(i.Trash,J.large).htmlElement,"Delete","Shift+Del");return r.addCssClass("danger-option"),t.append(r),o}}!function(e){e.TD="td",e.TABLE="table"}(g||(g={}));class Ae{static instance;static languageMap={ada:"Ada",apache:"Apache Config",applescript:"AppleScript",arduino:"Arduino",asciidoc:"AsciiDoc",bash:"Bash",basic:"BASIC",c:"C",csharp:"C#",cpp:"C++",css:"CSS",coffeescript:"CoffeeScript",dart:"Dart",go:"Go",html:"HTML",java:"Java",javascript:"JavaScript",json:"JSON",markdown:"Markdown",perl:"Perl",php:"PHP",plaintext:"Plain Text",python:"Python",ruby:"Ruby",scss:"SCSS",shell:"Shell",sql:"SQL",typescript:"TypeScript",xml:"XML",yaml:"YAML"};constructor(){if(Ae.instance)throw new Error("Use BlockToolbox.getInstance() to get instance.");this.attachEvents()}static getInstance(){return Ae.instance||(Ae.instance=new Ae),Ae.instance}listen(){console.log("Listening block toolboxes...")}attachEvents(){document.addEventListener(a.Mouseover,this.insertToolboxIntoBlockOnce.bind(this)),document.addEventListener(a.Focusin,this.handleTableBehaviorFocusIn.bind(this)),document.addEventListener(a.Focusout,this.handleTableBehaviorFocusOut.bind(this)),document.addEventListener(a.Click,this.handleClickEvent.bind(this))}handleClickEvent(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}handleTableBehaviorFocusIn(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!0)}handleTableBehaviorFocusOut(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}toolboxVisibilityController(e,t){const n=e.closest(".block");if(n){const e=n.querySelector(".block-toolbar");e&&(t?e.classList.add("hidden"):e.classList.remove("hidden"))}}insertToolboxIntoBlockOnce(e){const t=e.target.closest(`.${r.IncludeBlockToolbarClass}`);if(!t)return;const n=t.closest(".block");if(n&&null===n.querySelector(".block-toolbar-wrapper")){const e=t.classList.contains(r.LanguageSelectionToolClass),o=t.classList.contains(r.AlignToolClass),i=t.classList.contains(r.ColorToolClass),l=t.classList.contains(r.ExtraOptionsClass),s=Ae.createToolbox(e,o,i,l);n&&(n.appendChild(s),n.addEventListener(a.Mouseenter,(e=>this.resetToolbox(e,n))),n.addEventListener(a.Mousemove,(e=>{const t=s.firstChild?.id,o=document.getElementById(t);o&&(n.contains(e.target)?o.style.display="flex":this.hideBlockToolbox(s))})),n.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s))),document.addEventListener(a.Click,(e=>{P.isTargetDescendantOfSelector(e,`#${n.id}`)||this.hideBlockToolbox(s)})),n.querySelectorAll("iframe").forEach((e=>{e.addEventListener(a.Mouseenter,(()=>{const e=s.firstChild?.id,t=document.getElementById(e);t&&(t.style.display="flex",this.changeToolbarColor(n))})),e.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s)))})))}}changeToolbarColor(e){const t=e.querySelector(".color-interactive-button div"),n=e.querySelector(".callout-wrapper");if(t&&n){var o=window.getComputedStyle(n);t.style.backgroundColor=o.backgroundColor,t.style.borderColor=o.borderColor,t.style.borderColor="#ccc"}}hideBlockToolbox(e){const t=e.firstChild?.id,n=document.getElementById(t);n&&(Ae.isAnyDependentBoxVisible(n)||(n.style.display="none"))}static isAnyDependentBoxVisible(e){const t=e.querySelectorAll(".dependent-box");for(const e of t){const t=window.getComputedStyle(e);if("none"!==t.display&&"hidden"!==t.visibility)return!0}return!1}resetToolbox(e,t){const n=t.querySelector(".block-toolbar");if(!n)return void console.log("block-toolbar not found");const o=n.querySelector(".media-more-option-select");o&&(o.style.display="none");const i=n.querySelector(".color-interactive-select");i&&(i.style.display="none"),this.changeToolbarColor(t)}static createToolbox(e=!1,t=!1,n=!1,o=!1){const i=document.createElement("div");i.classList.add("block-toolbar-wrapper","exclude-from-clone",l.EditorOnly),i.style.position="relative";const r=document.createElement("div");return r.classList.add("block-toolbar","soft-box-shadow"),r.id=`btb-${O.generateUniqueId()}`,i.appendChild(r),e&&r.appendChild(he.languageSelectionTool().htmlElement),t&&r.appendChild(he.alignTool().htmlElement),n&&r.appendChild(he.colorTool().htmlElement),o&&r.appendChild(he.extraOptions().htmlElement),i}}class pe extends R{dropdownList;svgIcon;constructor(e,t,n,o=!0){const i=new ee("icon-wordpress-chevron-down",J.medium);super({id:e,title:t,dropdownList:n,svgIcon:o?i:null}),this.dropdownList=n,this.svgIcon=i,this.attachEvents(),n.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover","pointer"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const t=document.createElement("span");t.classList.add("no-selection"),t.textContent=this.props.title,e.appendChild(t)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible?this.dropdownList.hide():this.dropdownList.show()})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&this.classList.includes(t.targetClass)){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.changeTitle(Ae.languageMap[e.language]),this.dropdownList.hide())}}get display(){return"block"}changeTitle(e){const t=this.htmlElement.querySelector("span");t&&(t.textContent=e)}static create(e,t,n,o,i=[]){const r=new pe(e+O.generateUniqueId(),t,n,o);return r.addCssClass(...i),r}}!function(e){e.ColorTextOptionSelect="colorTextOptionSelect"}(b||(b={})),function(e){e.ColorTextOptionsMenu="colorTextOptionsMenu"}(E||(E={}));class Ce{static build(){const e=Z.getInstance();return e.appendDropdown(Ce.turnIntoDropdown()),e.appendSeparator(Ce.separator("turnIntoSeparator")),e.appendButtonGroup(Ce.buttonGroup()),e.appendDropdown(Ce.colorDropdown()),e.appendSeparator(Ce.separator("textOperationsSeparator")),e.appendDropdown(Ce.moreOptionsDropdown()),e}static turnIntoDropdown(){const e=new se("turnIntoSelect"),t=new pe("turnIntoButton","Text",e),n=new ne("turnIntoMenu",t,e);return e.append(new me(e,"Turn into")),e.append(new le("turnIntoOptionText",e,h.transformBlock,H.ELEMENT_TYPES.PARAGRAPH,ge.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),e.append(new le("turnIntoOptionTodoList",e,h.transformBlock,H.ELEMENT_TYPES.CHECK_LIST,ge.todo_list.htmlElement,"Todo list","Ctrl+1")),e.append(new le("turnIntoOptionBulletedList",e,h.transformBlock,H.ELEMENT_TYPES.BULLETED_LIST,ge.b_list.htmlElement,"Bulleted list","Ctrl+.")),e.append(new le("turnIntoOptionNumberedList",e,h.transformBlock,H.ELEMENT_TYPES.NUMBERED_LIST,ge.n_list.htmlElement,"Numbered list","Ctrl+/")),e.append(new le("turnIntoOptionBlockCode",e,h.transformBlock,H.ELEMENT_TYPES.CODE,ge.code.htmlElement,"Block code")),e.append(new le("turnIntoOptionQuote",e,h.transformBlock,H.ELEMENT_TYPES.QUOTE,ge.quote.htmlElement,"Quote")),e.append(new le("turnIntoOptionHeading2",e,h.transformBlock,H.ELEMENT_TYPES.HEADER_2,ge.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),e.append(new le("turnIntoOptionHeading3",e,h.transformBlock,H.ELEMENT_TYPES.HEADER_3,ge.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),e.append(new le("turnIntoOptionHeading4",e,h.transformBlock,H.ELEMENT_TYPES.HEADER_4,ge.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),n}static separator(e){return new ae(e)}static buttonGroup(){const e=new ce,t=de.create(h.toggleLink,"Link",ee.create(i.Link,J.large));t.setId(A.Link),t.appendTo(e);const n=de.create(h.toggleBold,"Bold",ee.create(i.Bold,J.large));n.setId(A.Bold),n.appendTo(e);const o=de.create(h.toggleItalic,"Italic",ee.create(i.Italic,J.large));o.setId(A.Italic),o.appendTo(e);const r=de.create(h.toggleUnderline,"Underline",ee.create(i.Underline,J.large));r.setId(A.Underline),r.appendTo(e);const l=de.create(h.toggleInlineCode,"Code",ee.create(i.InlineCode,J.large));l.setId(A.InlineCode),l.appendTo(e);const s=de.create(h.toggleStrikeThrough,"Strike-through",ee.create(i.StrikeThrough,J.large));return s.setId(A.Strikethrough),s.appendTo(e),e}static colorDropdown(){const e=new se(b.ColorTextOptionSelect),t=new pe("colorTextButton",new ue("white").htmlElement,e),n=new ne(E.ColorTextOptionsMenu,t,e);e.append(new me(e,"Highlight"));const o=new le(C.BackgroundOptionRed,e,h.toggleHiliteColor,u.HiliteColorRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("hiliteColor");const i=new le(C.BackgroundOptionGreen,e,h.toggleHiliteColor,u.HiliteColorGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("hiliteColor");const r=new le(C.BackgroundOptionBlue,e,h.toggleHiliteColor,u.HiliteColorBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("hiliteColor");const l=new le(C.BackgroundOptionYellow,e,h.toggleHiliteColor,u.HiliteColorYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("hiliteColor");const s=new le(C.BackgroundOptionGrey,e,h.toggleHiliteColor,u.HiliteColorGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("hiliteColor");const a=new le(C.BackgroundOptionNone,e,h.toggleHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");a.addClass("hiliteColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),e.append(new me(e,"Text"));const c=new le("colorOptionRed",e,h.toggleForeColor,u.ForeColorRed,new ee("icon-material-format",J.large).htmlElement,"Red");c.addClass("foreColor");const d=new le("colorOptionGreen",e,h.toggleForeColor,u.ForeColorGreen,new ee("icon-material-format",J.large).htmlElement,"Green");d.addClass("foreColor");const m=new le("colorOptionBlue",e,h.toggleForeColor,u.ForeColorBlue,new ee("icon-material-format",J.large).htmlElement,"Blue");m.addClass("foreColor");const A=new le("colorOptionYellow",e,h.toggleForeColor,u.ForeColorYellow,new ee("icon-material-format",J.large).htmlElement,"Yellow");A.addClass("foreColor");const p=new le("colorOptionGrey",e,h.toggleForeColor,u.ForeColorGrey,new ee("icon-material-format",J.large).htmlElement,"Grey");p.addClass("foreColor");const g=new le("colorOptionNone",e,h.toggleForeColor,u.ForeColorInitial,new ee("icon-material-format",J.large).htmlElement,"None");return g.addClass("foreColor"),e.append(c),e.append(d),e.append(m),e.append(A),e.append(p),e.append(g),n}static moreOptionsDropdown(){const e=new ee("icon-material-more",J.large),t=new se("moreTextOptionSelect"),n=new pe("moreTextOptionButton",e.htmlElement,t,!1),o=new ne("moreTextOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("copyOption",t,h.copySelected,null,ge.copy.htmlElement,"Copy","Ctrl+C")),t.append(new le("cutOption",t,h.cutSelected,null,ge.cut.htmlElement,"Cut","Ctrl+X")),t.append(new le("pasteOption",t,h.past,null,ge.paste.htmlElement,"Replace","Ctrl+V")),t.append(new le("duplicateOption",t,h.duplicateBlock,null,ge.duplicate.htmlElement,"Clone","Ctrl+D")),t.append(new le("resetOption",t,h.removeFormat,null,ge.eraser.htmlElement,"Reset Style","Ctrl+\\"));const i=new le("deleteOption",t,h.deleteBlock,null,ge.delete.htmlElement,"Delete","Shift+Del");return i.addCssClass("danger-option"),t.append(i),o}}const ge={paragraph:new ee("icon-material-format","1.25rem"),todo_list:new ee("icon-material-check-list-2",J.large),b_list:new ee("icon-wordpress-bulleted-list",J.large),n_list:new ee("icon-wordpress-numbered-list",J.large),code:new ee("icon-wordpress-code-mark",J.large),quote:new ee("icon-wordpress-quote",J.large),head1:new ee("icon-julia-head-1",J.large),head2:new ee("icon-julia-head-2",J.large),head3:new ee("icon-julia-head-3",J.large),head4:new ee("icon-julia-head-4",J.large),head5:new ee("icon-julia-head-5",J.large),head6:new ee("icon-julia-head-6",J.large),duplicate:new ee("icon-material-duplicate",J.large),delete:new ee("icon-material-trash",J.large),eraser:new ee("icon-material-clear",J.large),copy:new ee("icon-material-copy",J.large),cut:new ee("icon-material-cut",J.large),paste:new ee("icon-material-paste",J.large)};class be extends R{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No matching block types found.",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}class Ee extends R{static id="quickMenu";currentFocusedMenuItem;menuSections;quickMenuEmpty;filterInput;focusStack;static instance;constructor(e){const t=new be;super({quickMenuEmpty:t}),this.currentFocusedMenuItem=null,this.menuSections=new re,this.quickMenuEmpty=t,this.focusStack=e,this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=Ee.id,e.style.zIndex=d.SlightlyImportant,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const t=document.createElement("div");return t.classList.add("block-options"),t.style.position="relative",t.appendChild(this.props.quickMenuEmpty.htmlElement),e.appendChild(t),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){const e=D.Instance.resolve("IFocusStack");return Ee.instance||(Ee.instance=new Ee(e)),Ee.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.focusStack.peek()?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let t=e;for(;t;){const n=t.value.menuItems.findFirst((e=>e.isVisible));if(n)return void this.switchVisualFocus(n);if(t=t.nextNode,t==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getPreviousSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}}else{let t=this.menuSections.findLast((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getNextSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}}else{let t=this.menuSections.findFirst((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{const e=document.activeElement;if(!e)return void console.error("Failed to display the quickMenu: no active element found.");this.focusStack.push(e);const t=window.getSelection();if(!t||0===t.rangeCount)throw new Error("No selection found.");const n=t.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const o=this.htmlElement.offsetWidth;let i=n.left+window.scrollX;i+o>window.innerWidth&&(i=window.innerWidth-o-20),this.htmlElement.offsetHeight;let r=n.bottom+window.scrollY+10;this.htmlElement.style.left=`${i}px`,this.htmlElement.style.top=`${r}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.focusStack.peek()?.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.focusStack.peek()?.focus(),super.hide()}attachEvents(){document.addEventListener(c.emittedCommand,(e=>{const{command:t}=e.detail;t==h.transformBlock&&this.hide()})),document.addEventListener("keydown",(e=>{const t=P.findClosestAncestorOfActiveElementByClass("block");if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||!t)(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)&&(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)?!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey?this.isVisible&&"Backspace"===e.key?""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems()):!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||this.hide():(this.concatFilterInput(e.key),this.filterItems()):(e.preventDefault(),this.focusPreviousVisibleItem()):(e.preventDefault(),this.focusNextVisibleItem()):(e.preventDefault(),e.stopPropagation());else{if(e.target.closest(".ignore-quick-menu"))return;this.show()}})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if(this.isVisible&&"Enter"===e.key&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();const t=this.currentFocusedMenuItem?.value.blockType;t&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(t)}})),document.addEventListener(c.blockTypeChanged,(e=>{this.hide()}))}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:e}});document.dispatchEvent(t)}transformHtmlFocusedElementBeforeOpenQuickMenu(e){e&&this.emitCommandEvent(e)}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class fe extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(this.tail.setNext(t),t.setPrevious(this.tail),this.tail=t):(this.head=t,this.tail=t),this.length++}}class Be extends R{immediateParent;menuItems=new fe;constructor(e){super({title:e.title,classList:e.classList}),this.immediateParent=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const t=document.createElement("h2");return t.textContent=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((t=>{t.filterValue.toLocaleLowerCase().includes(e)||t.hide()})),this.menuItems.any((t=>t.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class ve extends R{_blockType;_filterValue;_immediateParent;constructor(e,t,n,o,i,r){super({title:t,description:n,iconId:o}),this._blockType=i,this._filterValue=r,this._immediateParent=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation","pointer","no-selection"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const t=document.createElement("div");t.classList.add("option-image");const n=new ee(this.props.iconId,"100%");t.appendChild(n.htmlElement),e.appendChild(t);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}get filterValue(){return this._filterValue}get immediateParent(){return this._immediateParent}get blockType(){return this._blockType}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}emitCommandEvent(){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:this.blockType}});document.dispatchEvent(e)}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this._immediateParent.menuItems.find(this);this._immediateParent.immediateParent.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.emitCommandEvent()}))}}class we{static build(){const e=Ee.getInstance(),t=new Be({quickMenuInstance:e,title:"Basic",classList:"basic-section"});t.appendQuickMenuItems([new ve(t,"Text","Start writing in plain text.","icon-material-format",H.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new ve(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",H.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",H.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list"),new ve(t,"Table","Organize data in rows and columns.","icon-material-table",H.ELEMENT_TYPES.TABLE,"table tr th"),new ve(t,"Callout","Emphasize key points with a callout box.",i.Callout,H.ELEMENT_TYPES.CALLOUT,"callout note spotlight"),new ve(t,"Code","Include a code snippet.","icon-wordpress-code-mark",H.ELEMENT_TYPES.CODE,"code script source markup"),new ve(t,"Quote","Highlight text as a quote.","icon-wordpress-quote",H.ELEMENT_TYPES.QUOTE,"quote blockquote citation quotation cite"),new ve(t,"Heading 2","Medium header for sections.","icon-julia-head-2",H.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(t,"Heading 3","Small header for subsections.","icon-julia-head-2",H.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(t,"Separator","Visually divide blocks.","icon-wordpress-separator",H.ELEMENT_TYPES.SEPARATOR,"separator divider rule line hr")]),e.append(t);const n=new Be({quickMenuInstance:e,title:"Media",classList:"media-section"});n.appendQuickMenuItems([new ve(n,"Image","Upload or embed an image.",i.Image2,H.ELEMENT_TYPES.IMAGE,"image figure photo illustration picture media upload"),new ve(n,"YouTube","Embed a YouTube video.",i.YouTube,"video","video embed youtube clip film movie tape")]),e.append(n);const o=new Be({quickMenuInstance:e,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new ve(o,"Heading 1","Large header for main topics.","icon-julia-head-1",H.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new ve(o,"Heading 2","Medium header for sections.","icon-julia-head-2",H.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(o,"Heading 3","Small header for subsections.","icon-julia-head-3",H.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",H.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new ve(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",H.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new ve(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",H.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),e.append(o);const r=new Be({quickMenuInstance:e,title:"List",classList:"list-section"});r.appendQuickMenuItems([new ve(r,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2",H.ELEMENT_TYPES.CHECK_LIST,"todo list task list checklist"),new ve(r,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",H.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(r,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",H.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list")]),e.append(r);const l=new Be({quickMenuInstance:e,title:"Embed",classList:"embed-section"});return l.appendQuickMenuItems([new ve(l,"GitHub Gist","Embed a GitHub Gist.",i.GitHub,"github-gist","code gist github snippet git"),new ve(l,"CodePen","Embed a CodePen web demo.",i.CodePen,"codepen","code codepen"),new ve(l,"Spotify","Embed a Spotify audio track.",i.Spotify,"spotify","mp3 sound audio music spotify track")]),e.append(l),e}}class Ie extends R{constructor(e){super({value:e})}init(){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("h1");return t.setAttribute("contentEditable","true"),t.setAttribute("data-placeholder","Untitled"),this.props.value&&(t.textContent=this.props.value),e.appendChild(t),e}static create(e){return new Ie(e)}}class ke{static build(){return Ie.create(window.editorConfig?.title)}}var ye,xe,Te,Se,Le,Me;!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight"}(ye||(ye={})),function(e){e.Column="Column",e.Row="Row",e.Cell="Cell",e.SelectedCells="SelectedCells"}(xe||(xe={}));class Ne{static addRow(e,t=null){const n=null!==t&&t>=0&&t<=e.rows.length?t:e.rows.length,o=e.insertRow(n),i=Array.from(e.rows).reduce(((e,t)=>Math.max(e,t.cells.length)),0);let r=[];for(let e=0;e{r.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static addColumn(e,t=null){const n=null!==t?t:void 0;let o=[];for(let t=0;t{o.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static isLastColumn(e,t){if(!e.contains(t))return!1;const n=t.parentElement;return t===n.cells[n.cells.length-1]}static isLastRow(e,t){return!!e.contains(t)&&t.parentElement===e.rows[e.rows.length-1]}static removeColumnByCell(e){if("td"!==e.tagName.toLowerCase()&&"th"!==e.tagName.toLowerCase())throw new Error("The provided element is not a table cell.");const t=e.parentElement.parentElement,n=e.cellIndex;for(let e=0;e=0;t--){const n=e.rows[t];for(let e=n.cells.length-1;e>=0;e--){const t=n.cells[e];if(t.isContentEditable)return t}}return null}static getFirstTableCell(e){for(let t=0;t{e.style.border=`1px double ${n}`}))}static moveFocusToBelowCell(e,t){const n=t.parentElement?.nextElementSibling;if(!n)return!1;const o=t.cellIndex,i=n.cells[o];return!(!i||!i.isContentEditable||(i.focus(),0))}}class qe extends R{constructor(){super({}),this.attachEvent()}init(){const e=document.createElement("div");return e.classList.add("content"),e.style.marginTop="1.3rem",window.editorConfig,e.append(H.blockParagraph()),e}clearSelectionOnDrag(){document.addEventListener(a.Mousedown,(e=>{const t=e.target;let n;t&&(n=t.nodeType==Node.TEXT_NODE?t.parentElement:t,n&&n.closest(".drag-handler")&&window.getSelection()?.removeAllRanges())}))}attachEvent(){this.clearSelectionOnDrag(),this.reRenderPlaceholder(),document.addEventListener(a.Click,(e=>{document.querySelectorAll(".separator-selected").forEach((e=>{e.classList.remove("separator-selected"),e.removeAttribute("tabindex")}));let t=e.target;if(t&&t.closest(".separator-wrapper")){e.stopImmediatePropagation(),e.preventDefault();let n=t.closest(".separator-wrapper");n&&(n.classList.add("separator-selected"),n.setAttribute("tabindex","-1"),setTimeout((()=>{n.focus()}),50))}})),document.addEventListener(a.Blur,(e=>{const t=e.target;if(t instanceof HTMLElement&&t.closest(".separator-selected")){e.stopImmediatePropagation();const n=t.closest(".separator-selected");n.classList.remove("separator-selected"),n.removeAttribute("tabindex")}}),!0),document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),window.addEventListener("load",(()=>{const e=document.querySelector(".johannes-editor");if(e){let t=e.querySelectorAll(".block");if(1==t.length){const e=t[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),document.addEventListener(a.Keydown,(e=>{"Enter"===e.key&&!e.shiftKey&&P.isEventTargetDescendantOf(e,"#johannesEditor .content-wrapper .title")&&(e.preventDefault(),document.dispatchEvent(new CustomEvent(c.pressedEnterOnTitle,{})))}),!0),document.addEventListener(a.Keydown,(async e=>{if(P.isEventTargetDescendantOf(e,".ignore-events")&&"Tab"!==e.key)return;const t=D.Instance.resolve("IQuickMenu"),n=D.Instance.resolve("ITableContextFloatingToolbar");if(!(e.ctrlKey||e.shiftKey||e.altKey))if(e.key!==p.Enter||e.shiftKey||t.isVisible||n.isVisible){if(e.key===p.Backspace){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();n&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithPreviousBlock}})))}}else if(e.key===p.Delete){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.classList.contains("johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();o&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithNextBlock}})))}}else if("ArrowRight"===e.key&&qe.isCursorAtEnd(e.target));else if("ArrowLeft"===e.key&&qe.isCursorAtStart(e.target));else if("ArrowDown"===e.key&&qe.isCursorOnLastLine());else if("ArrowUp"===e.key&&qe.isCursorOnFirstLine());else if("Tab"===e.key&&P.isEventTargetDescendantOf(e,".johannes-code")){e.preventDefault();const t="    ";document.execCommand("insertText",!1,t)}}else{e.preventDefault();const t=e.target.closest(".table-controller");if(t){const n=e.target.closest("td, th"),o=t.querySelector("table");return void(n&&(Ne.moveFocusToBelowCell(o,n)||document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.focusOnNextBlock}}))))}if(e.target.closest(".johannes-code"))return;e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.insertNew}}))}})),document.addEventListener(a.Blur,(e=>this.sanitizeElementEventHandler(e)),!0)}sanitizeElementEventHandler(e){const t=e.target;t instanceof HTMLElement&&"true"===t.contentEditable&&P.sanitizeContentEditable(t)}reRenderPlaceholder(){document.addEventListener(a.Input,(function(e){if(e.target instanceof HTMLElement){const t=e.target;if(t.isContentEditable&&t.hasAttribute("data-placeholder")){const e=t.getAttribute("data-placeholder");""===t.textContent?.trim()&&(t.setAttribute("data-placeholder",e||""),t.textContent="")}}}))}static isCursorAtEnd(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&0===o.startOffset}static isAtFirstVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!0),n.setStart(e,0),n.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!1),n.setEnd(e,e.childNodes.length),n.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const t=window.getSelection();if(!t.rangeCount)return Promise.resolve(!1);const n=t.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=t.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(n.top===i.top&&n.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return 0===t.startOffset&&t.startContainer===t.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return t.endOffset===t.endContainer.textContent?.length&&t.endContainer===t.commonAncestorContainer}static getInstance(){return D.Instance.resolve("IShortcutListeners"),D.Instance.resolve("ITableListeners"),new qe}}class Oe{static build(){return qe.getInstance()}}!function(e){e.Text="Text",e.Cell="Cell",e.Block="Block"}(Te||(Te={}));class He extends F{static id="tableFloatingToolbar";static instance;focusStack;selectedCells=[];actualFocusedCell=null;tableOperationsService;controller;selectionMode=Te.Text;selectionFlag=!1;selectedText="";constructor(e,t){if(He.instance)throw new Error("Use TableContextFloatingToolbar.getInstance() to get instance.");super(He.id),this.clearAndHide=this.clearAndHide.bind(this),this.htmlElement.style.zIndex=d.ModeratelyImportant,this.controller=new AbortController,this.focusStack=e,this.tableOperationsService=t,this.attachEvents()}attachEvents(){document.addEventListener(a.Mousedown,this.handleMouseDown.bind(this)),document.addEventListener(a.Mousemove,this.handleMouseMove.bind(this)),document.addEventListener(a.Mouseup,this.handleMouseUp.bind(this)),document.addEventListener(a.Keydown,this.handleStartSelectionInCellKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleCellSelectionContinuationOnKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleKeyDown.bind(this)),document.addEventListener(a.Keyup,this.handleKeyUp.bind(this)),this.attachUIEvent(),super.attachEvents()}handleMouseDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".figure-embed-container td")&&(console.log("MouseDown event on: ",e.target),e.stopImmediatePropagation(),this.controller.abort(),t!=this.actualFocusedCell&&this.hide(),this.clearAll(),this.addSelectedCell(t),this.selectionFlag=!0,this.selectionMode=Te.Text)}handleMouseMove(e){if(this.selectionFlag){const t=e.target.closest(g.TD);t&&(this.updateSelectionModeByMouseEvent(e),this.selectionMode==Te.Cell&&(e.stopImmediatePropagation(),e.preventDefault(),this.canHide&&this.hide(),this.addSelectedCell(t),document.getSelection()?.removeAllRanges()))}}handleMouseUp(e){this.selectedCells.length>0&&this.selectionFlag&&(this.resetSelectionState(),this.show())}handleKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.key!=p.Enter||e.shiftKey||e.ctrlKey||e.metaKey||e.altKey?e.key==p.Escape&&this.canHide&&!Z.getInstance().isVisible&&setTimeout((()=>{this.canHide&&(e.stopImmediatePropagation(),this.clearAll(),this.hide())}),10):e.stopImmediatePropagation())}handleStartSelectionInCellKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.repeat||e.key!==p.Shift||(e.stopImmediatePropagation(),this.controller.abort(),this.selectionFlag=!0,this.selectionMode=Te.Text,this.addSelectedCell(t)))}handleCellSelectionContinuationOnKeyDown(e){if(this.selectionFlag){const t=e.target.closest(g.TD);if(t&&!t.matches(".gist td")&&this.selectionMode==Te.Cell&&e.shiftKey&&e.key.startsWith("Arrow")&&!e.repeat){e.stopImmediatePropagation(),e.preventDefault();const n=t.closest(g.TABLE),o=Ne.getNeighborCell(n,t,e.key);this.addSelectedCell(t),o&&this.addSelectedCell(o)}}}normalizeText(e){return e.replace(/\s+/g," ").trim()}updateTheSelectionModeByCurrentSelectionState(e){if(this.selectionFlag){const t=document.getSelection();if(t){const n=this.normalizeText(t.toString().trim()),o=e.target.closest(g.TD);if(o.matches(".gist td"))return;const i=this.normalizeText((o.textContent||"").trim()),{atStart:r,atEnd:l}=P.getSelectionTextInfo(o);""===i||n===this.selectedText.trim()&&(r||l)?(this.selectionMode=Te.Cell,this.selectedText="",this.canHide&&this.hide()):n&&(this.selectedText=n)}}}updateSelectionModeByMouseEvent(e){if(this.selectionFlag&&this.actualFocusedCell){const t=this.actualFocusedCell.getBoundingClientRect(),n=e.clientX,o=e.clientY;n>=t.left&&n<=t.right&&o>=t.top&&o<=t.bottom||(this.selectionMode=Te.Cell,this.canHide&&this.hide())}}handleKeyUp(e){e.target.closest(g.TD)&&(e.stopImmediatePropagation(),this.updateTheSelectionModeByCurrentSelectionState(e),e.key===p.Shift&&(this.resetSelectionState(),this.selectedCells.length>0&&this.show()))}addSelectedCell(e){if(0===this.selectedCells.length)return this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,void e.focus();this.selectedCells[this.selectedCells.length-1].closest("table")===e.closest("table")&&(-1===this.selectedCells.indexOf(e)?(this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,e.focus()):(this.actualFocusedCell=e,e.focus()))}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this))}handleCloseElementEvent(e){const t=e.detail;He.id==t.targetId&&this.clearAndHide()}show(){if(!this.actualFocusedCell)return void console.error("No focused cell found");this.resetAbortController(),this.focusStack.push(this.actualFocusedCell),this.changeToolbarPositionToBeClosedTo(this.actualFocusedCell),this.processSelectionChangeEffects();const e=this.actualFocusedCell.closest(".block");let t=null;e&&(t=e.querySelector(".block-toolbar"),t.classList.add("d-none")),super.show(),this.actualFocusedCell.addEventListener(a.Blur,(()=>this.clearAndHide(t)),{signal:this.controller.signal})}processSelectionChangeEffects(){G.emitResetActiveButtonsElementEvent("backgroundColor");const e={};e[u.BackgroundColorRed]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorRed),e[u.BackgroundColorGreen]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGreen),e[u.BackgroundColorBlue]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorBlue),e[u.BackgroundColorYellow]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorYellow),e[u.BackgroundColorGrey]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGrey),Object.entries(e).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("backgroundColor",e,"show")}))}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";const n=this.htmlElement.offsetWidth;let o=t.left+window.scrollX+0;o+n>window.innerWidth&&(o=window.innerWidth-n-20);const i=this.htmlElement.offsetHeight;let r=t.top+window.scrollY-i-10;r<0&&(r=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`}resetSelectionState(){this.selectionMode=Te.Text,this.selectionFlag=!1,this.selectedText=""}clearAll(){this.actualFocusedCell=null,document.querySelectorAll("td").forEach((e=>e.classList.remove("selected"))),this.selectedCells=[]}hide(){this.canHide&&super.hide()}clearAndHide(e=null){e&&e.classList.remove("d-none"),this.clearAll(),this.hide()}resetAbortController(){this.controller=new AbortController}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("ITableOperationsService");return new He(e,t)}}class Re{static build(){const e=D.Instance.resolve("ITableOperationsService"),t=He.getInstance();return t.appendDropdown(Re.tableOptions(e)),t.appendSeparator(Re.separator("tableOperationsSeparator")),t.appendDropdown(Re.tableColorDropdown()),t}static tableOptions(e){const t=new se("tableOptionsSelect"),n=new pe("tableOptions","Options",t),o=new ne("tableOptionsMenu",n,t);t.append(new me(t,"Insert Column")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnLeft,H.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnLeft,J.medium).htmlElement,"Left")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnRight,H.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnRight,J.medium).htmlElement,"Right")),t.append(new me(t,"Insert Row")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowAbove,H.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowAbove,J.medium).htmlElement,"Above")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowBelow,H.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowBelow,J.medium).htmlElement,"Below")),t.append(new me(t,"Remove"));const r=new le("turnIntoOptionText",t,h.removeColumn,H.ELEMENT_TYPES.PARAGRAPH,ee.create(i.deleteSweep,J.medium).htmlElement,"Column");r.addCssClass("danger-option"),t.append(r);const l=new le("turnIntoOptionTodoList",t,h.removeRow,H.ELEMENT_TYPES.CHECK_LIST,ee.create(i.deleteSweep,J.medium).htmlElement,"Row");return l.addCssClass("danger-option"),t.append(l),o}static tableColorDropdown(){const e=new se("colorTableOptionSelect"),t=new pe("colorTableButton",new ue("white").htmlElement,e),n=new ne("tableColorOptionsMenu",t,e);e.append(new me(e,"Background"));const o=new le("backgroundOptionRed",e,h.toggleCellHiliteColor,u.BackgroundColorCellRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("backgroundColor");const i=new le("backgroundOptionGreen",e,h.toggleCellHiliteColor,u.BackgroundColorCellGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("backgroundColor");const r=new le("backgroundOptionBlue",e,h.toggleCellHiliteColor,u.BackgroundColorCellBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("backgroundColor");const l=new le("backgroundOptionYellow",e,h.toggleCellHiliteColor,u.BackgroundColorCellYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("backgroundColor");const s=new le("backgroundOptionGrey",e,h.toggleCellHiliteColor,u.BackgroundColorCellGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("backgroundColor");const a=new le("backgroundOptionNone",e,h.toggleCellHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");return a.addClass("backgroundColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static separator(e){return new ae(e)}}class De{static async embedImage(e,t){const n=new URL(e);if(!await De.validateImage(n.toString()))throw new Error("invalid image");const o=this.createEmbedContainer(),i=document.createElement("img");i.src=n.toString(),i.alt="Embedded Image",i.style.maxWidth="100%",i.style.width="auto",i.style.height="auto",o.appendChild(i),o.classList.add(r.AlignToolClass),De.finalizeEmbed(o,[r.AlignToolClass,"fit-content","x-resizable"],t)}static validateImage(e){return new Promise(((t,n)=>{const o=new Image;o.onload=()=>{t(!0)},o.onerror=()=>{t(!1)},o.src=e}))}static embedGoogleSheet(e,t){const n=e.pathname.split("/")[3],o=De.createEmbedContainer(["embed-container"]),i=document.createElement("iframe"),r=encodeURIComponent(n);i.src=`https://docs.google.com/spreadsheets/d/e/${r}/pubhtml?widget=true&headers=false`,i.style.width="100%",i.style.height="450px",i.frameBorder="0",i.allowFullscreen=!0,o.appendChild(i),De.finalizeEmbed(o,["x-resizable"],t)}static embedYouTubeVideoAsIframe(e,t){const n=e.searchParams.get("v");if(n){const e=this.createEmbedContainer(["embed-container"]),o=document.createElement("iframe"),i=encodeURIComponent(n);o.src=`https://www.youtube.com/embed/${i}`,o.frameBorder="0",o.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",o.allowFullscreen=!0,e.appendChild(o),e.classList.add(r.AlignToolClass),this.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube video URL")}static embedYouTubeShortAsIframe(e,t){const n=e.pathname.split("/"),o=n[n.length-1];if(o){const e=De.createEmbedContainer(["embed-container"]),n=document.createElement("iframe"),i=encodeURIComponent(o);n.src=`https://www.youtube.com/embed/${i}`,n.frameBorder="0",n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,e.appendChild(n),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube Shorts URL")}static embedYouTubePlaylistAsIframe(e,t){const n=e.searchParams.get("list");if(n){const e=De.createEmbedContainer(["embed-container"]),o=encodeURIComponent(n),i=document.createElement("iframe");i.src=`https://www.youtube.com/embed/videoseries?list=${o}`,i.setAttribute("allowfullscreen","true"),e.appendChild(i),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube playlist URL")}static embedSpotifyContent(e,t,n){const o=e.pathname.split("/").pop(),i=this.createEmbedContainer(["embed-container"]);if(i.classList.add("spotify-embed",r.AlignToolClass),!o)return void console.error("contentId is empty");const l=encodeURIComponent(o),s=document.createElement("iframe");switch(s.classList.add("spotify-embed"),s.src=`https://open.spotify.com/embed/${n}/${l}`,s.frameBorder="0",s.setAttribute("scrolling","no"),n){case Se.SpotifyTrack:s.style.height="80px";break;case Se.SpotifyPlaylist:case Se.SpotifyShow:case Se.SpotifyEpisode:case Se.SpotifyArtist:s.style.height="380px";break;default:s.style.height="300px"}i.appendChild(s),this.finalizeEmbed(i,["x-resizable",r.AlignToolClass],t)}static async embedGistAsScript(e,t){const n=e.pathname.split("/").pop();if(!n)return void console.error("Invalid Gist ID");const o=document.createElement("div");o.classList.add("shadow-element");const i=De.createEmbedContainer(["gist-embed-container","figure-embed-container","ignore-text-floating-toolbar"]);i.style.minHeight="100px",i.style.width="100%",t.appendChild(i),i.appendChild(o);const r=o.attachShadow({mode:"open"}),l=`https://gist.github.com/${encodeURIComponent(n)}.js`,s=document.createElement("script");s.type="text/javascript",s.src=l,s.async=!0;const a=document.write;let c="";document.write=e=>{c+=e},s.onload=()=>{document.write=a;const e=document.createElement("div");e.innerHTML=c,Array.from(e.childNodes).forEach((e=>{r.appendChild(e)})),console.log("Gist loaded successfully")},s.onerror=()=>{document.write=a,console.error("Failed to load the Gist")},r.appendChild(s),De.finalizeEmbed(i,[],t)}static embedCodepenAsIframe(e,t){const n=e.pathname.split("/");if(n.length<4||""===n[1]||""===n[3])return void console.error("Invalid URL: Expected format /user/{username}/pen/{penId}");const o=n[1],i=n[3],r=encodeURIComponent(o),l=encodeURIComponent(i),s=De.createEmbedContainer(["embed-container"]),a=document.createElement("iframe");a.src=`https://codepen.io/${r}/embed/${l}?height=265&theme-id=light&default-tab=js,result`,a.style.border="none",a.style.height="100%",a.style.width="100%",a.style.overflow="visible",a.setAttribute("sandbox","allow-scripts allow-same-origin"),s.appendChild(a),De.finalizeEmbed(s,["y-resizable"],t);const c=new ResizeObserver((e=>{for(let t of e){const{height:e}=t.contentRect;a.style.height=`${e}px`}})),d=s.closest(".johannes-content-element");d&&(d.classList.add("overflow-hidden"),c.observe(d))}static createEmbedContainer(e=[]){const t=document.createElement("figure");return t.classList.add(...e),t}static finalizeEmbed(e,t=[],n){const o=n.closest(`.${l.ContentElement}`);if(o){for(o.classList.add(...t);o.firstChild;)o.removeChild(o.firstChild);o.appendChild(e);const n=o.closest(".block"),i=n?.querySelector(".block-toolbar-wrapper");i?.remove()}}static determineEmbedType(e){const t=new URL(e),n=t.hostname.toLowerCase(),o=t.pathname.toLowerCase();if(/^(?:.*\.)?spotify\.com$/.test(n)){if(o.includes("/track"))return Se.SpotifyTrack;if(o.includes("/playlist"))return Se.SpotifyPlaylist;if(o.includes("/artist"))return Se.SpotifyArtist;if(o.includes("/episode"))return Se.SpotifyEpisode;if(o.includes("/show"))return Se.SpotifyShow}else if(/^(?:.*\.)?(youtube\.com|youtu\.be)$/.test(n)){if(o.includes("/watch"))return t.searchParams.has("list")?Se.YouTubePlaylist:Se.YouTubeVideo;if(o.includes("/playlist"))return Se.YouTubePlaylist;if(o.includes("/shorts"))return Se.YouTubeShort}else{if("vimeo.com"===n)return Se.VimeoVideo;if("docs.google.com"===n&&o.includes("/spreadsheets"))return Se.GoogleSheet;if("twitter.com"===n)return Se.Tweet;if("google.com"===n&&o.includes("/maps"))return Se.GoogleMap;if("gist.github.com"===n)return Se.GitHubGist;if("gitlab.com"===n&&o.includes("/snippets"))return Se.GitLabSnippet;if("codepen.io"===n)return Se.CodePen}return null}}!function(e){e.SpotifyTrack="track",e.SpotifyPlaylist="playlist",e.SpotifyArtist="artist",e.SpotifyEpisode="episode",e.SpotifyShow="show",e.YouTubeVideo="video",e.YouTubePlaylist="playlist",e.YouTubeShort="short",e.VimeoVideo="video",e.GoogleSheet="sheet",e.Tweet="tweet",e.GoogleMap="map",e.GitHubGist="gist",e.GitLabSnippet="snippet",e.CodePen="pen"}(Se||(Se={}));class Pe extends R{id;focusStack;constructor(){const e="mediaInputter";super({id:e}),this.id=e,this.focusStack=D.Instance.resolve("IFocusStack"),this.attachEvents()}init(){const e=document.createElement("div");e.id=this.props.id,e.classList.add("tab-container","soft-box-shadow"),e.style.display="none",e.style.zIndex=d.ExtremelyImportant;const t=document.createElement("ul");t.classList.add("nav","nav-underline");const n=this.createNavItem("uploadTab","Upload",!0),o=this.createNavItem("embedTab","Embed");t.appendChild(n),t.appendChild(o);const i=document.createElement("div");i.classList.add("tab-content");const r=this.createUploadContent(),l=this.createEmbedContent();return i.appendChild(r),i.appendChild(l),e.appendChild(t),e.appendChild(i),e}createNavItem(e,t,n=!1){const o=document.createElement("li");o.classList.add("nav-item"),o.id=e;const i=document.createElement("a");return i.classList.add("nav-link"),i.innerText=t,o.appendChild(i),o}createUploadContent(){const e=document.createElement("div");e.id="uploadContent",e.classList.add("upload-content","content-data");const t=document.createElement("label");t.classList.add("blue-button"),t.innerText="Upload file";const n=document.createElement("div");return n.classList.add("text-info"),n.innerText="Maximum file size: 5MB",e.appendChild(t),e.appendChild(n),e}createEmbedContent(){const e=document.createElement("div");e.id="embedContent",e.classList.add("content-data","embed-content");const t=document.createElement("input");t.type="text";const n=document.createElement("button");return n.classList.add("blue-button"),n.innerText="Embed",e.appendChild(t),e.appendChild(n),n.addEventListener(a.Click,(()=>this.embedGeneric(t))),t.addEventListener(a.Keydown,(e=>{e.key==p.Enter&&(e.preventDefault(),e.stopImmediatePropagation(),this.embedGeneric(t))})),t.addEventListener(a.Focusin,(()=>this.resetInputBgColor(t))),e}resetInputBgColor(e){e.style.backgroundColor=""}async embedGeneric(e){const t=e.value,n=this.focusStack.peek(),i=n?.closest(`.${l.ContentElement}`)?.getAttribute("data-content-type");try{const e=new URL(t);if(!O.isValidUrl(e.toString()))throw new Error("Invalid URL");if(!n)return void console.error("not element found");if(i==o.Image)await De.embedImage(t,n);else if(i==o.Iframe){const o=De.determineEmbedType(t);switch(o){case Se.YouTubeVideo:De.embedYouTubeVideoAsIframe(e,n);break;case Se.YouTubePlaylist:De.embedYouTubePlaylistAsIframe(e,n);break;case Se.YouTubeShort:De.embedYouTubeShortAsIframe(e,n);break;case Se.SpotifyTrack:case Se.SpotifyPlaylist:case Se.SpotifyArtist:case Se.SpotifyEpisode:case Se.SpotifyShow:case Se.SpotifyPlaylist:De.embedSpotifyContent(e,n,o);break;case Se.GitHubGist:De.embedGistAsScript(e,n);break;case Se.CodePen:De.embedCodepenAsIframe(e,n);break;default:throw new Error("Unsupported")}}const r=new CustomEvent(c.emittedCommand,{detail:{command:h.createDefaultBlock}});document.dispatchEvent(r),this.hide()}catch(e){const t=document.querySelector("#embedContent input");t&&(t.style.backgroundColor="rgb(253, 222, 222)",t.classList.add("shake-animation"),setTimeout((()=>{t.classList.remove("shake-animation")}),1e3))}}set inputValue(e){const t=this.htmlElement.querySelector("input");t&&(t.value=e)}get display(){return"flex"}attachEvents(){const e=this.htmlElement.querySelector("#uploadTab");e?.addEventListener("click",(()=>{this.setActiveTab("uploadTab","uploadContent")}));const t=this.htmlElement.querySelector("#embedTab");t?.addEventListener("click",(()=>{this.setActiveTab("embedTab","embedContent")})),document.addEventListener(a.Keydown,this.handlerKeydownEvents.bind(this)),document.addEventListener(a.Click,this.handlerClickEvents.bind(this)),super.attachUIEvent()}handlerKeydownEvents(e){e.key==p.Escape&&this.canHide&&this.hide()}handlerClickEvents(e){this.hideMediaInputterOnExternalClick(e),this.showMediaInputterOnMediaInputterElementClick(e)}hideMediaInputterOnExternalClick(e){const t=P.findClickedElementOrAncestorById(e,this.id),n=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(!t&&!n&&this.isVisible)return e.stopImmediatePropagation(),void this.hide()}showMediaInputterOnMediaInputterElementClick(e){const t=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(t)return e.stopImmediatePropagation(),e.preventDefault(),this.focusStack.push(t),void(this.isVisible?this.hide():this.show())}findClassWithSuffix(e,t){const n=new RegExp(`.*${t}$`);for(let t of e.classList)if(n.test(t))return t;return null}getTab(e){return document.getElementById(e)}getContent(e){return document.getElementById(e)}setActiveTab(e,t){document.querySelectorAll(".nav-item").forEach((e=>{e.classList.remove("active")})),document.querySelectorAll(".content-data").forEach((e=>{e.classList.remove("active")})),this.getTab(e)?.classList.add("active");const n=this.getContent(t);if(n){n.classList.add("active");const e=n.querySelector("input");e&&(e.style.backgroundColor="white",setTimeout((()=>{e.focus()}),100))}}show(){const e=this.focusStack.peek(),t=e?.querySelector(`.${l.ShowMediaInputOnClick}`)||e?.closest(`.${l.ShowMediaInputOnClick}`);if(t){const e=this.findClassWithSuffix(t,"-embed-placeholder-text");e&&this.setInputPlaceholder(e)}if(e){const t=e.querySelector(`.${l.ShowMediaInputUpload}`)||e.closest(`.${l.ShowMediaInputUpload}`),n=this.htmlElement.querySelector("#uploadTab"),o=this.htmlElement.querySelector("#embedTab"),i=this.htmlElement.querySelector("#uploadContent"),r=this.htmlElement.querySelector("#embedContent");t&&n&&i?(n.style.display="inline",n.classList.add("active"),i.classList.add("active"),r.classList.remove("active"),o.classList.remove("active")):(n.style.display="none",n.classList.remove("active"),i.classList.remove("active"),r.classList.add("active"),o.classList.add("active"))}this.htmlElement.style.visibility="visible",e&&this.changeToolbarPositionToBeClosedTo(e),super.show();const n=document.querySelector("#embedContent input");n&&this.isElementVisible(n)&&(n.style.backgroundColor="white",setTimeout((()=>{n.focus()}),100))}setInputPlaceholder(e){const t=document.querySelector("#embedContent input");"image-embed-placeholder-text"!=e?"youtube-embed-placeholder-text"!=e?"spotify-embed-placeholder-text"!=e?"github-gist-embed-placeholder-text"!=e?"codepen-embed-placeholder-text"!=e?t.setAttribute("placeholder","Paste URL here..."):t.setAttribute("placeholder","https://codepen.io/..."):t.setAttribute("placeholder","https://gist.github.com/..."):t.setAttribute("placeholder","https://open.spotify.com/..."):t.setAttribute("placeholder","https://www.youtube.com/..."):t.setAttribute("placeholder","https://example.com/image.jpg")}isElementVisible(e){if(null===e.offsetParent)return!1;const t=e.getBoundingClientRect();return t.width>0&&t.height>0}hide(){this.inputValue="",super.hide()}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";let n=t.left+window.scrollX+t.width/2-this.htmlElement.offsetWidth/2,o=t.bottom+window.scrollY+10;this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${o}px`}}class Fe{static build(){return new Pe}}class _e{static build(){return Q.getInstance(ke.build(),Oe.build(),te.build(),Ce.build(),we.build(),Re.build(),Fe.build())}}class Ve{static instance;editor;constructor(e){if(Ve.instance)throw new Error;this.editor=e,Ve.instance=this}static build(){return Ve.instance?Ve.instance:new Ve(_e.build())}start(){return this.insertIcons(),this.editor}insertIcons(){if(!document.querySelector(".svg-icons-container")){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- \r\n \r\n --\x3e\r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n',e.className="svg-icons-container",document.body.appendChild(e)}}}class je{static instance=null;blockOperationsService;tableOperationsService;textOperationsService;constructor(e,t,n){if(je.instance)throw new Error("Attempt to instantiate singleton `CommandDispatcher` more than once.");this.blockOperationsService=e,this.textOperationsService=t,this.tableOperationsService=n}static getInstance(){const e=D.Instance.resolve("IBlockOperationsService"),t=D.Instance.resolve("ITextOperationsService"),n=D.Instance.resolve("ITableOperationsService");return je.instance||(je.instance=new je(e,t,n)),je.instance}listen(){document.addEventListener(c.emittedCommand,this.handleCommandEvent),document.addEventListener(c.pressedEnterOnTitle,(()=>this.blockOperationsService.createANewParagraphFromTitle()))}handleCommandEvent=e=>{const{command:t,showUI:n,value:o,targetBlockType:i,block:r,scope:l}=e.detail;switch(t){case h.linkReadyToInsert:if(!o)throw new Error(`${h.linkReadyToInsert} requires value`);this.textOperationsService.execInsertLink(o);break;case h.toggleLink:this.textOperationsService.execToggleLink();break;case h.toggleBold:this.textOperationsService.execBold();break;case h.toggleInlineCode:this.textOperationsService.execInlineCode();break;case h.toggleItalic:this.textOperationsService.execItalic();break;case h.toggleUnderline:this.textOperationsService.execUnderline();break;case h.toggleStrikeThrough:this.textOperationsService.execStrikeThrough();break;case h.toggleHiliteColor:if(!o)throw new Error(`${h.toggleHiliteColor} requires a color value`);this.textOperationsService.execHiliteColor(o);break;case h.toggleForeColor:if(!o)throw new Error(`${h.toggleForeColor} requires a color value`);this.textOperationsService.execForeColor(o);break;case h.transformBlock:if(!o)throw new Error(`${h.transformBlock} requires a value that represents the target element type.`);this.blockOperationsService.transformBlock(o,r);break;case h.duplicateBlock:this.blockOperationsService.execDuplicateBlock(r);break;case h.deleteBlock:this.blockOperationsService.execDeleteBlock(r);break;case h.deleteBlockAndFocusOnPrevious:this.blockOperationsService.execDeleteFocusOnPrevious();break;case h.deleteBlockAndFocusOnNext:this.blockOperationsService.execDeleteAndFocusOnNext();break;case h.focusOnNextBlock:this.blockOperationsService.execFocusOnNext();break;case h.removeFormat:this.execRemoveFormat(t);break;case h.JustifyLeft:if(!r)throw new Error(`${h.JustifyLeft} requires a block to justify.`);this.blockOperationsService.justifyLeft(r);break;case h.JustifyCenter:if(!r)throw new Error(`${h.JustifyCenter} requires a block to justify.`);this.blockOperationsService.justifyCenter(r);break;case h.JustifyRight:if(!r)throw new Error(`${h.JustifyRight} requires a block to justify.`);this.blockOperationsService.justifyRight(r);break;case h.changeCodeBlockLanguage:if(!r)throw new Error(`${h.changeCodeBlockLanguage} requires a block to change a code block language.`);if(!o)throw new Error(`${h.changeCodeBlockLanguage} requires a value to change a code block language.`);this.blockOperationsService.changeCodeBlockLanguage(r,o);break;case h.createDefaultBlock:this.execCreateDefaultBlock(t);break;case h.insertNew:this.execInsertNew(t);break;case h.focusOnPreviousBlock:this.execFocusOnPreviousBlock(t);break;case h.mergeWithNextBlock:this.blockOperationsService.execMergeWithNextBlock();break;case h.mergeWithPreviousBlock:this.blockOperationsService.execMergeWithPreviousBlock();break;case h.insertTableColumnLeft:this.tableOperationsService.insertColumnLeft();break;case h.insertTableColumnRight:this.tableOperationsService.insertColumnRight(r||null);break;case h.insertTableRowAbove:this.tableOperationsService.insertRowAbove();break;case h.insertTableRowBelow:this.tableOperationsService.insertRowBelow(r||null);break;case h.toggleCellHiliteColor:if(!o)throw new Error(`${h.toggleCellHiliteColor} requires a value that represents the cell background color.`);this.tableOperationsService.execCellBackgroundColor(o);break;case h.changeCalloutBackgroundColor:if(!r)throw new Error(`${h.changeCalloutBackgroundColor} requires a block.`);if(!o)throw new Error(`${h.changeCalloutBackgroundColor} requires a value that represents the background color.`);this.blockOperationsService.execChangeCalloutBackground(r,o);break;case h.removeColumn:this.tableOperationsService.removeColumn();break;case h.removeRow:case h.removeRow:this.tableOperationsService.removeRow();break;case h.changeTableBorderColor:this.tableOperationsService.changeTableBorderColor(l,o);break;default:console.error(`No action defined for command: ${t}`)}};execRemoveFormat(e){const t=this.blockOperationsService.execCommand(e,!1),n=P.getActiveContentEditable();return n&&n.normalize(),t}execCreateDefaultBlock(e){return this.blockOperationsService.execCommand(e,!1)}execInsertNew(e){return this.blockOperationsService.createNewElementAndSplitContent()}execFocusOnPreviousBlock(e){return this.blockOperationsService.execCommand(e,!1)}}class Ye{static instance=null;constructor(){if(Ye.instance)throw new Error("Use ShortcutListeners.getInstance() to get instance.");this.listen()}startListen(){console.log("listening keyboard shortcuts")}static getInstance(){return Ye.instance?Ye.instance:new Ye}listen(){document.addEventListener("keydown",(e=>{const t=e.code.startsWith("Numpad"),n=e.getModifierState("NumLock");(e.ctrlKey||e.metaKey)&&e.shiftKey&&"Enter"===e.key?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.PARAGRAPH}}))):!e.ctrlKey&&!e.metaKey||e.altKey||"Digit1"!==e.code&&"Numpad1"!==e.code?!e.ctrlKey&&!e.metaKey||e.shiftKey||"."!==e.key?!e.ctrlKey&&!e.metaKey||e.shiftKey||"/"!==e.key?e.ctrlKey&&e.altKey&&("Digit1"===e.code||t&&n&&"Numpad1"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_1}}))):e.ctrlKey&&e.altKey&&("Digit2"===e.code||t&&n&&"Numpad2"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_2}}))):e.ctrlKey&&e.altKey&&("Digit3"===e.code||t&&n&&"Numpad3"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_3}}))):e.ctrlKey&&e.altKey&&("Digit4"===e.code||t&&n&&"Numpad4"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_4}}))):e.ctrlKey&&e.altKey&&("Digit5"===e.code||t&&n&&"Numpad5"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_5}}))):e.ctrlKey&&e.altKey&&("Digit6"===e.code||t&&n&&"Numpad6"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.HEADER_6}}))):"D"!==e.key&&"d"!==e.key||!e.ctrlKey?"Delete"!==e.key&&"Backspace"!==e.key||!e.shiftKey?"\\"===e.key&&(e.ctrlKey||e.metaKey)?document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.removeFormat}})):e.ctrlKey&&e.altKey&&"Digit1"===e.code&&e.preventDefault():(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.duplicateBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.NUMBERED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.BULLETED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:H.ELEMENT_TYPES.CHECK_LIST}})))}))}}class ze{static instance=null;focusStack;shownElements=new Map;constructor(e){if(ze.instance)throw new Error("Use TableEventListeners.getInstance() to get instance.");this.focusStack=e,this.listen()}startListen(){console.log("listening table clicks")}static getInstance(){const e=D.Instance.resolve("IFocusStack");return ze.instance?ze.instance:new ze(e)}listen(){document.addEventListener("click",(e=>{let t=null;if(t=e.target.nodeType==Node.TEXT_NODE?e.target.parentElement:e.target,t?.closest(".add-table-column")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableColumnRight,block:t.closest(".block")}});document.dispatchEvent(e)}if(t?.closest(".add-table-row")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableRowBelow,block:t.closest(".block")}});document.dispatchEvent(e)}}))}}class Ue{static instance;stack;capacity=10;constructor(){this.stack=[]}static getInstance(){return Ue.instance||(Ue.instance=new Ue),Ue.instance}push(e){this.stack.length>=this.capacity&&this.stack.shift(),this.stack.push(e)}peek(){return this.stack[this.stack.length-1]}clear(){this.stack=[]}}class Ge{static instance;elementFactoryService;memento;focusStack;constructor(e,t,n){if(Ge.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.focusStack=t,this.memento=n,Ge.instance=this}execCommand(e,t,n=null){if(e==h.copySelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();navigator.clipboard.writeText(t).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==h.cutSelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();e.deleteFromDocument(),navigator.clipboard.writeText(t).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==h.past)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const t=document.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents(),n.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==h.transformBlock&&this.getCurrentSelectedBlock()&&n&&this.transformBlock(n),e==h.removeFormat)return document.execCommand(h.removeFormat,!1);if(e==h.createDefaultBlock){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==h.focusOnFirstBlock){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==h.deleteBlockAndFocusOnPrevious)throw new Error("Remove all reference to this code");if(e==h.deleteBlockAndFocusOnNext)throw new Error("Remove all reference to this code");return!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(){const e=D.Instance.resolve("IElementFactoryService"),t=D.Instance.resolve("IFocusStack"),n=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ge(e,t,n)),this.instance}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t.closest(".block")}throw new Error}execMergeWithPreviousBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getPreviousContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(t),setTimeout((()=>{const n=P.saveCaretPosition2d(t);if(t.innerHTML=t.innerHTML+e.innerHTML,e.closest("li")){const t=e.closest("li");t&&t.remove()}else{const t=e.closest(".block");t&&t.remove()}const o={charIndex:n.charIndex+t.textContent.length,horizontalPos:n.horizontalPos};P.restoreCaretPosition2d(t,o)}),10)})))}execMergeWithNextBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getNextContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(e),setTimeout((()=>{const n=P.saveCaretPosition2d(e);if(e.innerHTML=e.innerHTML+t.innerHTML,e.closest("li")){const e=t.closest("li");e&&e.remove()}else{const e=t.closest(".block");e&&e.remove()}P.restoreCaretPosition2d(e,n)}),10)})))}execDuplicateBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock());const t=e.cloneNode(!0);t.querySelectorAll(".exclude-from-clone").forEach((e=>e.remove()));const n=e.nextSibling;e.parentNode?.insertBefore(t,n),t.id=`b-${O.generateUniqueId()}`;const o=new CustomEvent(c.blockCloned,{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}execDeleteBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock()),this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e);const t=new CustomEvent(c.blockDeleted,{bubbles:!0,cancelable:!0});return document.dispatchEvent(t),!0}transformBlock(e,t){let n;n=t?t.closest(".block"):this.focusStack.peek()?.closest(".block")||null,t||(t=P.findClosestAncestorOfActiveElementByClass(".block"));let o=n.querySelector(".swittable");this.focusStack.peek()?.focus(),P.removeFilterText(),this.memento.saveState();let i,r=o?.innerText,l=null;switch(e){case H.ELEMENT_TYPES.PARAGRAPH:{i=this.elementFactoryService.create(H.ELEMENT_TYPES.PARAGRAPH);const e=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&(i.innerHTML=e.innerHTML);break}case H.ELEMENT_TYPES.HEADER_1:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_1),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_2:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_2),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_3:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_3),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_4:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_4),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_5:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_5),i.innerText=r;break;case H.ELEMENT_TYPES.HEADER_6:i=this.elementFactoryService.create(H.ELEMENT_TYPES.HEADER_6),i.innerText=r;break;case H.ELEMENT_TYPES.CODE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.CODE);break;case H.ELEMENT_TYPES.QUOTE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.QUOTE);break;case H.ELEMENT_TYPES.BULLETED_LIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.BULLETED_LIST,r);break;case H.ELEMENT_TYPES.NUMBERED_LIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.NUMBERED_LIST,r);break;case H.ELEMENT_TYPES.CHECK_LIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.CHECK_LIST,r);break;case H.ELEMENT_TYPES.SEPARATOR:i=this.elementFactoryService.create(H.ELEMENT_TYPES.SEPARATOR);break;case H.ELEMENT_TYPES.TABLE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.TABLE,",,");break;case H.ELEMENT_TYPES.IMAGE:i=this.elementFactoryService.create(H.ELEMENT_TYPES.IMAGE,r),l=i;break;case H.ELEMENT_TYPES.VIDEO:i=this.elementFactoryService.create(H.ELEMENT_TYPES.VIDEO,r),l=i;break;case H.ELEMENT_TYPES.SPOTIFY:i=this.elementFactoryService.create(H.ELEMENT_TYPES.SPOTIFY,r),l=i;break;case H.ELEMENT_TYPES.GITHUB_GIST:i=this.elementFactoryService.create(H.ELEMENT_TYPES.GITHUB_GIST,r),l=i;break;case H.ELEMENT_TYPES.GITLAB_SNIPPET:i=this.elementFactoryService.create(H.ELEMENT_TYPES.GITLAB_SNIPPET,r),l=i;break;case H.ELEMENT_TYPES.CODEPEN:i=this.elementFactoryService.create(H.ELEMENT_TYPES.CODEPEN,r),l=i;break;case H.ELEMENT_TYPES.CALLOUT:{i=this.elementFactoryService.create(H.ELEMENT_TYPES.CALLOUT);const e=i.querySelector(".callout-text"),t=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&t&&(e.innerHTML=t.innerHTML);break}default:return void console.error("Unsupported type")}if(!i)return;n.replaceChild(i,o);const s=i.closest(".focusable")||n.querySelector(".focusable");if(s&&(s.focus(),P.placeCursorAtEndOfEditableElement(s)),l&&this.focusStack.push(l),"image"==e||"video"==e||"spotify"==e||"github-gist"==e||"gitlab-snippet"==e||"codepen"==e){const e=l?.querySelector(".content-placeholder");e&&this.focusStack.push(e),G.emitShowElementEvent("mediaInputter")}const a=n?.querySelector(".block-toolbar-wrapper");if(a&&a.remove(),e==H.ELEMENT_TYPES.SEPARATOR){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.createDefaultBlock}});document.dispatchEvent(e)}}createNewElement(e){this.memento.saveState();const t=e.target.closest(".johannes-content-element");t&&t.classList.contains("list")?this.createListItem(t):this.createDefaultBlock(t)}createListItem(e){this.memento.saveState();let t=null,n=(document.activeElement,e.closest(".johannes-content-element"));n.classList.contains("checkbox-list")?t=this.elementFactoryService.create("checkboxItem",""):n.classList.contains("list")&&(t=this.elementFactoryService.create("listItem",""))}createNewElementAndSplitContent(){this.memento.saveState();const e=P.getContentTypeFromActiveElement();if(e==o.Table)return!1;if(e==o.CheckList||e==o.BulletedList||e==o.NumberedList){const e=P.findClosestAncestorOfActiveElementByClass("list-item");if(e&&P.hasTextContent(e)){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),o=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,o)}}else if(e){const t=e.closest(".block");if(t){const n=t.querySelectorAll(".list-item").length,o=H.blockParagraph();P.insertAfter(o,t),e.remove(),1==n&&t.remove();const i=o.querySelector("p");P.placeCursorAtStartOfEditableElement(i)}}}else{const e=P.findClosestAncestorOfActiveElementByClass("block");if(e){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),i=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,i),this.transformBlock(o.Paragraph,t)}const n=t.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(n)}}return!0}createANewParagraphFromTitle(){this.memento.saveState();const e=document.querySelector("#johannesEditor .title h1"),t=P.cloneAndInsertAfter(e);t&&P.rearrangeContentAfterSplit(e,t);const n=this.elementFactoryService.create(H.ELEMENT_TYPES.BLOCK_PARAGRAPH,""),o=n.querySelector(`.${l.ContentElement}`);o&&(o.innerHTML=t?.innerHTML||"");const i=document.querySelector("#johannesEditor .content");if(i){i.prepend(n);const e=n.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(e)}t?.remove()}createDefaultBlock(e){this.memento.saveState();const t=this.elementFactoryService.create(H.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");return e&&e.closest(".block")?e.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus(),this.focusStack.push(t),t}execFocusOnNext(){let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),!0)}execDeleteFocusOnPrevious(){this.memento.saveState();const e=document.activeElement;return this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0}execDeleteAndFocusOnNext(){this.memento.saveState();let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0)}focusOnPrevious(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[e.length-1],void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n));i=i.previousElementSibling}}getPreviousFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.previousElementSibling;if(!n)return null;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.previousElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[e.length-1],t;o=o.previousElementSibling}return t}focusOnNext(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[0],t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n;i=i.nextElementSibling}return n}getNextFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.nextElementSibling;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.nextElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[0],t;o=o.nextElementSibling}return t}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const t=e.closest(".block"),n=e.closest(".deletable");n?.remove(),t&&0==t.querySelectorAll(".editable").length&&t.remove()}applyCursorXEndPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),n.removeAllRanges(),n.addRange(o),e.focus())}applyCursorXStartPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus())}adjustCursorOffset(e,t){let n=document.createRange(),o=e,i=0,r=1/0;for(let o=0;on.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".block")}justifyLeft(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-left")}justifyCenter(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-center")}justifyRight(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-right")}changeCodeBlockLanguage(e,t){this.memento.saveState();const n=e.querySelector("code");n&&(P.removeClassesWithPrefix(n,"language-"),n.classList.add(`language-${t}`),n.removeAttribute("data-highlighted"),hljs.highlightElement(n),G.emitCodeBlockLanguageChangedEvent("code-block-language-menu",e.id,t))}removeJustify(e){const t=e.classList;for(let e=0;e div");n&&(P.removeClassesWithPrefix(n,"callout-background-"),n.classList.add(t))}}class Ze{static instance;memento;textOperationService;constructor(e){if(Ze.instance)throw new Error("Use TextOperationService.getInstance() to get instance.");this.memento=e}static getInstance(){const e=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ze(e)),this.instance}execInsertLink(e){this.memento.saveState(),document.execCommand("createLink",!1,e),setTimeout((()=>{G.emitChangeComponentColorEvent(A.Link,u.IconActiveBlue),this.normalizeAnchors()}),50)}normalizeAnchors(){document.querySelectorAll("#johannesEditor .content a").forEach((e=>{e.hasAttribute("title")||e.setAttribute("title",e.href),e.normalize()}))}execToggleLink(){this.queryAnchorCommandState()?(document.execCommand("unlink",!1),G.emitChangeComponentColorEvent("linkButton",u.IconDefaultBlack)):G.emitShowElementEvent("linkBox")}execBold(){this.memento.saveState(),document.execCommand("bold")&&(document.queryCommandState("bold")?G.emitChangeComponentColorEvent(A.Bold,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Bold,u.IconDefaultBlack))}execInlineCode(){this.memento.saveState(),this.toggleInlineCode()&&(this.queryInlineCodeCommandState()?G.emitChangeComponentColorEvent(A.InlineCode,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.InlineCode,u.IconDefaultBlack))}toggleInlineCode(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0);let n=t.extractContents(),o=!1;const i=document.createElement("span");i.appendChild(n.cloneNode(!0)),i.querySelector("code")&&(o=!0,i.querySelectorAll("code").forEach((e=>{const t=document.createTextNode(e.textContent||"");e.parentNode?.replaceChild(t,e)})),n=i);let r=e.anchorNode;for(;r&&"CODE"!==r.nodeName&&"BODY"!==r.nodeName;)r=r.parentNode;if(r&&"CODE"===r.nodeName){o=!0;const e=document.createTextNode(r.textContent||"");r.parentNode?.replaceChild(e,r)}if(o)t.insertNode(i);else{const e=document.createElement("code");e.appendChild(n),t.insertNode(e)}e.removeAllRanges(),e.addRange(t);const l=P.getActiveContentEditable();return l&&(l.normalize(),P.mergeInlineElements(l)),!0}execItalic(){this.memento.saveState(),document.execCommand("italic")&&(document.queryCommandState("italic")?G.emitChangeComponentColorEvent(A.Italic,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Italic,u.IconDefaultBlack))}execStrikeThrough(){this.memento.saveState(),document.execCommand("strikeThrough")&&(document.queryCommandState("strikeThrough")?G.emitChangeComponentColorEvent(A.Strikethrough,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Strikethrough,u.IconDefaultBlack))}execUnderline(){this.memento.saveState(),document.execCommand("underline")&&setTimeout((()=>{document.queryCommandState("underline")?G.emitChangeComponentColorEvent(A.Underline,u.IconActiveBlue):G.emitChangeComponentColorEvent(A.Underline,u.IconDefaultBlack)}),10)}execHiliteColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("hiliteColor"),document.execCommand("hiliteColor",!1,e)&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")}execForeColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("foreColor"),document.execCommand("foreColor",!1,e)&&G.emitShowHideActiveElementEvent("foreColor",e,"show")}queryCommandState(e,t){return e===h.toggleLink?this.queryAnchorCommandState():e===h.toggleUnderline?this.queryUnderlineCommandState():e===h.toggleHiliteColor?this.queryHiliteColor(t):e===h.toggleForeColor?this.queryForeColor(t):e===h.toggleInlineCode?this.queryInlineCodeCommandState():document.queryCommandState(e)}queryAnchorCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0),n=t.startContainer,o=t.endContainer,i=e=>{for(;e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE&&"a"===e.tagName.toLowerCase())return!0;e=e.parentNode}return!1};return!(!i(n)&&!i(o))||t.cloneContents().querySelectorAll("a").length>0}queryInlineCodeCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("code"))return!0;t=t.parentNode}return!1}queryUnderlineCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("u"))return!0;t=t.parentNode}return!1}queryForeColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return O.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryHiliteColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("span[style*='background-color']")||n.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return O.rgbToHex(i).toUpperCase()===e.toUpperCase()}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const t=[];for(let n=0;no.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&t.push(r)}}return t}findClosestMatchingParent(e,t){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const n=e;if(n.tagName.toLowerCase()===t.nodeType.toLowerCase()&&(!t.classes||t.classes.every((e=>n.classList.contains(e)))))return n}e=e.parentElement}return null}extractSelectedText(e){const t=window.getSelection();if(!t||0===t.rangeCount)return"";const n=t.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return n.intersectsNode(e)?(n.startContainer===e?i=n.startOffset:n.startContainer.contains(e)&&(i=0),n.endContainer===e?r=n.endOffset:n.endContainer.contains(e)&&(r=o.length),i{t.style.backgroundColor=e})),G.emitShowHideActiveElementEvent("backgroundColor",e,"show")):console.error("cell not found")}static isCellBackgroundColor(e,t){if(!e||"TD"!==e.tagName||!e.hasAttribute("data-placeholder"))return!1;const n=window.getComputedStyle(e).getPropertyValue("background-color");return O.rgbToHex(n).toUpperCase()===t.toUpperCase()}queryStateCellBackgroundColor(e){const t=Ne.getActiveTableCell();if(t){const n=window.getComputedStyle(t).getPropertyValue("background-color");return O.rgbToHex(n).toUpperCase()===e.toUpperCase()}return!1}queryAllStateCellBackgroundColor(e,t){let n=!0;return t!=u.BackgroundColorNone&&(e.forEach((e=>{const o=window.getComputedStyle(e).backgroundColor;O.rgbToHex(o).toLocaleLowerCase()!==t.toLocaleLowerCase()&&(n=!1)})),n)}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ke(e,t)),this.instance}insertRowAbove(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No cell is focused");const t=e.parentElement;if(!t)return void console.error("No row is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=n.querySelector("tbody")||n,i=Array.from(o.children).indexOf(t);i<0?console.error("Row index not found"):(Ne.addRow(n,i),G.emitCloseElementEvent(Le.TableToolbar))}insertRowBelow(e){if(this.memento.saveState(),e){const t=e.querySelector("table");if(!t)return void console.error("Table does not exist");{const e=t.querySelector("tr:last-child");if(!e)return void console.error("No rows in the table");{const n=Array.from(t.children[0].children).indexOf(e)+1;Ne.addRow(t,n)}}}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.parentElement,o=t.closest("table");if(!o)return void console.error("Table does not exist");if(n){const e=Array.from(o.children[0].children).indexOf(n)+1;Ne.addRow(o,e),G.emitCloseElementEvent(Le.TableToolbar)}}}insertColumnLeft(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o),G.emitCloseElementEvent(Le.TableToolbar)}insertColumnRight(e){if(this.memento.saveState(),e){const t=e.querySelector("table");t&&Ne.addColumn(t)}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o+1),G.emitCloseElementEvent(Le.TableToolbar)}}showInsertLineElement(e){e.querySelector(".add-table-row").style.visibility="visible"}showInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="visible"}hideInsertRowElement(e){e.querySelector(".add-table-row").style.visibility="hidden"}hideInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="hidden"}changeTableBorderColor(e,t){const n=this.focusStack.peek()?.closest(g.TABLE);n&&Ne.changeCellBorderColor(n,e,t)}}class We{static query="#johannesEditor .content-wrapper";static instance;undoStack=[];redoStack=[];get content(){return document.querySelector(We.query)}constructor(){if(We.instance)throw new Error("Use Memento.getInstance() to get instance.");this.attachEvents(),this.saveState()}saveState(){if(this.content){const e=this.content.cloneNode(!0);setTimeout((()=>{const t=P.saveCaretPosition3d(this.content);e.querySelectorAll(`.${l.EditorOnly}`).forEach((e=>e.remove())),this.undoStack.push({html:e.innerHTML,caretPosition:t}),this.redoStack=[]}),10)}}undo(){if(this.undoStack.length>1){this.redoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.undoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}redo(){if(this.redoStack.length>0){this.undoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.redoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}attachEvents(){document.addEventListener("keydown",(e=>{e.ctrlKey&&"z"===e.key?(this.undo(),e.preventDefault()):e.ctrlKey&&"y"===e.key&&(this.redo(),e.preventDefault())})),document.addEventListener(a.Keyup,(e=>{e.key==p.Space&&this.saveState()}))}static getInstance(){return We.instance||(We.instance=new We),We.instance}}!function(e){e.First="First",e.Last="Last"}(Me||(Me={}));class Qe{static instance;quickMenu;constructor(e){document.addEventListener("keydown",this.handleArrowKeys.bind(this)),this.quickMenu=e}listen(){console.log("EditableNavigation is now listening for key events.")}static getInstance(){if(!Qe.instance){const e=D.Instance.resolve("IQuickMenu");Qe.instance=new Qe(e)}return Qe.instance}handleArrowKeys(e){if(!this.quickMenu.isVisible&&e.key.startsWith("Arrow")&&!e.altKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const t=document.activeElement;if(t&&t.isContentEditable&&this.shouldSwitchEditable(t,e.key)){const n=this.findNextEditable(t,e.key);n&&(e.preventDefault(),e.stopImmediatePropagation(),e.key!=ye.ArrowUp&&e.key!=ye.ArrowDown||this.placeCaretInSimilarPosition(t,n),e.key==ye.ArrowLeft&&P.placeCursorAtEndOfEditableElement(n),e.key==ye.ArrowRight&&P.placeCursorAtStartOfEditableElement(n),n.focus())}}}shouldSwitchEditable(e,t){const n=window.getSelection();if(n&&n.rangeCount>0){let e=n.getRangeAt(0);if(e.endOffset!=e.startOffset)return!1}if(n&&n.rangeCount>0){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(e),i=this.isAtLineBoundary(e,Me.First),r=this.isAtLineBoundary(e,Me.Last);return!!(t===ye.ArrowLeft&&n||t===ye.ArrowRight&&o||t===ye.ArrowUp&&(n||i)||t===ye.ArrowDown&&(o||r))}return!1}isAtLineBoundary(e,t){if(""===e.textContent?.trim())return!0;const n=window.getSelection();if(!n||0===n.rangeCount)return!1;const o=n.getRangeAt(0).getClientRects()[0];if(!o)return!0;const i=e.getBoundingClientRect();return t===Me.First?Math.abs(o.top-i.top)<11:t===Me.Last&&Math.abs(o.bottom-i.bottom)<11}findNextEditable(e,t){const n=Array.from(document.querySelectorAll('[contenteditable="true"]')),o=n.indexOf(e);if(e.closest("td")){const n=e.closest("table"),o=e.closest("td");if(n&&o){const e=Ne.getNeighborCell(n,o,t);if(e)return e}}let i=-1;return i=t===ye.ArrowLeft||t===ye.ArrowRight?t===ye.ArrowLeft?o-1:o+1:this.findVerticalEditableIndex(e,n,t),i<0||i>=n.length?null:n[i]||null}findVerticalEditableIndex(e,t,n){let o=t.indexOf(e);return n===ye.ArrowUp?o--:n===ye.ArrowDown&&o++,o>=0&&o0){const e=n.getRangeAt(0).getBoundingClientRect();n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;if(l){do{if(r&&r.nodeValue){o.setStart(r,0),o.setEnd(r,r.nodeValue.length);for(let t=0;tWe.getInstance())),D.Instance.register("IShortcutListeners",(()=>Ye.getInstance())),D.Instance.register("ITableListeners",(()=>ze.getInstance())),D.Instance.register("IFocusStack",(()=>Ue.getInstance())),D.Instance.register("IElementFactoryService",(()=>H.getInstance())),D.Instance.register("ITextOperationsService",(()=>Ze.getInstance())),D.Instance.register("ITableOperationsService",(()=>Ke.getInstance())),D.Instance.register("IBlockOperationsService",(()=>Ge.getInstance())),D.Instance.register("IQuickMenu",(()=>Ee.getInstance())),D.Instance.register("ITableContextFloatingToolbar",(()=>He.getInstance())),D.Instance.register("IEditableNavigation",(()=>Qe.getInstance())),Ve.build().start(),je.getInstance().listen(),Qe.getInstance().listen(),Ae.getInstance().listen(),document.dispatchEvent(new Event("TextEditorLoaded"))}))})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QW9CRSxTQUFTNUssU0FBUyxtQkFBbUIsSUFBTW9xQyxHQUFlMW9DLGdCQUU5RWdKLEVBQW9CRSxTQUFTNUssU0FBUyxlQUFlLElBQU11cUMsR0FBVzdvQyxnQkFDdEVnSixFQUFvQkUsU0FBUzVLLFNBQVMsMEJBQTBCLElBQU03QixFQUFzQnVELGdCQUM1RmdKLEVBQW9CRSxTQUFTNUssU0FBUywwQkFBMEIsSUFBTWl2QyxHQUFzQnZ0QyxnQkFDNUZnSixFQUFvQkUsU0FBUzVLLFNBQVMsMkJBQTJCLElBQU1peEMsR0FBdUJ2dkMsZ0JBQzlGZ0osRUFBb0JFLFNBQVM1SyxTQUFTLDJCQUEyQixJQUFNNHFDLEdBQXVCbHBDLGdCQUc5RmdKLEVBQW9CRSxTQUFTNUssU0FBUyxjQUFjLElBQU1neUIsR0FBVXR3QixnQkFDcEVnSixFQUFvQkUsU0FBUzVLLFNBQVMsZ0NBQWdDLElBQU04NkIsR0FBNEJwNUIsZ0JBQ3hHZ0osRUFBb0JFLFNBQVM1SyxTQUFTLHVCQUF1QixJQUFNeXlDLEdBQW1CL3dDLGdCQUV0RjRsQyxHQUFVeGtCLFFBQVF5a0IsUUFFbEJHLEdBQWtCaG1DLGNBQWNtcUIsU0FDaEM0bUIsR0FBbUIvd0MsY0FBY21xQixTQUNqQ2IsR0FBYXRwQixjQUFjbXFCLFNBRTNCbnpCLFNBQVNtZixjQUFjLElBQUkrN0IsTUFBTSxvQkFFckMsRyIsInNvdXJjZXMiOlsid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3MiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9qb2hhbm5lcy93ZWJwYWNrL3J1bnRpbWUvbm9uY2UiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0NvbnRlbnRUeXBlcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vSWNvbnMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9ibG9jay10b29sYm94L1Rvb2xib3hPcHRpb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Db21tb25DbGFzc2VzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DdXN0b21VSUV2ZW50cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRGVmYXVsdEpTRXZlbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DdXN0b21FdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL1pJbmRleC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ29sb3JzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL0NvbW1hbmRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvQnV0dG9uSURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9LZXlib2FyZEtleXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9Ecm9wZG93bkl0ZW1JRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RPTUVsZW1lbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25MaXN0SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25NZW51SURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2Fzc2V0cy9jc3MvbWFpbi5jc3M/MWZiYSIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9CYXNlVUlDb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3V0aWxpdGllcy9ET01VdGlscy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvRmxvYXRpbmdUb29sYmFyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9DaGFuZ2VDb2xvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL1Jlc2V0QWN0aXZlQnV0dG9ucy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvQ2xvc2VFbGVtZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9TaG93RWxlbWVudC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvRXZlbnRFbWl0dGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3hXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL1NpemVzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvQWRkQmxvY2tCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQmFzZURvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0pOb2RlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9DaXJjdWxhckRvdWJseUxpbmtlZExpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW0udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9idXR0b24tZ3JvdXAvQnV0dG9uR3JvdXBJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0Jsb2NrVG9vbGJveEJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9ibG9jay10b29sYm94L0Jsb2NrVG9vbGJveC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVFbXB0eS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVTZWN0aW9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1F1aWNrTWVudUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy90aXRsZS9UaXRsZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9UaXRsZUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RpcmVjdGlvbnMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvU2VsZWN0aW9uTW9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0VtYmVkVG9vbC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL1Rvb2xiYXJJRHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0JvdW5kYXJpZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdXRpbGl0aWVzL1RhYmxlVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9jb250ZW50L0NvbnRlbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvQ29udGVudEJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9NZWRpYUlucHV0dGVyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9FZGl0b3JCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1VJQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9Db21tYW5kRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL1Nob3J0Y3V0TGlzdGVuZXJzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvbGlzdGVuZXJzL1RhYmxlTGlzdGVuZXJzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRm9jdXNTdGFjay50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL1RhYmxlT3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9NZW1lbnRvLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRWRpdGFibGVOYXZpZ2F0aW9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIGAvKiogY3Vyc29yIHN0eWxlICovXG5bY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSB7XG4gICAgY3Vyc29yOiB0ZXh0ICFpbXBvcnRhbnQ7XG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7XG59XG5cblxuXG4vKiogQ1NTIHJlc2V0ICovXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xufVxuXG4vKiogYWRkIGJsb2NrICovXG4uYWRkLWJsb2NrIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDMuMTI1cmVtO1xufVxuXG4uYWRkLWJsb2NrLXdyYXBwZXI6aG92ZXIgLmFkZC1ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLyoqIGFuZCBhZGQgYmxvY2sgKi9cblxuXG5cbi8qKiBMaXN0ICAqKi9cbi5saXN0IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAxMHB4O1xuXG59XG5cbi5saXN0LWl0ZW0tY2hlY2thYmxlIGlucHV0IHtcbiAgICBtYXJnaW4tdG9wOiAwLjVyZW07XG59XG5cbi5saXN0IGxpIGRpdiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBsaW5lLWhlaWdodDogMTtcbn1cblxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50LFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICBwYWRkaW5nLWxlZnQ6IDFyZW0gIWltcG9ydGFudDtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaT5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgdG9wOiAwO1xuXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcblxufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTo6YmVmb3JlIHtcbiAgICBtYXJnaW4tbGVmdDogMC4zMTI1cmVtO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOmhvdmVyPmJ1dHRvbiB7XG4gICAgLyogZGlzcGxheTogaW5saW5lLWJsb2NrOyAqL1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuXG59XG5cbnAuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgLmNoZWNrYm94LWxpc3Qge1xuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xufVxuXG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdWwuY2hlY2tib3gtbGlzdCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtzcGFuIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcbn1cblxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xuLmJsb2NrIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkK2RpdiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cbi5ibG9jayBvbCxcbi5ibG9jayB1bCB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXG4uYmxvY2sgb2wgLmxpc3QtaXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuXG59XG5cbi5ibG9jayBvbCBsaSB7XG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGl0ZW07XG59XG5cbi5ibG9jayBvbCBsaTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBjb3VudGVyKGl0ZW0pIFwiLlwiO1xuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgLyogd2lkdGg6IDE4cHg7ICovXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuXG4uYmxvY2sgdWwgbGk6bm90KC5uby1saXN0LXN0eWxlKTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiBcIuKAolwiO1xuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5saXN0LWl0ZW0tY2hlY2thYmxlIGlucHV0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcbn1cblxuXG4vKiogYW5kIGxpc3QgKiovXG5cblxuLmRyYWctaGFuZGxlciB7XG4gICAgY29sb3I6ICM4NDg4OGQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGN1cnNvcjogZ3JhYjtcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kcmFnLWhhbmRsZXItd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMDtcbiAgICB3aWR0aDogMDtcbn1cblxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG59XG5cbi5ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xufVxuXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzO1xufVxuXG4uZHJvcC1saW5lIHtcbiAgICBoZWlnaHQ6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzg0ODg4ZDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuXG4udGl0bGUgaDEge1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG4gICAgbGluZS1oZWlnaHQ6IDNyZW07XG59XG5cblxuW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6Zm9jdXMge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGQ7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTpmb2N1czpiZWZvcmUge31cblxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5jaXRlW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6YmVmb3JlIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuKltjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdOm5vdChoMSlbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6Zm9jdXM6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxubGkuZGl2W2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06ZW1wdHk6aG92ZXI6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cblxuXG5oMSB7XG4gICAgZm9udC1zaXplOiAyLjVyZW07XG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xufVxuXG4uY29udGVudCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cblxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cblxuXG5bY29udGVudGVkaXRhYmxlXSB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuYm9keSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJOb3RvIFNhbnNcIiwgXCJMaWJlcmF0aW9uIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFwiQXBwbGUgQ29sb3IgRW1vamlcIiwgXCJTZWdvZSBVSSBFbW9qaVwiLCBcIlNlZ29lIFVJIFN5bWJvbFwiLCBcIk5vdG8gQ29sb3IgRW1vamlcIjtcbiAgICBtYXJnaW4tYm90dG9tOiAyMDBweDtcbn1cblxuXG4uZWRpdG9yIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi10b3A6IDgwcHg7XG59XG5cbnAge1xuICAgIGNvbG9yOiAjMjQyNDI0O1xufVxuXG5cbi5ibG9jayxcbi5ibG9jayAqIHtcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbn1cblxuXG4jam9oYW5uZXNFZGl0b3Ige1xuICAgIHdpZHRoOiA2MCU7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIGhyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbn1cblxuXG5cbi5qb2hhbm5lcy1lZGl0b3IgYmxvY2txdW90ZSB7XG4gICAgbWFyZ2luOiAwLjVyZW0gMDtcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIGNpdGUge1xuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG5cbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZTo6YmVmb3JlIHtcbiAgICBjb250ZW50OiAn4oCUICc7XG59XG5cblxuI2xpbmtCb3gge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbiNsaW5rQm94IC5oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgICBmb250LXNpemU6IDAuODZyZW07XG4gICAgY29sb3I6ICMzNzM1MmZkOTtcbiAgICBmb250LXdlaWdodDogNjAwO1xufVxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDFyZW07XG4gICAgcGFkZGluZzogMjBweDtcbn1cblxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwgaW5wdXQge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cblxuLmN0cmwtYWN0aXZlIC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgYSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5cbi8qKiBzb2Z0LWJveC1zaGFkb3cgY2xhc3MgKi9cbi5zb2Z0LWJveC1zaGFkb3cge1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDIxNiwgMTk2LCAxOTYsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcbn1cblxuLyoqIGFuZCBzb2Z0LWJveC1zaGFkb3cgKi9cblxuXG4vKiogc2VsZWN0aW9uLXdyYXBwZXIgY2xhc3MgKi9cbi5zZWxlY3Qtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgICB0b3A6IDIuMnJlbTtcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuMzEyNXJlbTtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuLFxuLnNlbGVjdC13cmFwcGVyIGJ1dHRvbiBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcbiAgICB3aWR0aDogMS4zNzVyZW07XG4gICAgaGVpZ2h0OiAxLjM3NXJlbTtcbiAgICBjb2xvcjogIzI0MjQyNDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4uc2VsZWN0LXdyYXBwZXI+YnV0dG9uIHtcbiAgICBjb2xvcjogIzM3MzUyZmQ5O1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xuICAgIG1hcmdpbjogMDtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICMzNzM1MmZhNjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcbn1cblxuLyoqIGVuZCBzZWxlY3Rpb24gd3JhcHBlciAqKi9cblxuXG5cbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xuXG5cblxuLmZsb2F0aW5nLXRvb2xiYXIge1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG5cbi5mbG9hdGluZy10b29sYmFyIC5pdGVtIHtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDEwcHg7XG59XG5cbi5pdGVtPmJ1dHRvbixcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbiB7XG5cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuXG4uZmxvYXRpbmctdG9vbGJhciBzZWxlY3Qge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGZvbnQtc2l6ZTogMC44NXJlbTtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OyAqL1xufVxuXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4jdHVybkludG9CdXR0b24gc3BhbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuXG59XG5cbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcbiAgICBtYXJnaW46IGF1dG87XG59XG5cblxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcbiAgICBjb2xvcjogIzIzODJlMjtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICMyMzgyZTIgIWltcG9ydGFudDtcbn1cblxuXG5cbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ubW9yZVRleHRPcHRpb25XcmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuLmJnYy1yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRERFREU7XG59XG5cbi5iZ2MtZ3JlZW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XG59XG5cbi5iZ2MtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbn1cblxuLmJnYy15ZWxsb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQUY0RDE7XG59XG5cbi5iZ2MtZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcbn1cblxucCxcbm1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG5cbi5ib3JkZXItbGVzcy1pbWFnZSB7XG4gICAgd2lkdGg6IDI0cHg7XG4gICAgaGVpZ2h0OiAyNHB4O1xufVxuXG5cblxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMzczNTJmYTY7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjMxMjVyZW07XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb24ge1xuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcbiAgICBtYXJnaW46IDAuMzEyNXJlbSAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG4gICAgZ2FwOiAwLjZyZW07XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuLm9wdGlvbi1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcbi5kYW5nZXItb3B0aW9uLm9wdGlvbi1mb2N1c2VkIHN2ZyB7XG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcbn1cblxuXG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuXG5cbiNjb2xvclRleHRCdXR0b24ge1xuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcbn1cblxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcbiNjb2xvclRleHRCdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuI21vcmVUZXh0T3B0aW9uQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3Zlcixcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMnB4ICNlOWU5ZTk7XG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuXG5cbi5vcHRpb25bZm9jdXNlZD1cInRydWVcIl0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGU0ZmY7XG59XG5cbi5vcHRpb24taW1hZ2Uge1xuICAgIHdpZHRoOiAyLjg3NXJlbTtcbiAgICBoZWlnaHQ6IDIuODc1cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NXJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICAgIGNvbG9yOiAjNGY0ZjRmO1xuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4ub3B0aW9uLWltYWdlIGltZyB7XG4gICAgbWF4LXdpZHRoOiAyLjg3NXJlbTtcbiAgICBtYXgtaGVpZ2h0OiAyLjg3NXJlbTtcbn1cblxuLm9wdGlvbi1pbWFnZSBzdmcge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHBhZGRpbmc6IDAuNjI1cmVtO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbn1cblxuLm9wdGlvbi10ZXh0ICoge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuXG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stdGl0bGUge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogNTAwO1xufVxuXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC41KTtcbn1cblxuLyoqIEVuZCBCbG9jayBPcHRpb25zICoqL1xuXG5cbi5qb2hhbm5lcy1lZGl0b3IgKjo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTtcbiAgICBjb2xvcjogd2hpdGU7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgbWFyayxcbi5qb2hhbm5lcy1lZGl0b3IgKjpub3QoaDEpIHtcbiAgICBsaW5lLWhlaWdodDogMS41ICFpbXBvcnRhbnQ7XG59XG5cbi5vcHRpb24ge1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cblxuLnRleHQtb3B0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMC42MjVyZW07XG59XG5cblxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAvKiBBdW1lbnRhIG8gdGFtYW5obyBkYSBmb250ZSBwYXJhIHRlbGFzIGRlIGFsdGEgZGVuc2lkYWRlICovXG4gICAgfVxufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBhbHTDrXNzaW1hIGRlbnNpZGFkZSAqL1xuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDI4OGRwaSksXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xuICAgIDpyb290IHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXG4gICAgfVxufVxuXG5cblxuXG5cblxuXG5cblxuXG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgICBtYXgtd2lkdGg6IGluaGVyaXQ7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0aCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XG4gICAgbWluLWhlaWdodDogMjBweDtcbn1cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjODQ4ODhkO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGFsaWduLWl0ZW1zOiBzdGFydDtcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xuICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICBtYXgtd2lkdGg6IDIwMHB4O1xuXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xuXG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZC5zZWxlY3RlZCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZDpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggIzc0YjZkYiBpbnNldDtcbiAgICBib3JkZXI6IDFweCBkb3VibGUgIzc0YjZkYjtcblxufVxuXG50ZCB7XG4gICAgbWluLWhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxuXG50ZDo6cGxhY2Vob2xkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG50ZDplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi50YWJsZS13cmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRhYmxlLWNvbnRyb2xsZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbi5hZGQtdGFibGUtcm93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAxcmVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYWRkLXRhYmxlLWNvbHVtbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAtMS4zMTI1cmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XG4gICAgd2lkdGg6IDFyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFyZW0gLSA1cHgpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uYWRkLXRhYmxlLXJvdzpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLnRhYmxlLXNoZWxsIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cblxuXG4udGFibGUtb3B0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuXG4vKiogQ2FsbG91dCAqKi9cblxuLmNhbGxvdXQtd3JhcHBlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbn1cblxuLmNhbGxvdXQ6aG92ZXIgLm9wdGlvbnMtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4uY2FsbG91dCBwIHtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVlYmViO1xuICAgIGJvcmRlci1jb2xvcjogI0ZEREVERTtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmVlbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ViZmJlZTtcbiAgICBib3JkZXItY29sb3I6ICNEN0Y3REM7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZjRmYTtcbiAgICBib3JkZXItY29sb3I6ICNEOUVERjY7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQteWVsbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2RmO1xuICAgIGJvcmRlci1jb2xvcjogI0ZBRjREMTtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmV5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2VjO1xuICAgIGJvcmRlci1jb2xvcjogI0UxRTBFMDtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ub25lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XG5cbn1cblxuLyoqIGVuZCBjYWxsb3V0ICovXG5cblxuLyoqIG1lZGlhSW5wdXR0ZXIgKiovXG4ubWVkaWFJbnB1dHRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi8qKiBtZWRpYUlucHV0dGVyICoqL1xuXG5cbi5uby1zZWxlY3Rpb24ge1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5wb2ludGVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cblxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cblxuLnRhYi1jb250YWluZXIge1xuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xuXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XG5cblxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG5cbn1cblxuLm5hdi11bmRlcmxpbmUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi1yaWdodDogMTVweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1saW5rIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC41KTtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG59XG5cblxuLm5hdi1pdGVtLmFjdGl2ZSAubmF2LWxpbmsge1xuICAgIGNvbG9yOiAjMzczNTJmZDk7XG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcbn1cblxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgcGFkZGluZzogMjBweDtcbiAgICBib3JkZXItdG9wOiBub25lO1xuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcbn1cblxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEuYWN0aXZlIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGdhcDogMXJlbTtcbn1cblxuLnRhYi1jb250ZW50IC50ZXh0LWluZm8ge1xuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjYpO1xufVxuXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbn1cblxuLmVtYmVkLWNvbnRlbnQgaW5wdXQge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5lbWJlZC1jb250ZW50IGJ1dHRvbiB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5cbi51cGxvYWQtY29udGVudCBsYWJlbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiA0cHg7XG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuXG4udXBsb2FkLWNvbnRlbnQgbGFiZWw6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XG59XG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFJlc2l6ZSBoYW5kbGVyICovXG4ucmVzaXplLWhhbmRsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cblxuLnJlc2l6ZS1oYW5kbGUuc2Uge1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbn1cblxuLyoqIFJlc2l6ZSBoYW5kbGVyICoqL1xuXG4uc3BvdGlmeS1lbWJlZCB7XG4gICAgbWluLWhlaWdodDogMTUycHg7XG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiAuNzVyZW0gIWltcG9ydGFudDtcbn1cblxuLmdpc3QtZW1iZWQge1xuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogMTUwcHggIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uc25pcHBldC1lbWJlZCB7XG4gICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICBtaW4taGVpZ2h0OiAxNTBweCAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbi5lbWJlZC1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xuICAgIGhlaWdodDogMDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLmVtYmVkLWNvbnRhaW5lciBpZnJhbWUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cblxuLmlmcmFtZS13cmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuXG4udmlkZW8tY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnZpZGVvLWNvbnRhaW5lciBpZnJhbWUge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG59XG5cblxuXG5cblxuXG5cbi54LXJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XG4gICAgbWluLXdpZHRoOiAyNTBweDtcbn1cblxuLnktcmVzaXphYmxlIHtcbiAgICByZXNpemU6IHZlcnRpY2FsO1xuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGN1cnNvcjogbnMtcmVzaXplO1xuICAgIG1pbi1oZWlnaHQ6IDE1MHB4O1xufVxuXG4uYmFja2dyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTZlMztcbn1cblxuXG4uZml0LWNvbnRlbnQge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBoZWlnaHQ6IGZpdC1jb250ZW50O1xufVxuXG5cbi8qKiBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xuLmJsb2NrLXRvb2xiYXItd3JhcHBlciB7XG4gICAgd2lkdGg6IDA7XG4gICAgaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICBkaXNwbGF5OiBibG9jaztcblxufVxuXG4uYmxvY2stdG9vbGJhciB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZ2FwOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XG5cbiAgICB0b3A6IDVweDtcbiAgICByaWdodDogNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmJsb2NrLXRvb2xiYXIgLml0ZW0ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uYmxvY2stdG9vbGJhciAuaXRlbSBidXR0b24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi5ibG9jay10b29sYmFyIGJ1dHRvbiB7XG4gICAgY29sb3I6IGJsYWNrO1xufVxuXG4uYmxvY2stdG9vbGJhciAuY29sb3ItaW50ZXJhY3RpdmUtYnV0dG9uIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuLyoqIEVuZCBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xuXG5cblxuLmp1c3RpZnktbGVmdCB7XG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xufVxuXG4uanVzdGlmeS1jZW50ZXIge1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uanVzdGlmeS1yaWdodCB7XG4gICAganVzdGlmeS1jb250ZW50OiByaWdodDtcbn1cblxuXG4uaGlkZGVuIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcbn1cblxuXG5cblxuZmlndXJlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbn1cblxuXG4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vKiogSW5saW5lIENvZGUgKiovXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGNvZGU6bm90KHByZSBjb2RlKSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M3YTtcbiAgICBwYWRkaW5nOiAwIDNweDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbn1cblxuLyoqIENvbnRlbnQgcGxhY2Vob2xkZXIgKi9cblxuLmNvbnRlbnQtcGxhY2Vob2xkZXIge1xuICAgIHBhZGRpbmc6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTZlMztcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZ2FwOiA1cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY29udGVudC1wbGFjZWhvbGRlciAuaWNvbi13cmFwcGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XG59XG5cblxuLyogZW5kIENvbnRlbnQgcGxhY2Vob2xkZXIgKi9cblxuXG5cbi8qKiBDb2RlICoqL1xuXG5wcmUge1xuICAgIG1hcmdpbjogMDtcbn1cblxucHJlIGNvZGUge1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmlnbm9yZS1ldmVudHMge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNvZGUtYmxvY2sge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNvZGUtYmxvY2sgc2VsZWN0IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5jb2RlLWJsb2NrIHNlbGVjdCB7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgIGZvbnQ6IGluaGVyaXQ7XG4gICAgLyogY29sb3I6IGluaGVyaXQ7ICovXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAxMHB4IGNlbnRlcjtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmNvZGUtYmxvY2s6aG92ZXIgc2VsZWN0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbi5jb2RlLWJsb2NrIGNvZGUge1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcblxufVxuXG5cblxuQGtleWZyYW1lcyBzaGFrZSB7XG5cbiAgICAwJSxcbiAgICAxMDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICAgIH1cblxuICAgIDI1JSxcbiAgICA3NSUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTVweCk7XG4gICAgfVxuXG4gICAgNTAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDVweCk7XG4gICAgfVxufVxuXG4uc2hha2UtYW5pbWF0aW9uIHtcbiAgICBhbmltYXRpb246IHNoYWtlIDAuNnMgY3ViaWMtYmV6aWVyKC4zNiwgLjA3LCAuMTksIC45NykgYm90aDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBwZXJzcGVjdGl2ZTogMTAwMHB4O1xufVxuXG4uYmx1ZS1idXR0b24ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMyMzgzZTI7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBwYWRkaW5nOiAzcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cblxuLyoqIHNlcGFyYXRvciAqKi9cblxuLnNlcGFyYXRvci13cmFwcGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5zZXBhcmF0b3Ige1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG59XG5cbi5zZXBhcmF0b3Itd3JhcHBlciBociB7XG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uc2VwYXJhdG9yLXdyYXBwZXIgaHI6Zm9jdXMge1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLnNlcGFyYXRvci1zZWxlY3RlZCB7XG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xufVxuXG4uc2VwYXJhdG9yLXNlbGVjdGVkIGhyIHtcbiAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBib3JkZXItY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG59XG5cbi8qKiBlbmQgc2VwYXJhdG9yICovXG5cblxuXG5cbiNsaW5rQm94SW5wdXR7XG5cbn1cblxuLmNvbnRlbnQtZGF0YSBpbnB1dDpmb2N1cyxcbiNsaW5rQm94SW5wdXQ6Zm9jdXMge1xuICAgIG91dGxpbmU6IDJweCBzb2xpZCAjNEE5MEUyO1xuICAgIGJveC1zaGFkb3c6IDAgMCA1cHggcmdiYSg3NCwgMTQ0LCAyMjYsIDAuNSk7XG59XG5cblxuLmQtbm9uZXtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvYXNzZXRzL2Nzcy9tYWluLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQSxrQkFBa0I7QUFDbEI7SUFDSSx1QkFBdUI7SUFDdkIsZ0NBQWdDO0FBQ3BDOzs7O0FBSUEsZUFBZTtBQUNmO0lBQ0ksWUFBWTtJQUNaLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsYUFBYTtJQUNiLG1CQUFtQjtBQUN2Qjs7QUFFQSxlQUFlO0FBQ2Y7SUFDSSxTQUFTO0lBQ1QsVUFBVTtJQUNWLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0QixtQkFBbUI7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c0NBQXNDO0FBQzFDOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLDhCQUE4QjtBQUNsQzs7QUFFQSxtQkFBbUI7Ozs7O0FBS25COztBQUVBOztBQUVBOztJQUVJLDBCQUEwQjtJQUMxQiwyQ0FBMkM7QUFDL0M7OztBQUdBO0lBQ0ksd0JBQXdCO0FBQzVCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKiBjdXJzb3Igc3R5bGUgKi9cXG5bY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl0ge1xcbiAgICBjdXJzb3I6IHRleHQgIWltcG9ydGFudDtcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbi8qKiBDU1MgcmVzZXQgKi9cXG4uYnV0dG9uLXJlc2V0IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIGZvbnQ6IGluaGVyaXQ7XFxuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XFxufVxcblxcbi8qKiBhZGQgYmxvY2sgKi9cXG4uYWRkLWJsb2NrIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XFxufVxcblxcbi5hZGQtYmxvY2std3JhcHBlciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDMuMTI1cmVtO1xcbn1cXG5cXG4uYWRkLWJsb2NrLXdyYXBwZXI6aG92ZXIgLmFkZC1ibG9jayB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi8qKiBhbmQgYWRkIGJsb2NrICovXFxuXFxuXFxuXFxuLyoqIExpc3QgICoqL1xcbi5saXN0IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgZ2FwOiAxMHB4O1xcblxcbn1cXG5cXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XFxuICAgIG1hcmdpbi10b3A6IDAuNXJlbTtcXG59XFxuXFxuLmxpc3QgbGkgZGl2IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIGxpbmUtaGVpZ2h0OiAxO1xcbn1cXG5cXG5vbC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQsXFxudWwuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtICFpbXBvcnRhbnQ7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogbm9uZTsgKi9cXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBtYXJnaW4tbGVmdDogMTBweDtcXG4gICAgdG9wOiAwO1xcblxcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogc3RhcnQ7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuXFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGkge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuXFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjMxMjVyZW07XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6aG92ZXI+YnV0dG9uIHtcXG4gICAgLyogZGlzcGxheTogaW5saW5lLWJsb2NrOyAqL1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG5cXG59XFxuXFxucC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIGxpbmUtaGVpZ2h0OiAxO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxufVxcblxcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgLmNoZWNrYm94LWxpc3Qge1xcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxuICAgIHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IGxpIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xcbn1cXG5cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cXFwiY2hlY2tib3hcXFwiXTpjaGVja2VkK3NwYW4ge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xcbi5ibG9jayBpbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdOmNoZWNrZWQrZGl2IHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cXG4uYmxvY2sgb2wsXFxuLmJsb2NrIHVsIHtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuXFxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXG5cXG59XFxuXFxuLmJsb2NrIG9sIGxpIHtcXG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGl0ZW07XFxufVxcblxcbi5ibG9jayBvbCBsaTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcXFwiLlxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xcbn1cXG5cXG4uYmxvY2sgdWwgbGk6bm90KC5uby1saXN0LXN0eWxlKTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIuKAolxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG5cXG4vKiogYW5kIGxpc3QgKiovXFxuXFxuXFxuLmRyYWctaGFuZGxlciB7XFxuICAgIGNvbG9yOiAjODQ4ODhkO1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XFxuICAgIGN1cnNvcjogZ3JhYjtcXG4gICAgYWxpZ24tc2VsZjogc3RhcnQ7XFxuICAgIHBhZGRpbmctdG9wOiAwLjMzcmVtO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5kcmFnLWhhbmRsZXItd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgaGVpZ2h0OiAwO1xcbiAgICB3aWR0aDogMDtcXG59XFxuXFxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEuMjVyZW0gIWltcG9ydGFudDtcXG59XFxuXFxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxufVxcblxcbi5kcm9wLWxpbmUge1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NDg4OGQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG4udGl0bGUgaDEge1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbiAgICBsaW5lLWhlaWdodDogM3JlbTtcXG59XFxuXFxuXFxuW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOmVtcHR5OmZvY3VzIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuaDFbZGF0YS1wbGFjZWhvbGRlcl06Zm9jdXM6YmVmb3JlIHt9XFxuXFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuY2l0ZVtjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmZvY3VzOmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmxpLmRpdltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuaDEge1xcbiAgICBmb250LXNpemU6IDIuNXJlbTtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY29udGVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4uY29udGVudCAuYmxvY2sgLnRhYmxlLXdyYXBwZXIge1xcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XFxufVxcblxcblxcbltjb250ZW50ZWRpdGFibGVdIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG59XFxuXFxuYm9keSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBcXFwiU2Vnb2UgVUlcXFwiLCBSb2JvdG8sIFxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCIsIFxcXCJOb3RvIFNhbnNcXFwiLCBcXFwiTGliZXJhdGlvbiBTYW5zXFxcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFxcXCJBcHBsZSBDb2xvciBFbW9qaVxcXCIsIFxcXCJTZWdvZSBVSSBFbW9qaVxcXCIsIFxcXCJTZWdvZSBVSSBTeW1ib2xcXFwiLCBcXFwiTm90byBDb2xvciBFbW9qaVxcXCI7XFxuICAgIG1hcmdpbi1ib3R0b206IDIwMHB4O1xcbn1cXG5cXG5cXG4uZWRpdG9yIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgbWFyZ2luLXRvcDogODBweDtcXG59XFxuXFxucCB7XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbn1cXG5cXG5cXG4uYmxvY2ssXFxuLmJsb2NrICoge1xcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxufVxcblxcblxcbiNqb2hhbm5lc0VkaXRvciB7XFxuICAgIHdpZHRoOiA2MCU7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgaHIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAycHg7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XFxufVxcblxcblxcblxcbi5qb2hhbm5lcy1lZGl0b3IgYmxvY2txdW90ZSB7XFxuICAgIG1hcmdpbjogMC41cmVtIDA7XFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcXG4gICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZSB7XFxuICAgIHBhZGRpbmctdG9wOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuXFxuLmpvaGFubmVzLWVkaXRvciBjaXRlOjpiZWZvcmUge1xcbiAgICBjb250ZW50OiAn4oCUICc7XFxufVxcblxcblxcbiNsaW5rQm94IHtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4jbGlua0JveCAuaGVhZGVyIHtcXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XFxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcXG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xcbiAgICBjb2xvcjogIzM3MzUyZmQ5O1xcbiAgICBmb250LXdlaWdodDogNjAwO1xcbn1cXG5cXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBnYXA6IDFyZW07XFxuICAgIHBhZGRpbmc6IDIwcHg7XFxufVxcblxcblxcbiNsaW5rQm94IC5saW5rLWJveC1zaGVsbCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4uY3RybC1hY3RpdmUgLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBhIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5cXG4vKiogc29mdC1ib3gtc2hhZG93IGNsYXNzICovXFxuLnNvZnQtYm94LXNoYWRvdyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xcbiAgICBib3gtc2hhZG93OlxcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgyMTYsIDE5NiwgMTk2LCAwLjAyKSxcXG4gICAgICAgIC0ycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKSxcXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xcblxcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xcbn1cXG5cXG4vKiogYW5kIHNvZnQtYm94LXNoYWRvdyAqL1xcblxcblxcbi8qKiBzZWxlY3Rpb24td3JhcHBlciBjbGFzcyAqL1xcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIHtcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcXG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XFxuICAgIHRvcDogMi4ycmVtO1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjMxMjVyZW07XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMC42MjVyZW07XFxuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NXJlbTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkgc3BhbixcXG4uc2VsZWN0LXdyYXBwZXIgYnV0dG9uIHNwYW4ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgIHdpZHRoOiBtYXgtY29udGVudDtcXG4gICAgbGluZS1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Uge1xcbiAgICB3aWR0aDogMS4zNzVyZW07XFxuICAgIGhlaWdodDogMS4zNzVyZW07XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkgLm9wdGlvbi1pbWFnZSBzdmcge1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiB7XFxuICAgIGNvbG9yOiAjMzczNTJmZDk7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaT5oMyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogIzM3MzUyZmE2O1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGZvbnQtd2VpZ2h0OiA2MDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luLXRvcDogMC4zMTI1cmVtO1xcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XFxufVxcblxcbi8qKiBlbmQgc2VsZWN0aW9uIHdyYXBwZXIgKiovXFxuXFxuXFxuXFxuLyoqIFRleHQgZm9ybWF0dGluZyBCYXIgKiovXFxuXFxuXFxuXFxuLmZsb2F0aW5nLXRvb2xiYXIge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG5cXG4uZmxvYXRpbmctdG9vbGJhciAuaXRlbSB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMTBweDtcXG59XFxuXFxuLml0ZW0+YnV0dG9uLFxcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbiB7XFxuXFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHNlbGVjdCB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OyAqL1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b24gc3BhbiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAwLjlyZW07XFxuXFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcXG4gICAgbWFyZ2luOiBhdXRvO1xcbn1cXG5cXG5cXG4udGV4dC1mb3JtYXR0aW5nLWJ1dHRvbi1hY3RpdmUge1xcbiAgICBjb2xvcjogIzIzODJlMjtcXG59XFxuXFxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcXG4gICAgYm9yZGVyLWNvbG9yOiAjMjM4MmUyICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLm1vcmVUZXh0T3B0aW9uV3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuXFxuLmJnYy1yZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xcbn1cXG5cXG4uYmdjLWdyZWVuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcXG59XFxuXFxuLmJnYy1ibHVlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcXG59XFxuXFxuLmJnYy15ZWxsb3cge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkFGNEQxO1xcbn1cXG5cXG4uYmdjLWdyZXkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFFMEUwO1xcbn1cXG5cXG5wLFxcbm1hcmsge1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxuXFxuLmJvcmRlci1sZXNzLWltYWdlIHtcXG4gICAgd2lkdGg6IDI0cHg7XFxuICAgIGhlaWdodDogMjRweDtcXG59XFxuXFxuXFxuXFxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuLmJsb2NrLW9wdGlvbnMtd3JhcHBlciB7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyB7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgbWF4LWhlaWdodDogMTlyZW07XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHNlY3Rpb24gaDIge1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiAjMzczNTJmYTY7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW4tdG9wOiAwLjMxMjVyZW07XFxuICAgIG1hcmdpbi1ib3R0b206IDAuMzEyNXJlbTtcXG4gICAgcGFkZGluZy1sZWZ0OiAwLjMxMjVyZW07XFxufVxcblxcbi5ibG9jay1vcHRpb25zIC5vcHRpb24ge1xcbiAgICBwYWRkaW5nOiAwLjMxMjVyZW0gMC42MjVyZW07XFxuICAgIG1hcmdpbjogMC4zMTI1cmVtIDA7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xcbiAgICBnYXA6IDAuNnJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xcbn1cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi5vcHRpb24tZm9jdXNlZCB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJvcmRlcjogbm9uZTtcXG59XFxuXFxuLmRhbmdlci1vcHRpb24ub3B0aW9uLWZvY3VzZWQsXFxuLmRhbmdlci1vcHRpb24ub3B0aW9uLWZvY3VzZWQgc3ZnIHtcXG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbjpmb2N1cy12aXNpYmxlIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBpbmhlcml0O1xcbn1cXG5cXG5cXG5cXG4jY29sb3JUZXh0QnV0dG9uIHtcXG4gICAgbWFyZ2luLWxlZnQ6IDAuNjI1cmVtO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbiNjb2xvclRleHRCdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbiNtb3JlVGV4dE9wdGlvbkJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XFxuICAgIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDJweCAjZTllOWU5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XFxuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcXG59XFxuXFxuXFxuXFxuLm9wdGlvbltmb2N1c2VkPVxcXCJ0cnVlXFxcIl0ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmRlNGZmO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDIuODc1cmVtO1xcbiAgICBoZWlnaHQ6IDIuODc1cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAwLjE4NzVyZW07XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxuICAgIGNvbG9yOiAjNGY0ZjRmO1xcblxcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmY7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcblxcbi5vcHRpb24taW1hZ2UgaW1nIHtcXG4gICAgbWF4LXdpZHRoOiAyLjg3NXJlbTtcXG4gICAgbWF4LWhlaWdodDogMi44NzVyZW07XFxufVxcblxcbi5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBwYWRkaW5nOiAwLjYyNXJlbTtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG5cXG59XFxuXFxuLm9wdGlvbi10ZXh0ICoge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAuYmxvY2stdGl0bGUge1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xcbiAgICBmb250LXNpemU6IHNtYWxsICFpbXBvcnRhbnQ7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNSk7XFxufVxcblxcbi8qKiBFbmQgQmxvY2sgT3B0aW9ucyAqKi9cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xcbiAgICBjb2xvcjogd2hpdGU7XFxufVxcblxcbi5qb2hhbm5lcy1lZGl0b3IgbWFyayxcXG4uam9oYW5uZXMtZWRpdG9yICo6bm90KGgxKSB7XFxuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcXG59XFxuXFxuLm9wdGlvbiB7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG59XFxuXFxuLnRleHQtb3B0aW9uIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBzdGFydDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZ2FwOiAwLjYyNXJlbTtcXG59XFxuXFxuXFxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgICAgLyogQXVtZW50YSBvIHRhbWFuaG8gZGEgZm9udGUgcGFyYSB0ZWxhcyBkZSBhbHRhIGRlbnNpZGFkZSAqL1xcbiAgICB9XFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXFxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xcbiAgICA6cm9vdCB7XFxuICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXFxuICAgIH1cXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gICAgbWF4LXdpZHRoOiBpbmhlcml0O1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcXG4gICAgbWluLWhlaWdodDogMjBweDtcXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxuXFxuICAgIHRyYW5zaXRpb246IGJvcmRlciAxMDBtcyBlYXNlLW91dCwgYm94LXNoYWRvdyAxMDBtcyBlYXNlLW91dDtcXG5cXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkLnNlbGVjdGVkLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZDpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCAjNzRiNmRiIGluc2V0O1xcbiAgICBib3JkZXI6IDFweCBkb3VibGUgIzc0YjZkYjtcXG5cXG59XFxuXFxudGQge1xcbiAgICBtaW4taGVpZ2h0OiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAxcmVtO1xcbn1cXG5cXG50ZDo6cGxhY2Vob2xkZXIge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxudGQ6ZW1wdHk6YmVmb3JlIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGFjZDtcXG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuXFxuLnRhYmxlLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG59XFxuXFxuLnRhYmxlLWNvbnRyb2xsZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmFkZC10YWJsZS1yb3cge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBtYXJnaW4tdG9wOiAwLjM3NXJlbTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxcmVtO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4uYWRkLXRhYmxlLWNvbHVtbiB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IC0xLjMxMjVyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XFxuICAgIHdpZHRoOiAxcmVtO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGhlaWdodDogMTAwJTtcXG4gICAgdG9wOiAwO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGhlaWdodDogY2FsYygxMDAlIC0gMXJlbSAtIDVweCk7XFxuICAgIG9wYWNpdHk6IDA7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4uYWRkLXRhYmxlLWNvbHVtbjpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDE7XFxufVxcblxcbi5hZGQtdGFibGUtcm93OmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLnRhYmxlLXNoZWxsIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG5cXG4udGFibGUtb3B0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICB6LWluZGV4OiA5OTk5OTk7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG5cXG4vKiogQ2FsbG91dCAqKi9cXG5cXG4uY2FsbG91dC13cmFwcGVyIHtcXG4gICAgcGFkZGluZzogMXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbn1cXG5cXG4uY2FsbG91dDpob3ZlciAub3B0aW9ucy1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xcbn1cXG5cXG4uY2FsbG91dCBwIHtcXG4gICAgbWFyZ2luOiAwO1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLXJlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZWViZWI7XFxuICAgIGJvcmRlci1jb2xvcjogI0ZEREVERTtcXG59XFxuXFxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmVlbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlYmZiZWU7XFxuICAgIGJvcmRlci1jb2xvcjogI0Q3RjdEQztcXG59XFxuXFxuLmNhbGxvdXQtYmFja2dyb3VuZC1ibHVlIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZjRmYTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjRDlFREY2O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLXllbGxvdyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZGY7XFxuICAgIGJvcmRlci1jb2xvcjogI0ZBRjREMTtcXG59XFxuXFxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmV5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlYztcXG4gICAgYm9yZGVyLWNvbG9yOiAjRTFFMEUwO1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLW5vbmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZTdlNmU2O1xcblxcbn1cXG5cXG4vKiogZW5kIGNhbGxvdXQgKi9cXG5cXG5cXG4vKiogbWVkaWFJbnB1dHRlciAqKi9cXG4ubWVkaWFJbnB1dHRlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4vKiogbWVkaWFJbnB1dHRlciAqKi9cXG5cXG5cXG4ubm8tc2VsZWN0aW9uIHtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XFxuICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcXG59XFxuXFxuLnBvaW50ZXIge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcbi8qKiB1cGxvYWQvZW1iZWQgKiovXFxuXFxuLnRhYi1jb250YWluZXIge1xcbiAgICBmb250LXNpemU6IDAuODZyZW07XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcXG5cXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxuXFxuICAgIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4ycyBlYXNlO1xcblxcblxcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuXFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xcbn1cXG5cXG4ubmF2LXVuZGVybGluZSAubmF2LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtbGluayB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcbi5uYXYtaXRlbS5hY3RpdmUgLm5hdi1saW5rIHtcXG4gICAgY29sb3I6ICMzNzM1MmZkOTtcXG4gICAgZm9udC13ZWlnaHQ6IDYwMDtcXG59XFxuXFxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBib3JkZXItdG9wOiBub25lO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcbi50YWItY29udGVudCAuY29udGVudC1kYXRhLmFjdGl2ZSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZ2FwOiAxcmVtO1xcbn1cXG5cXG4udGFiLWNvbnRlbnQgLnRleHQtaW5mbyB7XFxuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTtcXG59XFxuXFxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcXG4gICAgZGlzcGxheTogaW5saW5lO1xcbn1cXG5cXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG4uZW1iZWQtY29udGVudCBidXR0b24ge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbCB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBwYWRkaW5nOiA0cHg7XFxuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxufVxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qIFJlc2l6ZSBoYW5kbGVyICovXFxuLnJlc2l6ZS1oYW5kbGUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHdpZHRoOiAxMHB4O1xcbiAgICBoZWlnaHQ6IDEwcHg7XFxuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTtcXG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcXG59XFxuXFxuLnJlc2l6ZS1oYW5kbGUuc2Uge1xcbiAgICBib3R0b206IDA7XFxuICAgIHJpZ2h0OiAwO1xcbn1cXG5cXG4vKiogUmVzaXplIGhhbmRsZXIgKiovXFxuXFxuLnNwb3RpZnktZW1iZWQge1xcbiAgICBtaW4taGVpZ2h0OiAxNTJweDtcXG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1yYWRpdXM6IC43NXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uZ2lzdC1lbWJlZCB7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5zbmlwcGV0LWVtYmVkIHtcXG4gICAgcGFkZGluZy1ib3R0b206IDAgIWltcG9ydGFudDtcXG4gICAgbWluLWhlaWdodDogMTUwcHggIWltcG9ydGFudDtcXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmVtYmVkLWNvbnRhaW5lciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XFxuICAgIGhlaWdodDogMDtcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxufVxcblxcbi5lbWJlZC1jb250YWluZXIgaWZyYW1lIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcblxcbi5pZnJhbWUtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuXFxuXFxuLnZpZGVvLWNvbnRhaW5lciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XFxuICAgIGhlaWdodDogMDtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLnZpZGVvLWNvbnRhaW5lciBpZnJhbWUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMTAwJTtcXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuLngtcmVzaXphYmxlIHtcXG4gICAgcmVzaXplOiBob3Jpem9udGFsO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgY3Vyc29yOiBuZXN3LXJlc2l6ZTtcXG4gICAgbWluLXdpZHRoOiAyNTBweDtcXG59XFxuXFxuLnktcmVzaXphYmxlIHtcXG4gICAgcmVzaXplOiB2ZXJ0aWNhbDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGN1cnNvcjogbnMtcmVzaXplO1xcbiAgICBtaW4taGVpZ2h0OiAxNTBweDtcXG59XFxuXFxuLmJhY2tncm91bmQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbn1cXG5cXG5cXG4uZml0LWNvbnRlbnQge1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XFxufVxcblxcblxcbi8qKiBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xcbi5ibG9jay10b29sYmFyLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMDtcXG4gICAgaGVpZ2h0OiAwO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG5cXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XFxuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBnYXA6IDEwcHg7XFxuICAgIHBhZGRpbmc6IDVweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxuXFxuICAgIHRvcDogNXB4O1xcbiAgICByaWdodDogNXB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIHtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIGJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIGJ1dHRvbiB7XFxuICAgIGNvbG9yOiBibGFjaztcXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIgLmNvbG9yLWludGVyYWN0aXZlLWJ1dHRvbiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG59XFxuXFxuLyoqIEVuZCBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xcblxcblxcblxcbi5qdXN0aWZ5LWxlZnQge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxufVxcblxcbi5qdXN0aWZ5LWNlbnRlciB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG5cXG4uanVzdGlmeS1yaWdodCB7XFxuICAgIGp1c3RpZnktY29udGVudDogcmlnaHQ7XFxufVxcblxcblxcbi5oaWRkZW4ge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuXFxuZmlndXJlIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG5cXG4ub3ZlcmZsb3ctaGlkZGVuIHtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLyoqIElubGluZSBDb2RlICoqL1xcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgY29kZTpub3QocHJlIGNvZGUpIHtcXG4gICAgZm9udC1zaXplOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjN2E7XFxuICAgIHBhZGRpbmc6IDAgM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxufVxcblxcbi8qKiBDb250ZW50IHBsYWNlaG9sZGVyICovXFxuXFxuLmNvbnRlbnQtcGxhY2Vob2xkZXIge1xcbiAgICBwYWRkaW5nOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBnYXA6IDVweDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi5jb250ZW50LXBsYWNlaG9sZGVyIC5pY29uLXdyYXBwZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcXG59XFxuXFxuXFxuLyogZW5kIENvbnRlbnQgcGxhY2Vob2xkZXIgKi9cXG5cXG5cXG5cXG4vKiogQ29kZSAqKi9cXG5cXG5wcmUge1xcbiAgICBtYXJnaW46IDA7XFxufVxcblxcbnByZSBjb2RlIHtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uaWdub3JlLWV2ZW50cyB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmNvZGUtYmxvY2sge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5jb2RlLWJsb2NrIHNlbGVjdCB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLmNvZGUtYmxvY2sgc2VsZWN0IHtcXG4gICAgYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XFxuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDRweCA4cHg7XFxuICAgIGZvbnQ6IGluaGVyaXQ7XFxuICAgIC8qIGNvbG9yOiBpbmhlcml0OyAqL1xcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAxMHB4IGNlbnRlcjtcXG4gICAgY29sb3I6IHdoaXRlO1xcbiAgICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uY29kZS1ibG9jazpob3ZlciBzZWxlY3Qge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuLmNvZGUtYmxvY2sgY29kZSB7XFxuICAgIGZvbnQtc2l6ZTogMXJlbTtcXG5cXG59XFxuXFxuXFxuXFxuQGtleWZyYW1lcyBzaGFrZSB7XFxuXFxuICAgIDAlLFxcbiAgICAxMDAlIHtcXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXG4gICAgfVxcblxcbiAgICAyNSUsXFxuICAgIDc1JSB7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTVweCk7XFxuICAgIH1cXG5cXG4gICAgNTAlIHtcXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1cHgpO1xcbiAgICB9XFxufVxcblxcbi5zaGFrZS1hbmltYXRpb24ge1xcbiAgICBhbmltYXRpb246IHNoYWtlIDAuNnMgY3ViaWMtYmV6aWVyKC4zNiwgLjA3LCAuMTksIC45NykgYm90aDtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcXG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xcbiAgICBwZXJzcGVjdGl2ZTogMTAwMHB4O1xcbn1cXG5cXG4uYmx1ZS1idXR0b24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjM4M2UyO1xcbiAgICBjb2xvcjogd2hpdGU7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgcGFkZGluZzogM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XFxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxufVxcblxcblxcbi8qKiBzZXBhcmF0b3IgKiovXFxuXFxuLnNlcGFyYXRvci13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLnNlcGFyYXRvciB7XFxuICAgIGZsZXgtZ3JvdzogMTtcXG4gICAgcGFkZGluZzogMCAxMHB4O1xcbn1cXG5cXG4uc2VwYXJhdG9yLXdyYXBwZXIgaHIge1xcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZXBhcmF0b3Itd3JhcHBlciBocjpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlcGFyYXRvci1zZWxlY3RlZCB7XFxuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpO1xcbn1cXG5cXG4uc2VwYXJhdG9yLXNlbGVjdGVkIGhyIHtcXG4gICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcXG59XFxuXFxuLyoqIGVuZCBzZXBhcmF0b3IgKi9cXG5cXG5cXG5cXG5cXG4jbGlua0JveElucHV0e1xcblxcbn1cXG5cXG4uY29udGVudC1kYXRhIGlucHV0OmZvY3VzLFxcbiNsaW5rQm94SW5wdXQ6Zm9jdXMge1xcbiAgICBvdXRsaW5lOiAycHggc29saWQgIzRBOTBFMjtcXG4gICAgYm94LXNoYWRvdzogMCAwIDVweCByZ2JhKDc0LCAxNDQsIDIyNiwgMC41KTtcXG59XFxuXFxuXFxuLmQtbm9uZXtcXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xcbn1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107XG5cbiAgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IFwiXCI7XG4gICAgICB2YXIgbmVlZExheWVyID0gdHlwZW9mIGl0ZW1bNV0gIT09IFwidW5kZWZpbmVkXCI7XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07XG5cbiAgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcbiAgbGlzdC5pID0gZnVuY3Rpb24gaShtb2R1bGVzLCBtZWRpYSwgZGVkdXBlLCBzdXBwb3J0cywgbGF5ZXIpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIHVuZGVmaW5lZF1dO1xuICAgIH1cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIl9fd2VicGFja19yZXF1aXJlX18ubmMgPSB1bmRlZmluZWQ7IiwiZXhwb3J0IGVudW0gQ29udGVudFR5cGVzIHtcclxuICAgIFBhcmFncmFwaCA9IFwicFwiLFxyXG4gICAgSGVhZGluZ18xID0gXCJoMVwiLFxyXG4gICAgSGVhZGluZ18yID0gXCJoMlwiLFxyXG4gICAgSGVhZGluZ18zID0gXCJoM1wiLFxyXG4gICAgSGVhZGluZ180ID0gXCJoNFwiLFxyXG4gICAgSGVhZGluZ181ID0gXCJoNVwiLFxyXG4gICAgSGVhZGluZ182ID0gXCJoNlwiLFxyXG4gICAgQ2hlY2tMaXN0ID0gXCJjaGVja0xpc3RcIixcclxuICAgIEJ1bGxldGVkTGlzdCA9IFwiYnVsbGV0ZWRMaXN0XCIsXHJcbiAgICBOdW1iZXJlZExpc3QgPSBcIm51bWJlcmVkTGlzdFwiLFxyXG4gICAgTGlzdCA9IFwibGlzdFwiLFxyXG4gICAgVGFibGUgPSBcInRhYmxlXCIsXHJcbiAgICBJbWFnZSA9IFwiaW1hZ2VcIixcclxuICAgIFNjcmlwdCA9IFwic2NyaXB0XCIsXHJcbiAgICBJZnJhbWUgPSBcImlmcmFtZVwiXHJcbn0iLCJleHBvcnQgZW51bSBJY29ucyB7XHJcbiAgICBMaW5rID0gXCJpY29uLW1hdGVyaWFsLWxpbmtcIixcclxuICAgIEJvbGQgPSBcImljb24td29yZHByZXNzLWJvbGRcIixcclxuICAgIEl0YWxpYyA9IFwiaWNvbi1tYXRlcmlhbC1pdGFsaWNcIixcclxuICAgIFVuZGVybGluZSA9IFwiaWNvbi1tYXRlcmlhbC11bmRlcmxpbmVcIixcclxuICAgIElubGluZUNvZGUgPSBcImljb24tbWF0ZXJpYWwtY29kZS1pbmxpbmVcIixcclxuICAgIFN0cmlrZVRocm91Z2ggPSBcImljb24td29yZHByZXNzLXN0cmlrZS10aHJvdWdoXCIsXHJcbiAgICBQbHVzID0gXCJpY29uLXBsdXNcIixcclxuICAgIENvbHVtblJpZ2h0ID0gXCJpY29uLW1hdGVyaWFsLWNvbHVtbi1yaWdodFwiLFxyXG4gICAgQ29sdW1uTGVmdCA9IFwiaWNvbi1tYXRlcmlhbC1jb2x1bW4tbGVmdFwiLFxyXG4gICAgUm93QWJvdmUgPSBcImljb24tbWF0ZXJpYWwtcm93LWFib3ZlXCIsXHJcbiAgICBSb3dCZWxvdyA9IFwiaWNvbi1tYXRlcmlhbC1yb3ctYmVsb3dcIixcclxuICAgIGRlbGV0ZVN3ZWVwID0gXCJpY29uLW1hdGVyaWFsLWRlbGV0ZS1zd2VlcFwiLFxyXG4gICAgVHJhc2ggPSBcImljb24tbWF0ZXJpYWwtdHJhc2hcIixcclxuICAgIENsb3NlQ2lyY2xlID0gXCJpY29uLWlvbmljLWNsb3NlLWNpcmNsZVwiLFxyXG4gICAgRW1wdHkgPSBcIkVtcHR5XCIsXHJcbiAgICBDYWxsb3V0ID0gXCJpY29uLW1hdGVyaWFsLWNhbGxvdXRcIixcclxuICAgIEltYWdlID0gXCJpY29uLW1hdGVyaWFsLWltYWdlXCIsXHJcbiAgICBJbWFnZTIgPSBcImljb24tYm9vdHN0cmFwLWltYWdlXCIsXHJcbiAgICBWaWRlbyA9IFwiaWNvbi1tYXRlcmlhbC12aWRlb1wiLFxyXG4gICAgSnVzdGlmeVN0YXJ0ID0gIFwiaWNvbi1tYXRlcmlhbC1qdXN0aWZ5LXN0YXJ0XCIsXHJcbiAgICBKdXN0aWZ5Q2VudGVyID0gXCJpY29uLW1hdGVyaWFsLWp1c3RpZnktY2VudGVyXCIsXHJcbiAgICBKdXN0aWZ5RW5kID0gXCJpY29uLW1hdGVyaWFsLWp1c3RpZnktZW5kXCIsXHJcbiAgICBEdXBsaWNhdGUgPSBcImljb24tbWF0ZXJpYWwtZHVwbGljYXRlXCIsXHJcbiAgICBTcG90aWZ5ID0gXCJpY29uLWJvb3RzdHJhcC1zcG90aWZ5XCIsXHJcbiAgICBHaXRIdWIgPSBcImljb24tYm9vdHN0cmFwLWdpdGh1YlwiLFxyXG4gICAgR2l0TGFiID0gXCJpY29uLWJvb3RzdHJhcC1naXRsYWJcIixcclxuICAgIENvZGVQZW4gPSBcImljb24tY29kZXBlblwiLFxyXG4gICAgWW91VHViZSA9IFwiaWNvbi1ib290c3RyYXAteW91dHViZVwiXHJcblxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIENTUyBjbGFzcyBuYW1lcyB0aGF0IGFjdGl2YXRlIHNwZWNpZmljIGZ1bmN0aW9uYWxpdGllcyBpbiB0aGUgQmxvY2tUb29sYm94LlxyXG4gKiBFYWNoIG9wdGlvbiBjb3JyZXNwb25kcyB0byBhIGNsYXNzIHRoYXQsIHdoZW4gYXBwbGllZCwgZW5hYmxlcyBwYXJ0aWN1bGFyIGZlYXR1cmVzIFxyXG4gKiByZWxhdGVkIHRvIGNvbnRlbnQgZWRpdGluZyBhbmQgc3R5bGluZyB3aXRoaW4gYSBibG9jay5cclxuICpcclxuICogQGVudW0ge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBlbnVtIFRvb2xib3hPcHRpb25zIHtcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB0aGF0IGFjdGl2YXRlcyB0aGUgYmxvY2sgdG9vbGJhciBmb3IgY29udGVudCBpbnRlcmFjdGlvbi5cclxuICAgICAqIFRoaXMgY2xhc3MgaW5jbHVkZXMgdGhlIHRvb2xiYXIgYW5kIGVuYWJsZXMgYmFzaWMgaW50ZXJhY3Rpb24gY2FwYWJpbGl0aWVzLlxyXG4gICAgICovXHJcbiAgICBJbmNsdWRlQmxvY2tUb29sYmFyQ2xhc3MgPSBcImluY2x1ZGUtYmxvY2stdG9vbGJhclwiLCAvL2Jsb2NrLXRvb2xiYXIsIGJsb2NrLXRvb2xiYXIsIGNvbnRlbnQtaW50ZXJhY3RpdmVcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB0aGF0IGFjdGl2YXRlcyB0aGUgYWxpZ25tZW50IHRvb2xzIHdpdGhpbiB0aGUgdG9vbGJveC5cclxuICAgICAqIFRoaXMgY2xhc3MgZW5hYmxlcyBmdW5jdGlvbmFsaXRpZXMgZm9yIGFsaWduaW5nIHRoZSBjb250ZW50IHdpdGhpbiBhIGJsb2NrLlxyXG4gICAgICovXHJcbiAgICBBbGlnblRvb2xDbGFzcyA9IFwiYWxpZ24tdG9vbFwiLCAvL2ludGVyYWN0aXZlLWFsaWduXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdGhhdCBlbmFibGVzIGNvbG9yIGVkaXRpbmcgdG9vbHMgd2l0aGluIHRoZSB0b29sYm94LlxyXG4gICAgICogVGhpcyBjbGFzcyBwcm92aWRlcyBvcHRpb25zIGZvciBjaGFuZ2luZyB0aGUgY29sb3Igb2YgdGV4dCBhbmQgYmFja2dyb3VuZC5cclxuICAgICAqL1xyXG4gICAgQ29sb3JUb29sQ2xhc3MgPSBcImNvbG9yLXRvb2xcIiwgLy9pbnRlcmFjdGl2ZS1jb2xvclxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzcyBuYW1lIHRoYXQgYWN0aXZhdGVzIGFkZGl0aW9uYWwgb3B0aW9ucyB3aXRoaW4gdGhlIHRvb2xib3guXHJcbiAgICAgKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIHRvb2xib3ggd2l0aCBtb3JlIGFkdmFuY2VkIHNldHRpbmdzIGFuZCBmdW5jdGlvbmFsaXRpZXMsIGxpa2UgRGVsZXRlIGFuZCBEdXBsaWNhdGVcclxuICAgICAqL1xyXG4gICAgRXh0cmFPcHRpb25zQ2xhc3MgPSBcImV4dHJhLW9wdGlvbnNcIiwgLy9pbnRlcmFjdGl2ZS1tb3JlXHJcbiAgICBMYW5ndWFnZVNlbGVjdGlvblRvb2xDbGFzcyA9IFwibGFuZ3VhZ2Utc2VsZWN0aW9uLXRvb2xcIiAvL2ludGVyYWN0aXZlLW1vcmVcclxufSIsImV4cG9ydCBlbnVtIENvbW1vbkNsYXNzZXMge1xyXG4gICAgLyoqIFxyXG4gICAgICogQ2xhc3MgbmFtZSBmb3IgdGhlIG1haW4gY29udGVudCBlbGVtZW50cyB3aXRoaW4gYmxvY2tzLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5kaWNhdGVcclxuICAgICAqIHdoaWNoIGVsZW1lbnRzIGNvbnRhaW4gdGhlIGFjdHVhbCBjb250ZW50IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yIG9wZXJhdGlvbnMgbGlrZVxyXG4gICAgICogc3R5bGluZyBvciBpbnRlcmFjdGlvbi5cclxuICAgICAqL1xyXG4gICAgQ29udGVudEVsZW1lbnQgPSBcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiLFxyXG4gICAgIC8qKlxyXG4gICAgKiBDbGFzcyBuYW1lIGZvciBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkIGR1cmluZyBzYXZlIG9yIGV4cG9ydCBvcGVyYXRpb25zLlxyXG4gICAgKiBBcHBsaWVkIHNwZWNpZmljYWxseSB0byBlZGl0aW5nIFVJIGNvbXBvbmVudHMgd2l0aGluIHRoZSBgLmNvbnRlbnRgIGVsZW1lbnQgdG8gZW5zdXJlXHJcbiAgICAqIHRoZXkgYXJlIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIHNhdmVkIG9yIGV4cG9ydGVkIG91dHB1dC4gRWxlbWVudHMgb3V0c2lkZSB0aGUgYC5jb250ZW50YFxyXG4gICAgKiBzaG91bGQgbm90IHJlY2VpdmUgdGhpcyBjbGFzcyBhcyBpdCB3b3VsZCBsZWFkIHRvIHRoZSBsb3NzIG9mIGV2ZW50IGxpc3RlbmVycyB1cG9uIGFjdGlvbnNcclxuICAgICogbGlrZSB1bmRvIG9yIHJlZG8sIHdoaWNoIHJlbHkgb24gdGhlc2UgZWxlbWVudHMgYmVpbmcgY29uc2lzdGVudGx5IGF2YWlsYWJsZS5cclxuICAgICogRWxlbWVudHMgbWFya2VkIHdpdGggYEVkaXRvck9ubHlgIGluc2lkZSB0aGUgY29udGVudCBkbyBub3QgcmV0YWluIHBlcnNpc3RlbnQgbGlzdGVuZXJzO1xyXG4gICAgKiB0aGV5IGV4aXN0IG9ubHkgdHJhbnNpZW50bHkgZHVyaW5nIHRoZSBlZGl0IHNlc3Npb24sIHN1Y2ggYXMgdGhlIGBCbG9ja1Rvb2xib3hgLCB3aGljaFxyXG4gICAgKiBpcyByZWNyZWF0ZWQgcmF0aGVyIHRoYW4gc2F2ZWQuXHJcbiAgICAqL1xyXG4gICAgRWRpdG9yT25seSA9IFwiZWRpdG9yLW9ubHlcIixcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB1c2VkIHRvIGRlZmluZSBhIGNvbnRlbnQgYmxvY2suIEJsb2NrcyBhcmUgZnVuZGFtZW50YWwgc3RydWN0dXJhbCBlbGVtZW50c1xyXG4gICAgICogaW4gdGhlIGxheW91dCB0aGF0IG1heSBjb250YWluIHRleHQsIGltYWdlcywgb3Igb3RoZXIgdHlwZXMgb2YgY29udGVudC4gVGhpcyBjbGFzc1xyXG4gICAgICogaGVscHMgaW4gYXBwbHlpbmcgY29uc2lzdGVudCBzdHlsaW5nIGFuZCBiZWhhdmlvciB0byBjb250ZW50IGJsb2Nrcy5cclxuICAgICAqL1xyXG4gICAgQmxvY2sgPSBcImJsb2NrXCIsXHJcbiAgICAvKipcclxuICAgICogQ2xhc3MgbmFtZSB1c2VkIHRvIHRyaWdnZXIgdGhlIGRpc3BsYXkgb2YgdGhlIE1lZGlhSW5wdXR0ZXIgY29tcG9uZW50IHVwb24gYSBjbGljayBldmVudC5cclxuICAgICogV2hlbiBhbiBlbGVtZW50IHdpdGggdGhpcyBjbGFzcyBpcyBjbGlja2VkLCB0aGUgTWVkaWFJbnB1dHRlciBsaXN0ZW5zIGZvciB0aGUgZXZlbnRcclxuICAgICogYW5kIGFjdGl2YXRlcywgcHJvdmlkaW5nIGEgdXNlciBpbnRlcmZhY2UgZm9yIGVudGVyaW5nIGEgVVJMIGZvciBhbiBlbWJlZCBvciB1cGxvYWRpbmcgYSBmaWxlLlxyXG4gICAgKlxyXG4gICAgKiBUaGlzIGNsYXNzIGZhY2lsaXRhdGVzIHVzZXIgaW50ZXJhY3Rpb24gZm9yIGVtYmVkZGluZyBtZWRpYSBjb250ZW50IGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50LFxyXG4gICAgKiBzdHJlYW1saW5pbmcgdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIG11bHRpbWVkaWEgZWxlbWVudHMgbGlrZSBpbWFnZXMsIHZpZGVvcywgb3Igb3RoZXIgZW1iZWRkZWQgY29udGVudC5cclxuICAgICovXHJcbiAgICBTaG93TWVkaWFJbnB1dE9uQ2xpY2sgPSBcInNob3ctbWVkaWEtaW5wdXQtb24tY2xpY2tcIixcclxuICAgIFNob3dNZWRpYUlucHV0VXBsb2FkID0gIFwic2hvdy1tZWRpYS1pbnB1dC11cGxvYWRcIixcclxuICAgIFNob3dNZWRpYUlucHV0RW1iZWQgPSAgXCJzaG93LW1lZGlhLWlucHV0LWVtYmVkXCIsXHJcbn0iLCJleHBvcnQgZW51bSBDdXN0b21VSUV2ZW50cyB7XHJcbiAgICBcclxuICAgIENvbG9yQ2hhbmdlUmVxdWVzdCA9IFwiQ29sb3JDaGFuZ2VSZXF1ZXN0XCIsXHJcbiAgICBTaG93SGlkZUFjdGl2ZUJ1dHRvbiA9IFwiU2hvd0hpZGVBY3RpdmVCdXR0b25cIixcclxuICAgIFJlc2V0QWN0aXZlQnV0dG9ucyA9IFwiUmVzZXRBY3RpdmVCdXR0b25zXCIsXHJcbiAgICBDbG9zZUVsZW1lbnQgPSBcIkhpZGVDb21wb25lbnRcIixcclxuICAgIFNob3dFbGVtZW50ID0gXCJTaG93RWxlbWVudFwiLFxyXG4gICAgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgPSBcIkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlXCJcclxuICAgIFxyXG59IiwiLyoqXHJcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgZXZlbnRzIGZvciBtb3VzZSwga2V5Ym9hcmQsIGFuZCBmb2N1cyBhY3Rpb25zLlxyXG4gKiBUaGlzIGVudW1lcmF0aW9uIHByb3ZpZGVzIHN0YW5kYXJkaXplZCBzdHJpbmdzIGZvciBhdHRhY2hpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIERPTSBlbGVtZW50cy5cclxuICogVXNlIHRoZXNlIGVudW0gdmFsdWVzIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBhbmQgYXZvaWQgdHlwb3MgaW4gZXZlbnQgbmFtZXMgdGhyb3VnaG91dCB5b3VyIGFwcGxpY2F0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGVudW0gRGVmYXVsdEpTRXZlbnRzIHtcclxuICAgIExvYWQgPSAgXCJsb2FkXCIsXHJcbiAgICBNb3VzZWVudGVyID0gXCJtb3VzZWVudGVyXCIsXHJcbiAgICBNb3VzZWxlYXZlID0gXCJtb3VzZWxlYXZlXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgZG93bi4gKi9cclxuICAgIE1vdXNlZG93biA9IFwibW91c2Vkb3duXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQgb3ZlciBhbiBlbGVtZW50LiAqL1xyXG4gICAgTW91c2Vtb3ZlID0gXCJtb3VzZW1vdmVcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuICovXHJcbiAgICBNb3VzZXVwID0gXCJtb3VzZXVwXCIsXHJcbiAgICBNb3VzZW92ZXIgPSBcIm1vdXNlb3ZlclwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gYSBrZXkgaXMgcmVsZWFzZWQgb24gdGhlIGtleWJvYXJkLiAqL1xyXG4gICAgS2V5dXAgPSBcImtleXVwXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBhIGtleSBpcyBwcmVzc2VkIGRvd24gb24gdGhlIGtleWJvYXJkLiAqL1xyXG4gICAgS2V5ZG93biA9IFwia2V5ZG93blwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gYW4gZWxlbWVudCBsb3NlcyBmb2N1cy4gKi9cclxuICAgIEJsdXIgPSBcImJsdXJcIixcclxuICAgIFNlbGVjdFN0YXJ0ID0gXCJzZWxlY3RzdGFydFwiLFxyXG4gICAgU2VsZWN0aW9uQ2hhbmdlID0gXCJzZWxlY3Rpb25jaGFuZ2VcIixcclxuICAgIENsaWNrID0gXCJjbGlja1wiLFxyXG4gICAgRm9jdXNpbiA9IFwiZm9jdXNpblwiLFxyXG4gICAgRm9jdXNvdXQgPSBcImZvY3Vzb3V0XCIsXHJcbiAgICBET01Db250ZW50TG9hZGVkID0gXCJET01Db250ZW50TG9hZGVkXCIsXHJcbiAgICBJbnB1dCA9IFwiaW5wdXRcIixcclxuICAgIEJibENsaWNrID0gXCJkYmxjbGlja1wiXHJcbn0iLCJleHBvcnQgZW51bSBDdXN0b21FdmVudHMge1xyXG4gICAgLy9Db21wb25lbnQgZXZlbnRzXHJcbiAgICBmbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWQgPSBcImZsb2F0aW5nVG9vbGJhckRpc3BsYXllZFwiLFxyXG5cclxuICAgIC8vVGV4dCBjbGljayBlZGl0IGV2ZW50c1xyXG4gICAgYW5jaG9yQnV0dG9uQ2xpY2tlZCA9IFwiYW5jaG9yQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgYm9sZEJ1dHRvbkNsaWNrZWQgPSBcImJvbGRCdXR0b25DbGlja2VkXCIsXHJcbiAgICBpdGFsaWNCdXR0b25DbGlja2VkID0gXCJpdGFsaWNCdXR0b25DbGlja2VkXCIsXHJcbiAgICB1bmRlcmxpbmVCdXR0b25DbGlja2VkID0gXCJ1bmRlcmxpbmVCdXR0b25DbGlja2VkXCIsXHJcbiAgICBpbmxpbmVDb2RlQnV0dG9uQ2xpY2tlZCA9IFwiaW5saW5lQ29kZUJ1dHRvbkNsaWNrZWRcIixcclxuICAgIHN0cmlrZVRocm91Z2hCdXR0b25DbGlja2VkID0gXCJzdHJpa2VUaHJvdWdoQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaGlsaXRlQ29sb3JCdXR0b25DbGlja2VkID0gXCJoaWxpdGVDb2xvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGZvcmVDb2xvckJ1dHRvbkNsaWNrZWQgPSBcImZvcmVDb2xvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIFxyXG4gICAgYnV0dG9uR3JvdXBJdGVtQ2xpY2tlZCA9IFwiYnV0dG9uR3JvdXBJdGVtQ2xpY2tlZFwiLFxyXG4gICAgZm9jdXNPbkZpcnN0UmVxdWVzdGVkID0gXCJmb2N1c09uRmlyc3RSZXF1ZXN0ZWRcIixcclxuICAgIHByZXNzZWRFbnRlck9uVGl0bGUgPSBcInByZXNzZWRFbnRlck9uVGl0bGVcIixcclxuICAgIFxyXG4gICAgdHJhbnNmb3JtQmxvY2tSZXF1ZXN0ZWQgPSBcInRyYW5zZm9ybUJsb2NrUmVxdWVzdGVkXCIsXHJcbiAgICBkdXBsaWNhdGVCbG9ja1JlcXVlc3RlZCA9IFwiZHVwbGljYXRlQmxvY2tSZXF1ZXN0ZWRcIixcclxuXHJcbiAgICAvL1RleHQgZWRpdCBldmVudHNcclxuICAgIGFuY2hvciA9IFwiYW5jaG9yXCIsXHJcbiAgICBib2xkID0gXCJib2xkXCIsXHJcbiAgICBpdGFsaWMgPSBcIml0YWxpY1wiLFxyXG4gICAgdW5kZXJsaW5lID0gXCJ1bmRlcmxpbmVcIixcclxuICAgIGlubGluZUNvZGUgPSBcImlubGluZUNvZGVcIixcclxuICAgIHN0cmlrZVRocm91Z2ggPSBcInN0cmlrZVRocm91Z2hcIixcclxuICAgIGhpbGl0ZUNvbG9yID0gXCJoaWxpdGVDb2xvclwiLFxyXG4gICAgZm9yZUNvbG9yID0gXCJmb3JlQ29sb3JcIixcclxuXHJcblxyXG4gICAgdGV4dEZvcm1hdENoYW5nZWQgPSBcInRleHRGb3JtYXRDaGFuZ2VkXCIsXHJcbiAgICBlbWl0dGVkQ29tbWFuZCA9IFwiZW1pdHRlZENvbW1hbmRcIixcclxuICAgIGJsb2NrVHlwZUNoYW5nZWQgPSBcImJsb2NrVHlwZUNoYW5nZWRcIixcclxuICAgIGJsb2NrRGVsZXRlZCA9IFwiYmxvY2tEZWxldGVkXCIsXHJcbiAgICBibG9ja0Nsb25lZCA9IFwiYmxvY2tDbG9uZWRcIixcclxuICAgIHRhYmxlQ2VsbENoYW5nZWQgPSBcInRhYmxlQ2VsbENoYW5nZWRcIixcclxuXHJcblxyXG5cclxuICAgIC8vQmxvY2sgY29tbWFuZHNcclxuICAgIFxyXG59IiwiZXhwb3J0IGVudW0gWkluZGV4IHtcclxuICAgIExvd0ltcG9ydGFuY2UgPSBcIjEwMFwiLCBcclxuICAgIFNsaWdodGx5SW1wb3J0YW50ID0gXCIyMDBcIixcclxuICAgIE5ldXRyYWwgPSBcIjMwMFwiLFxyXG4gICAgTW9kZXJhdGVseUltcG9ydGFudCA9IFwiNDAwXCIsXHJcbiAgICBWZXJ5SW1wb3J0YW50ID0gXCI1MDBcIiwgXHJcbiAgICBFeHRyZW1lbHlJbXBvcnRhbnQgPSBcIjYwMFwiXHJcbn0iLCJleHBvcnQgZW51bSBDb2xvcnMge1xyXG5cclxuICAgIEhpbGl0ZUNvbG9yUmVkID0gXCIjRkRERURFXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBIaWxpdGVDb2xvckJsdWUgPSBcIiNEOUVERjZcIixcclxuICAgIEhpbGl0ZUNvbG9yWWVsbG93ID0gXCIjRkFGNEQxXCIsXHJcbiAgICBIaWxpdGVDb2xvckdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEhpbGl0ZUNvbG9yTm9uZSA9IFwidHJhbnNwYXJlbnRcIixcclxuXHJcblxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbFJlZCA9IFwiI0ZEREVERVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbEdyZWVuID0gXCIjRDdGN0RDXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JDZWxsQmx1ZSA9IFwiI0Q5RURGNlwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbFllbGxvdyA9IFwiI0ZBRjREMVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQ2VsbEdyZXkgPSBcIiNFMUUwRTBcIixcclxuICAgIEJhY2tncm91bmRDb2xvckNlbGxOb25lID0gXCJ0cmFuc3BhcmVudFwiLFxyXG5cclxuICAgIEZvcmVDb2xvclJlZCA9IFwiI0Q0NEM0N1wiLFxyXG4gICAgRm9yZUNvbG9yR3JlZW4gPSBcIiM0NDgzNjFcIixcclxuICAgIEZvcmVDb2xvckJsdWUgPSBcIiMzMzdFQTlcIixcclxuICAgIEZvcmVDb2xvclllbGxvdyA9IFwiI0NCOTEyRlwiLFxyXG4gICAgRm9yZUNvbG9yR3JleSA9IFwiIzc4Nzc3NFwiLFxyXG4gICAgRm9yZUNvbG9ySW5pdGlhbCA9IFwiaW5pdGlhbFwiLFxyXG5cclxuICAgIEJhY2tncm91bmRDb2xvclJlZCA9IFwiI0ZEREVERVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yR3JlZW4gPSBcIiNEN0Y3RENcIixcclxuICAgIEJhY2tncm91bmRDb2xvckJsdWUgPSBcIiNEOUVERjZcIixcclxuICAgIEJhY2tncm91bmRDb2xvclllbGxvdyA9IFwiI0ZBRjREMVwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yR3JleSA9IFwiI0UxRTBFMFwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yTm9uZSA9IFwidHJhbnNwYXJlbnRcIixcclxuXHJcbiAgICBJY29uQWN0aXZlQmx1ZSA9IFwiIzIzODJlMlwiLFxyXG4gICAgSWNvbkRlZmF1bHRCbGFjayA9IFwiIzM3MzUyZmQ5XCIsXHJcbiAgICBSZWQgPSBcInJlZFwiLFxyXG4gICAgVG9tYXRvID0gXCIjRUI1NzU3XCIsXHJcbiAgICBPcmlnaW5hbFRhYmxlQ29sb3IgPSBcIiM4NDg4OGRcIlxyXG5cclxufVxyXG5cclxuZXhwb3J0IGVudW0gQ29sb3JzTmFtZXMge1xyXG4gICAgQ2FsbG91dEJhY2tncm91bmRSZWQgPSBcImNhbGxvdXQtYmFja2dyb3VuZC1yZWRcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JlZW4gPSBcImNhbGxvdXQtYmFja2dyb3VuZC1ncmVlblwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRCbHVlID0gXCJjYWxsb3V0LWJhY2tncm91bmQtYmx1ZVwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRZZWxsb3cgPSBcImNhbGxvdXQtYmFja2dyb3VuZC15ZWxsb3dcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JleSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kTm9uZSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLW5vbmVcIixcclxufSIsImV4cG9ydCBlbnVtIENvbW1hbmRzIHtcclxuICAgIC8qKiBUZXh0IG9wZXJhdGlvbnMgY29tbWFuZHMgKi9cclxuICAgIHRvZ2dsZUJvbGQgPSBcImJvbGRcIixcclxuICAgIHRvZ2dsZUl0YWxpYyA9IFwiaXRhbGljXCIsXHJcbiAgICB0b2dnbGVIaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IgPSBcImNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3JcIixcclxuICAgIHRvZ2dsZUZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcbiAgICB0b2dnbGVJbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICB0b2dnbGVMaW5rID0gXCJjcmVhdGVMaW5rXCIsXHJcbiAgICBsaW5rUmVhZHlUb0luc2VydCA9IFwibGlua1JlYWR5VG9JbnNlcnRcIixcclxuICAgIHRvZ2dsZVVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICB0b2dnbGVTdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICByZW1vdmVGb3JtYXQgPSBcInJlbW92ZUZvcm1hdFwiLFxyXG4gICAgY29weVNlbGVjdGVkID0gXCJjb3B5U2VsZWN0ZWRcIixcclxuICAgIGN1dFNlbGVjdGVkID0gXCJjdXRTZWxlY3RlZFwiLFxyXG4gICAgcGFzdCA9IFwicGFzdFwiLFxyXG5cclxuICAgIC8qKiBCbG9jayBvcGVyYXRpb25zIGNvbW1hbmRzICovXHJcbiAgICB0cmFuc2Zvcm1CbG9jayA9IFwidHJhbnNmb3JtQmxvY2tcIixcclxuICAgIGR1cGxpY2F0ZUJsb2NrID0gXCJkdXBsaWNhdGVCbG9ja1wiLFxyXG4gICAgZGVsZXRlQmxvY2sgPSBcImRlbGV0ZUJsb2NrXCIsXHJcbiAgICBjcmVhdGVEZWZhdWx0QmxvY2sgPSBcImNyZWF0ZURlZmF1bHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbk5leHRCbG9jayA9IFwiZm9jdXNPbk5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPblByZXZpb3VzQmxvY2sgPSBcImZvY3VzT25QcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhQcmV2aW91c0Jsb2NrID0gXCJtZXJnZVdpdGhQcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhOZXh0QmxvY2sgPSBcIm1lcmdlV2l0aE5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbkZpcnN0QmxvY2sgPSBcImZvY3VzT25GaXJzdEJsb2NrXCIsXHJcbiAgICBkZWxldGVCbG9ja0FuZEZvY3VzT25QcmV2aW91cyA9IFwiZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXNcIixcclxuICAgIGRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQgPSBcImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHRcIixcclxuXHJcbiAgICBKdXN0aWZ5TGVmdCA9IFwianVzdGlmeUxlZnRcIixcclxuICAgIEp1c3RpZnlDZW50ZXIgPSBcImp1c3RpZnlDZW50ZXJcIixcclxuICAgIEp1c3RpZnlSaWdodCA9IFwianVzdGlmeVJpZ2h0XCIsXHJcblxyXG4gICAgXHJcbiAgICAvKiogd2lsZGNhcmQgY29tbWFuZCBjb250ZXh0IGJhc2VkKi9cclxuICAgIGluc2VydE5ldyA9IFwiaW5zZXJ0TmV3XCIsXHJcblxyXG4gICAgLyoqIHRhYmxlIGNvbW1hbmRzICovXHJcbiAgICBpbnNlcnRUYWJsZVJvd0Fib3ZlID0gXCJpbnNlcnRUYWJsZVJvd0Fib3ZlXCIsXHJcbiAgICBpbnNlcnRUYWJsZVJvd0JlbG93ID0gXCJpbnNlcnRUYWJsZVJvd0JlbG93XCIsXHJcbiAgICBpbnNlcnRUYWJsZUNvbHVtbkxlZnQgPSBcImluc2VydFRhYmxlQ29sdW1uTGVmdFwiLFxyXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5SaWdodCA9IFwiaW5zZXJ0VGFibGVDb2x1bW5SaWdodFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlUm93RWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlUm93RWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgdG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yID0gXCJ0b2dnbGVDZWxsSGlsaXRlQ29sb3JcIixcclxuICAgIHJlbW92ZUNvbHVtbiA9IFwicmVtb3ZlQ29sdW1uXCIsXHJcbiAgICByZW1vdmVSb3cgPSBcInJlbW92ZVJvd1wiLFxyXG4gICAgY2hhbmdlVGFibGVCb3JkZXJDb2xvciA9IFwiY2hhbmdlVGFibGVCb3JkZXJDb2xvclwiLFxyXG5cclxuXHJcblxyXG4gICAgY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UgPSBcImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlXCJcclxufSIsImV4cG9ydCBlbnVtIEJ1dHRvbklEcyB7XHJcbiAgICBMaW5rID0gXCJsaW5rQnV0dG9uXCIsXHJcbiAgICBCb2xkID0gXCJib2xkQnV0dG9uXCIsXHJcbiAgICBJdGFsaWMgPSBcIml0YWxpY0J1dHRvblwiLFxyXG4gICAgVW5kZXJsaW5lID0gXCJ1bmRlcmxpbmVCdXR0b25cIixcclxuICAgIElubGluZUNvZGUgPSBcImlubGluZUNvZGVCdXR0b25cIixcclxuICAgIFN0cmlrZXRocm91Z2ggPSBcInN0cmlrZXRocm91Z2hCdXR0b25cIixcclxuXHJcbiAgICBBbGlnbkxlZnQgPSBcImFsaWduTGVmdFwiLFxyXG4gICAgQWxpZ25DZW50ZXIgPSBcImFsaWduQ2VudGVyXCIsXHJcbiAgICBBbGlnblJpZ2h0ID0gXCJhbGlnblJpZ2h0XCJcclxufSIsImV4cG9ydCBlbnVtIEtleWJvYXJkS2V5cyB7XHJcbiAgICBTaGlmdCA9IFwiU2hpZnRcIixcclxuICAgIEVudGVyID0gXCJFbnRlclwiLFxyXG4gICAgRXNjYXBlID0gXCJFc2NhcGVcIixcclxuICAgIEJhY2tzcGFjZSA9IFwiQmFja3NwYWNlXCIsXHJcbiAgICBDb250cm9sID0gXCJDb250cm9sXCIsXHJcbiAgICBTcGFjZSA9IFwiIFwiLFxyXG4gICAgRGVsZXRlID0gXCJEZWxldGVcIlxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25JdGVtSURzIHtcclxuICAgIEJhY2tncm91bmRPcHRpb25SZWQgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmVlbiA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiLFxyXG4gICAgQmFja2dyb3VuZE9wdGlvbkJsdWUgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25ZZWxsb3cgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmV5ID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uTm9uZSA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiXHJcbn0iLCJleHBvcnQgZW51bSBET01FbGVtZW50cyB7XHJcbiAgICBURCA9IFwidGRcIixcclxuICAgIFRBQkxFID0gXCJ0YWJsZVwiXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bkxpc3RJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uU2VsZWN0ID0gXCJjb2xvclRleHRPcHRpb25TZWxlY3RcIixcclxuXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bk1lbnVJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uc01lbnUgPSBcImNvbG9yVGV4dE9wdGlvbnNNZW51XCJcclxufSIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21haW4uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgICBzdGF0aWMgZ2VuZXJhdGVVbmlxdWVJZCgpIHtcbiAgICAgICAgY29uc3QgdGltZVBhcnQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgY29uc3QgcmFuZG9tQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoMSk7XG4gICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbUFycmF5KTtcbiAgICAgICAgY29uc3QgcmFuZG9tUGFydCA9IHJhbmRvbUFycmF5WzBdLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgcmV0dXJuIHRpbWVQYXJ0ICsgcmFuZG9tUGFydDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmdiVG9IZXgocmdiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZ2JBcnJheSA9IHJnYi5tYXRjaCgvXFxkKy9nKSEubWFwKE51bWJlcik7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHJnYkFycmF5Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IHgudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNWYWxpZFVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKGh0dHBzPzpcXFxcL1xcXFwvKScgK1xuICAgICAgICAgICAgJyg/IS0pW2EtekEtWlxcXFxkLV17MSw2M30oPzwhLSlcXFxcLicgK1xuICAgICAgICAgICAgJyhbYS16QS1aXFxcXGQtXStcXFxcLikqW2EtekEtWl17Mix9JyArXG4gICAgICAgICAgICAnKFxcXFw6XFxcXGR7MSw1fSk/JyArXG4gICAgICAgICAgICAnKFxcXFwvWy1hLXpBLVpcXFxcZCVfLn4rXSopKicgK1xuICAgICAgICAgICAgJyhcXFxcP1stYS16QS1aXFxcXGQlXy5+Kz0mXSopPycgK1xuICAgICAgICAgICAgJygjWy1hLXpBLVpcXFxcZF9dKik/JCcsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICBcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnLi4vJykgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJyUyZSUyZScpIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCclMDAnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodXJsKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgQ29udGVudFR5cGVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbnRlbnRUeXBlc1wiO1xuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuL0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xuaW1wb3J0IHsgVG9vbGJveE9wdGlvbnMgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0b3Ige1xuICAgIChjb250ZW50OiBzdHJpbmcgfCBudWxsKTogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgY3JlYXRvcnM6IHsgW3R5cGU6IHN0cmluZ106IEVsZW1lbnRDcmVhdG9yIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5U2VydmljZTtcblxuICAgIHN0YXRpYyBFTEVNRU5UX1RZUEVTID0ge1xuICAgICAgICBCTE9DS19QQVJBR1JBUEg6IFwiYmxvY2stcFwiLFxuICAgICAgICBQQVJBR1JBUEg6IFwicFwiLFxuICAgICAgICBDSEVDS0JPWF9JVEVNOiBcImNoZWNrYm94SXRlbVwiLFxuICAgICAgICBMSVNUX0lURU06IFwibGlzdEl0ZW1cIixcbiAgICAgICAgQ09ERTogXCJjb2RlXCIsXG4gICAgICAgIFFVT1RFOiBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgQlVMTEVURURfTElTVDogXCJ1bFwiLFxuICAgICAgICBOVU1CRVJFRF9MSVNUOiBcIm9sXCIsXG4gICAgICAgIENIRUNLX0xJU1Q6IFwiY2hlY2tMaXN0c1wiLFxuICAgICAgICBIRUFERVJfMTogXCJoMVwiLFxuICAgICAgICBIRUFERVJfMjogXCJoMlwiLFxuICAgICAgICBIRUFERVJfMzogXCJoM1wiLFxuICAgICAgICBIRUFERVJfNDogXCJoNFwiLFxuICAgICAgICBIRUFERVJfNTogXCJoNVwiLFxuICAgICAgICBIRUFERVJfNjogXCJoNlwiLFxuICAgICAgICBEUkFHX0hBTkRMRV9CVVRUT046IFwiZHJhZy1oYW5kbGUtYnV0dG9uXCIsXG4gICAgICAgIFRBQkxFOiBcInRhYmxlXCIsXG4gICAgICAgIElNQUdFOiBcImltYWdlXCIsXG4gICAgICAgIFZJREVPOiBcInZpZGVvXCIsXG4gICAgICAgIFNQT1RJRlk6IFwic3BvdGlmeVwiLFxuICAgICAgICBHSVRIVUJfR0lTVDogXCJnaXRodWItZ2lzdFwiLFxuICAgICAgICBHSVRMQUJfU05JUFBFVDogXCJnaXRsYWItc25pcHBldFwiLFxuICAgICAgICBDT0RFUEVOOiBcImNvZGVwZW5cIixcbiAgICAgICAgQ0FMTE9VVDogXCJjYWxsb3V0XCIsXG4gICAgICAgIFNFUEFSQVRPUjogXCJzZXBhcmF0b3JcIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5UQUJMRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnRhYmxlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSW1hZ2UsIEljb25zLkltYWdlMiwgXCJVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2VcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRVcGxvYWQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJpbWFnZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU8sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuWW91VHViZSwgXCJFbWJlZCBhIFlvdVR1YmUgdmlkZW9cIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJ5b3V0dWJlLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIl0pKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TUE9USUZZLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGxhY2Vob2xkZXJDcmVhdG9yKENvbnRlbnRUeXBlcy5JZnJhbWUsIEljb25zLlNwb3RpZnksIFwiRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrXCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWQsIFwic3BvdGlmeS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUSFVCX0dJU1QsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuR2l0SHViLCBcIkVtYmVkIGEgR2l0SHViIEdpc3RcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJnaXRodWItZ2lzdC1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIC8vdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRMQUJfU05JUFBFVCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuU2NyaXB0LCBJY29ucy5HaXRMYWIsIFwiRW1iZWQgYSBzbmlwcGV0XCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWRdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERVBFTiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSWZyYW1lLCBJY29ucy5Db2RlUGVuLCBcIkVtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtb1wiLCBbQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dEVtYmVkLCBcImNvZGVwZW4tZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiXSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jYWxsb3V0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5zZXBhcmF0b3JDcmVhdG9yKCkpO1xuXG5cbiAgICAgICAgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLl9pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEVsZW1lbnRGYWN0b3J5U2VydmljZSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgRWxlbWVudEZhY3RvcnlTZXJ2aWNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIGNyZWF0b3I6IEVsZW1lbnRDcmVhdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3JlYXRvcnNbdHlwZV0gPSBjcmVhdG9yO1xuICAgIH1cblxuICAgIGNyZWF0ZSh0eXBlOiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JzW3R5cGVdO1xuXG4gICAgICAgIGlmICghY3JlYXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gY3JlYXRvciByZWdpc3RlcmVkIGZvciB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3JlYXRvcihjb250ZW50IHx8IFwiXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJsb2NrUGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGgoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGFyYWdyYXBoKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmdDcmVhdG9yKGxldmVsOiBudW1iZXIpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuaGVhZGluZyhsZXZlbCwgY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tib3hJdGVtQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tib3hJdGVtKGNvbnRlbnQgfHwgXCJcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbGlzdEl0ZW1DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcblxuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhZ0hhbmRsZUJ1dHRvbkNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmRyYWdIYW5kbGVCdXR0b24oKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb2RlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJpZ25vcmUtZXZlbnRzXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgY29kZUJsb2NrLmNsYXNzTGlzdC5hZGQoXCJjb2RlLWJsb2NrXCIsIFwiaWdub3JlLXF1aWNrLW1lbnVcIiwgXCJpZ25vcmUtdGV4dC1mbG9hdGluZy10b29sYmFyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgIHByZS5jbGFzc0xpc3QuYWRkKFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MsIFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcblxuICAgICAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgICAgICAgIGNvZGUuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICBjb2RlLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCIvKiBDb2RlIHNuaXBwZXQgKi9cIik7XG4gICAgICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgY29kZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb2RlJywgXCJmb2N1c2FibGVcIiwgXCJobGpzXCIsIFwibGFuZ3VhZ2UtcGxhaW50ZXh0XCIsIFwiZWRpdGFibGVcIik7XG4gICAgICAgICAgICBjb2RlLnNldEF0dHJpYnV0ZShcInNwZWxsQ2hlY2tcIiwgXCJmYWxzZVwiKTtcblxuICAgICAgICAgICAgcHJlLmFwcGVuZENoaWxkKGNvZGUpO1xuXG4gICAgICAgICAgICBjb2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb2RlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaGlnaGxpZ2h0ZWRcIik7XG4gICAgICAgICAgICAgICAgaGxqcy5oaWdobGlnaHRFbGVtZW50KGNvZGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGNvZGVCbG9jay5hcHBlbmRDaGlsZChsYW5ndWFnZVNlbGVjdG9yKTtcbiAgICAgICAgICAgIGNvZGVCbG9jay5hcHBlbmRDaGlsZChwcmUpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvZGVCbG9jayk7XG5cbiAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBxdW90ZUNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYmxvY2txdW90ZVwiKTtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgYmxvY2txdW90ZS50ZXh0Q29udGVudCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICBibG9ja3F1b3RlLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmdldFJhbmRvbVF1b3RlKCkpO1xuXG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChibG9ja3F1b3RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRFbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSYW5kb21RdW90ZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBxdW90YXRpb25zID0gW1xuICAgICAgICAgICAgXCJUYWxrIGlzIGNoZWFwLiBTaG93IG1lIHRoZSBjb2RlLiAtIExpbnVzIFRvcnZhbGRzXCIsXG4gICAgICAgICAgICBcIlByZW1hdHVyZSBvcHRpbWl6YXRpb24gaXMgdGhlIHJvb3Qgb2YgYWxsIGV2aWwuIC0gRG9uYWxkIEtudXRoXCIsXG4gICAgICAgICAgICBcIlRoZSBtb3N0IGRhbmdlcm91cyBwaHJhc2UgaW4gdGhlIGxhbmd1YWdlIGlzLCAnV2UndmUgYWx3YXlzIGRvbmUgaXQgdGhpcyB3YXkuJyAtIEdyYWNlIEhvcHBlclwiLFxuICAgICAgICAgICAgXCJTaW1wbGljaXR5IGlzIHByZXJlcXVpc2l0ZSBmb3IgcmVsaWFiaWxpdHkuIC0gRWRzZ2VyIFcuIERpamtzdHJhXCIsXG4gICAgICAgICAgICBcIkFueSBmb29sIGNhbiB3cml0ZSBjb2RlIHRoYXQgYSBjb21wdXRlciBjYW4gdW5kZXJzdGFuZC4gR29vZCBwcm9ncmFtbWVycyB3cml0ZSBjb2RlIHRoYXQgaHVtYW5zIGNhbiB1bmRlcnN0YW5kLiAtIE1hcnRpbiBGb3dsZXJcIixcbiAgICAgICAgICAgIFwiRmlyc3QsIHNvbHZlIHRoZSBwcm9ibGVtLiBUaGVuLCB3cml0ZSB0aGUgY29kZS4gLSBKb2huIEpvaG5zb25cIixcbiAgICAgICAgICAgIFwiSW4gcHJvZ3JhbW1pbmcsIHRoZSBoYXJkIHBhcnQgaXNuJ3Qgc29sdmluZyBwcm9ibGVtcywgYnV0IGRlY2lkaW5nIHdoYXQgcHJvYmxlbXMgdG8gc29sdmUuIC0gUGF1bCBHcmFoYW1cIixcbiAgICAgICAgICAgIFwiQ29kZSBpcyBsaWtlIGh1bW9yLiBXaGVuIHlvdSBoYXZlIHRvIGV4cGxhaW4gaXQsIGl0J3MgYmFkLiAtIENvcnkgSG91c2VcIixcbiAgICAgICAgICAgIFwiTWFrZSBpdCB3b3JrLCBtYWtlIGl0IHJpZ2h0LCBtYWtlIGl0IGZhc3QuIC0gS2VudCBCZWNrXCIsXG4gICAgICAgICAgICBcIkJlZm9yZSBzb2Z0d2FyZSBjYW4gYmUgcmV1c2FibGUgaXQgZmlyc3QgaGFzIHRvIGJlIHVzYWJsZS4gLSBSYWxwaCBKb2huc29uXCJcbiAgICAgICAgXTtcbiAgICBcbiAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBxdW90YXRpb25zLmxlbmd0aCk7ICAgIFxuICAgICAgICByZXR1cm4gcXVvdGF0aW9uc1tpbmRleF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgXCJsaXN0XCIsIFwiY2hlY2tib3gtbGlzdFwiKTtcbiAgICAgICAgICAgIHVsLnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5DaGVja0xpc3QpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5jaGVja2JveEl0ZW0oY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgdWwuYXBwZW5kQ2hpbGQoaW5pdGlhbEl0ZW0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdWw7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnVsbGV0ZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuQnVsbGV0ZWRMaXN0KTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG51bWJlcmVkTGlzdENyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb2wnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzd2l0dGFibGUnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuXG4gICAgICAgICAgICBjb25zdCBpbml0aWFsSXRlbSA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5saXN0SXRlbV8yKGNvbnRlbnQgfHwgXCJcIik7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaW5pdGlhbEl0ZW0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgc3RhdGljIHRhYmxlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcblxuICAgICAgICAgICAgY29uc3QgdGFibGVTaGVsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0YWJsZVNoZWxsLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS1zaGVsbFwiLCBcImlnbm9yZS1xdWljay1tZW51XCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS1jb250cm9sbGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGFibGVXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJ0YWJsZS13cmFwcGVyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7XG4gICAgICAgICAgICB0YWJsZS5jbGFzc0xpc3QuYWRkKFwiam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIsIFwic3dpdHRhYmxlXCIsIFwidGFibGVcIiwgVG9vbGJveE9wdGlvbnMuSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuICAgICAgICAgICAgdGFibGUuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLlRhYmxlKTtcblxuICAgICAgICAgICAgdGFibGVTaGVsbC5hcHBlbmRDaGlsZCh0YWJsZUNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmFwcGVuZENoaWxkKHRhYmxlV3JhcHBlcik7XG4gICAgICAgICAgICB0YWJsZVdyYXBwZXIuYXBwZW5kQ2hpbGQodGFibGUpO1xuXG4gICAgICAgICAgICBjb25zdCB0Ym9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICB0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSBjb250ZW50ID8gY29udGVudC5zcGxpdCgnLCcpIDogW107XG4gICAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpO1xuICAgICAgICAgICAgcm93RGF0YS5mb3JFYWNoKGNlbGxDb250ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTtcbiAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJmb2N1c2FibGVcIiwgXCJlZGl0YWJsZVwiKTtcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBjZWxsQ29udGVudDtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgICAgICAgY29uc3QgYWRkUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFkZFJvdy5jbGFzc0xpc3QuYWRkKFwiYWRkLXRhYmxlLXJvd1wiKTtcbiAgICAgICAgICAgIGFkZFJvdy5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjFyZW1cIiBoZWlnaHQ9XCIxcmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLXBsdXNcIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmNsYXNzTGlzdC5hZGQoXCJhZGQtdGFibGUtY29sdW1uXCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMXJlbVwiIGhlaWdodD1cIjFyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tcGx1c1wiPjwvdXNlPjwvc3ZnPmA7XG5cbiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5hcHBlbmRDaGlsZChhZGRSb3cpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmFwcGVuZENoaWxkKGFkZENvbHVtbik7XG5cbiAgICAgICAgICAgIHJldHVybiB0YWJsZVNoZWxsO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBsYWNlaG9sZGVyQ3JlYXRvcihjb250ZW50VHlwZTogQ29udGVudFR5cGVzLCBpY29uOiBJY29ucywgdGV4dDogc3RyaW5nLCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKENvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnQsIFwic3dpdHRhYmxlXCIsIFwibm8tc2VsZWN0aW9uXCIsIFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgY29udGVudFR5cGUpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZChcImNvbnRlbnQtcGxhY2Vob2xkZXJcIiwgQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2ssIC4uLmNsYXNzZXMpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlckljb24gPSB0aGlzLmNyZWF0ZUljb24oaWNvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0LmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XG4gICAgICAgICAgICBwbGFjZWhvbGRlclRleHQuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJJY29uKTtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyVGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50RWxlbWVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjYWxsb3V0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGpvaGFubmVzQ2FsbG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgam9oYW5uZXNDYWxsb3V0LmNsYXNzTGlzdC5hZGQoXCJpZ25vcmUtcXVpY2stbWVudVwiLCBcImNhbGxvdXRcIiwgXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgVG9vbGJveE9wdGlvbnMuSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzLCBUb29sYm94T3B0aW9ucy5Db2xvclRvb2xDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuXG4gICAgICAgICAgICBjb25zdCBjYWxsb3V0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjYWxsb3V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIiwgXCJjYWxsb3V0LXdyYXBwZXJcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlR5cGUgc29tZXRoaW5nLi4uXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC10ZXh0XCIsIFwiZWRpdGFibGVcIiwgXCJmb2N1c2FibGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxvdXRXcmFwcGVyLmFwcGVuZENoaWxkKHRleHRBcmVhKTtcbiAgICAgICAgICAgIGpvaGFubmVzQ2FsbG91dC5hcHBlbmRDaGlsZChjYWxsb3V0V3JhcHBlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBqb2hhbm5lc0NhbGxvdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2VwYXJhdG9yQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcblxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJzZXBhcmF0b3Itd3JhcHBlclwiKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKTtcbiAgICAgICAgICAgIHNlcGFyYXRvci5jbGFzc0xpc3QuYWRkKCdzZXBhcmF0b3InKTtcbiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgcC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIHAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgXCJmb2N1c2FibGVcIiwgXCJrZXktdHJpZ2dlclwiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICBwLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdXcml0ZSBzb21ldGhpbmcgb3IgdHlwZSAvIChzbGFzaCkgdG8gY2hvb3NlIGEgYmxvY2suLi4nKTtcblxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoZWFkaW5nKGxldmVsOiBudW1iZXIsIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChgaCR7bGV2ZWx9YCk7XG5cbiAgICAgICAgaC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIGguY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIGguc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIGBoJHtsZXZlbH1gKTtcbiAgICAgICAgaC5jbGFzc0xpc3QuYWRkKFwiam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIsIFwic3dpdHRhYmxlXCIsIFwiZm9jdXNhYmxlXCIsIFwiZm9jdXNcIiwgXCJrZXktdHJpZ2dlclwiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICBoLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGBIZWFkaW5nICR7bGV2ZWx9YCk7XG5cbiAgICAgICAgcmV0dXJuIGg7XG4gICAgfVxuXG4gICAgc3RhdGljIGNoZWNrYm94SXRlbShjb250ZW50OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgY29uc3QgaWQgPSBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCk7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJkZWxldGFibGVcIiwgXCJuby1saXN0LXN0eWxlXCIsIFwibGlzdC1pdGVtXCIsIFwibGlzdC1pdGVtLWNoZWNrYWJsZVwiKTtcblxuICAgICAgICAvLyBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdrZXktdHJpZ2dlcicpO1xuXG4gICAgICAgIGxldCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIGNoZWNrYm94LmlkID0gaWQ7XG4gICAgICAgIGNoZWNrYm94LnNldEF0dHJpYnV0ZSgndHlwZScsICdjaGVja2JveCcpO1xuICAgICAgICAvLyBjaGVja2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcblxuICAgICAgICBsZXQgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnVG8tZG8nKTtcbiAgICAgICAgc3Bhbi5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJmb3JcIiwgaWQpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiLCBcImVkaXRhYmxlXCIsIFwiZm9jdXNcIik7XG5cbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgbGlzdEl0ZW0odGV4dDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuXG4gICAgLy8gICAgIGxldCBpbml0aWFsSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2RlbGV0YWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdlZGl0YWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdrZXktdHJpZ2dlcicpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0nKTtcblxuICAgIC8vICAgICBpbml0aWFsSXRlbS5pbm5lclRleHQgPSB0ZXh0O1xuXG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgLy8gICAgIHJldHVybiBpbml0aWFsSXRlbTtcblxuICAgIC8vIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtXzIoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG5cbiAgICAgICAgbGV0IGluaXRpYWxJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiLCBcImVkaXRhYmxlXCIsIFwiZm9jdXNcIiwgXCJrZXktdHJpZ2dlclwiKTtcbiAgICAgICAgZGl2LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICBkaXYuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0l0ZW0nKTtcblxuICAgICAgICBpbml0aWFsSXRlbS5hcHBlbmRDaGlsZChkaXYpO1xuXG5cbiAgICAgICAgZGl2LmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICByZXR1cm4gaW5pdGlhbEl0ZW07XG4gICAgfVxuXG5cbiAgICBzdGF0aWMgYmxvY2tQYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcblxuICAgICAgICBsZXQgbmV3RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5ld0Rpdi5pZCA9IGBiLSR7VXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpfWA7XG4gICAgICAgIGxldCBuZXdFbGVtZW50ID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaChjb250ZW50KTtcblxuICAgICAgICAvLyBsZXQgZHJhZ0hhbmRsZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuaW5uZXJIVE1MID0gJzxzdmcgd2lkdGg9XCIxLjM3NXJlbVwiIGhlaWdodD1cIjEuMzc1cmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgaHJlZj1cIiNpY29uLW1hdGVyaWFsLWRyYWdcIj48L3VzZT48L3N2Zz4nO1xuXG4gICAgICAgIC8vIG5ld0Rpdi5hcHBlbmRDaGlsZChuZXdCdXR0b24pO1xuICAgICAgICBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG5cbiAgICAgICAgbmV3RGl2LmNsYXNzTGlzdC5hZGQoJ2Jsb2NrJyk7XG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuY2xhc3NMaXN0LmFkZCgnZHJhZy1oYW5kbGVyJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmNsYXNzTGlzdC5hZGQoJ2J1dHRvbi1yZXNldCcpO1xuICAgICAgICAvLyBkcmFnSGFuZGxlci5kcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBuZXdEaXY7XG4gICAgfVxuXG4gICAgc3RhdGljIGRyYWdIYW5kbGVCdXR0b24oKSB7XG5cbiAgICAgICAgY29uc3QgZHJhZ0hhbmRsZXJXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgZHJhZ0hhbmRsZXJXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJkcmFnLWhhbmRsZXItd3JhcHBlclwiLCBDb21tb25DbGFzc2VzLkVkaXRvck9ubHkpO1xuXG4gICAgICAgIGxldCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChDb21tb25DbGFzc2VzLkVkaXRvck9ubHksIFwiZHJhZy1oYW5kbGVyXCIsIFwiYnV0dG9uLXJlc2V0XCIpO1xuICAgICAgICBidXR0b24uZHJhZ2dhYmxlID0gdHJ1ZTtcblxuXG4gICAgICAgIGRyYWdIYW5kbGVyV3JhcHBlci5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgICAgIHJldHVybiBkcmFnSGFuZGxlcldyYXBwZXI7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUljb24oaWNvbklkOiBzdHJpbmcpIHtcblxuICAgICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpY29uLXdyYXBwZXJcIik7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gYDxzdmcgd2lkdGg9XCIxLjM3NXJlbVwiIGhlaWdodD1cIjEuMzc1cmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgaHJlZj1cIiMke2ljb25JZH1cIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxufSIsImltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVUlDb21wb25lbnQ8VCBleHRlbmRzIEhUTUxFbGVtZW50ID0gSFRNTEVsZW1lbnQ+IHtcclxuXHJcbiAgICBpZD86IHN0cmluZztcclxuICAgIHByaXZhdGUgX2NhbkhpZGU6IGJvb2xlYW47XHJcblxyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT47XHJcbiAgICBodG1sRWxlbWVudDogVDtcclxuICAgIHBhcmVudD86IEJhc2VVSUNvbXBvbmVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG5cclxuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQgPSB0aGlzLmluaXQoKSBhcyBUO1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJbml0aWFsaXplcyBhbmQgcmV0dXJucyBhbiBIVE1MRWxlbWVudCB1c2luZyB0aGUgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBBUEkuXHJcbiAgICAqIFRoaXMgYWJzdHJhY3QgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mXHJcbiAgICAqIEhUTUxFbGVtZW50IHRvIGJlIGNyZWF0ZWQgYW5kIHBvc3NpYmx5IGNvbmZpZ3VyZSBpdHMgcHJvcGVydGllcyBvciBzdHlsZXMuXHJcbiAgICAqIERlcGVuZGVuY2llcyBuZWVkZWQgYnkgdGhlIHN1YmNsYXNzZXMgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBjb25zdHJ1Y3RvciBhbmRcclxuICAgICogYXJlIHR5cGljYWxseSBtYWRlIGF2YWlsYWJsZSB2aWEgdGhpcy5wcm9wcyBmb3IgdXNlIHdpdGhpbiB0aGlzIG1ldGhvZC5cclxuICAgICpcclxuICAgICogQGFic3RyYWN0XHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEV4YW1wbGUgc3ViY2xhc3MgdGhhdCB1c2VzIGEgZGVwZW5kZW5jeSBwYXNzZWQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IuXHJcbiAgICAqIGNsYXNzIFRvb2xiYXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG4gICAgKiAgICAgY29uc3RydWN0b3IoZGVwZW5kZW5jeSkge1xyXG4gICAgKiAgICAgICAgIHN1cGVyKHtkZXBlbmRlbmN5OiBkZXBlbmRlbmN5fSk7XHJcbiAgICAqICAgICAgICAgdGhpcy5kZXBlbmRlbmN5ID0gZGVwZW5kZW5jeTtcclxuICAgICogICAgIH1cclxuICAgICpcclxuICAgICogICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgKiAgICAgICAgIGNvbnN0IHRvb2xiYXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAqICAgICAgICAgdG9vbGJhckVsZW1lbnQuY2xhc3NOYW1lID0gJ3Rvb2xiYXInO1xyXG4gICAgKiAgICAgICAgIC8vIFVzaW5nIHRoZSBkZXBlbmRlbmN5XHJcbiAgICAqICAgICAgICAgdG9vbGJhckVsZW1lbnQuYXR0cmlidXRlKFwiY3VzdG9tRGVwZW5kZW5jeUJhc2VkXCIsIHRoaXMuZGVwZW5kZW5jeS5kYXRhKTtcclxuICAgICogICBcclxuICAgICogICAgICAgICByZXR1cm4gdG9vbGJhckVsZW1lbnQ7XHJcbiAgICAqICAgICB9XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBUaGUgbmV3bHkgY3JlYXRlZCBhbmQgY29uZmlndXJlZCBIVE1MRWxlbWVudC5cclxuICAgICovXHJcbiAgICBhYnN0cmFjdCBpbml0KCk6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SWQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmlkID0gaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ3NzQ2xhc3MoLi4udG9rZW5zOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LnB1c2goLi4udG9rZW5zKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4udG9rZW5zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXBwZW5kcyB0aGlzIGNvbXBvbmVudCdzIEhUTUwgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBjb21wb25lbnQncyBIVE1MIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgbWV0aG9kIGVzdGFibGlzaGVzIGEgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBpbiB0aGUgRE9NIGJ5IGFwcGVuZGluZyB0aGlzIGluc3RhbmNlJ3NcclxuICAgICogZWxlbWVudCBhcyBhIGNoaWxkIG9mIHRoZSBnaXZlbiBwYXJlbnQncyBlbGVtZW50LiBJdCBhbHNvIHVwZGF0ZXMgdGhlIHBhcmVudCBwcm9wZXJ0eSBvZiB0aGlzXHJcbiAgICAqIGluc3RhbmNlIHRvIHJlZmVyIHRvIHRoZSBwcm92aWRlZCBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0Jhc2VVSUNvbXBvbmVudH0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9uZW50IHRvIHdoaWNoIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudCB3aWxsIGJlIGFwcGVuZGVkLlxyXG4gICAgKiBUaGlzIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBCYXNlVUlDb21wb25lbnQgb3IgYW55IG9mIGl0cyBzdWJjbGFzc2VzLCBlbnN1cmluZyB0aGF0IGl0IGhhcyBhbiBodG1sRWxlbWVudCBwcm9wZXJ0eS5cclxuICAgICovXHJcbiAgICBhcHBlbmRUbyhwYXJlbnQ6IEJhc2VVSUNvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgIHBhcmVudC5odG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuaHRtbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyB8fCBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPT09ICdoaWRkZW4nIHx8ICFkb2N1bWVudC5jb250YWlucyhlbGVtZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0eWxlLmRpc3BsYXkgPT09ICdub25lJyB8fCBzdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3coKSB7XHJcbiAgICAgICAgLy8gdGhpcy5fY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcclxuXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2NhbkhpZGUgPSB0cnVlO1xyXG4gICAgICAgIC8vIH0sIDEwMCk7XHJcblxyXG4gICAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgLy8gaWYgKCF0aGlzLl9jYW5IaWRlKSB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zb2xlLndhcm4oXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICAvLyAgICAgLy8gcmV0dXJuO1xyXG4gICAgICAgIC8vICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gaGlkZSB0aGUgZWxlbWVudCBiZWZvcmUgMTAwIG1pbGxpc2Vjb25kcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBkaXNwbGF5LlwiKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBsb2NrSGlkZSgpIHtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2NrSGlkZSgpIHtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuSGlkZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FuSGlkZSAmJiB0aGlzLmlzVmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FuSGlkZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX2NhbkhpZGUgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuY29sb3IgPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcigpIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJpbmhlcml0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbigpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwbGF5ID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmlzaWJpbGl0eSA9IHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKG9yaWdpbmFsRGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5odG1sRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG5cclxuICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5ID09PSAnbm9uZScpIHtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gb3JpZ2luYWxEaXNwbGF5O1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBvcmlnaW5hbFZpc2liaWxpdHk7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBvcmlnaW5hbFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJpZ2h0RWRnZSA9IGVsZW1lbnRSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudFJpZ2h0RWRnZSA+IHNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnRSZWN0LmxlZnQgPCAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGVuc3VyZVZpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVsZXZhbnRDb250YWluZXIgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoJ3NlbGVjdCwgdWwnKTtcclxuXHJcbiAgICAgICAgaWYgKHJlbGV2YW50Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcsIGlubGluZTogJ3N0YXJ0JyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0F0dGVtcHRlZCB0byBtYWtlIGEgbm9uLXJlbGV2YW50IGl0ZW0gdmlzaWJsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDbG9zZUVsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5pZCA9PSBkZXRhaWxzLnRhcmdldElkISkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmIChkZXRhaWxzLnRhcmdldElkID09IHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL0Jhc2ljIFVJIGV2ZW50c1xyXG4gICAgYXR0YWNoVUlFdmVudCgpIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwgdGhpcy5oYW5kbGVDbG9zZUVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLlNob3dFbGVtZW50LCB0aGlzLmhhbmRsZVNob3dFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRGVwZW5kZW5jeUNvbnRhaW5lciA9IG5ldyBEZXBlbmRlbmN5Q29udGFpbmVyKCk7XHJcbiAgICBwcml2YXRlIGRlcGVuZGVuY2llczogeyBba2V5OiBzdHJpbmddOiBGdW5jdGlvbiB9ID0ge307XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICAgICAgcmV0dXJuIERlcGVuZGVuY3lDb250YWluZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llc1trZXldID0gY29uc3RydWN0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc29sdmU8VD4oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICBpZiAoIXRoaXMuZGVwZW5kZW5jaWVzW2tleV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXBlbmRlbmN5ICR7a2V5fSBub3QgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc1trZXldKCk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi9VdGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERPTVV0aWxzIHtcclxuXHJcblxyXG4gICAgc3RhdGljIGlzU2VsZWN0aW9uSW5UYWJsZUNlbGwoKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbj8ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgbm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xyXG4gICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKChub2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUgPT09ICdURCcgfHwgKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSA9PT0gJ1RIJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gVGhlIHNlbGVjdGlvbiBzdGFydHMgaW5zaWRlIGEgdGFibGUgY2VsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7ICAvLyBNb3ZlIHVwIGluIHRoZSBET00gdHJlZVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBTZWxlY3Rpb24gaXMgbm90IGluc2lkZSBhIHRhYmxlIGNlbGxcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gd2FzIGFkYXB0ZWQgZnJvbSBhIFN0YWNrT3ZlcmZsb3cgYW5zd2VyLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIFRoZSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCB0byBjaGVjay5cclxuICAgICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIGJvb2xlYW4gcHJvcGVydGllczogYGF0U3RhcnRgIGFuZCBgYXRFbmRgLlxyXG4gICAgKlxyXG4gICAgKiBAc2VlIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NDUxNDY4L2NvbnRlbnRlZGl0YWJsZS1kaXYtaG93LWNhbi1pLWRldGVybWluZS1pZi10aGUtY3Vyc29yLWlzLWF0LXRoZS1zdGFydC1vci1lbmQtbyNhbnN3ZXItNzQ3ODQyMHxTdGFja092ZXJmbG93IFJlc3BvbnNlfVxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBSZXR1cm5zIHsgYXRTdGFydDogdHJ1ZSwgYXRFbmQ6IGZhbHNlIH0gaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQsIGJ1dCBub3QgYXQgdGhlIGVuZC5cclxuICAgICogY29uc3QgcmVzdWx0ID0gZ2V0U2VsZWN0aW9uVGV4dEluZm8oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRhYmxlJykpO1xyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRTZWxlY3Rpb25UZXh0SW5mbyhlbDogSFRNTEVsZW1lbnQpOiB7IGF0U3RhcnQ6IGJvb2xlYW47IGF0RW5kOiBib29sZWFuIH0ge1xyXG5cclxuICAgICAgICBsZXQgYXRTdGFydCA9IGZhbHNlLCBhdEVuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZWwudGV4dENvbnRlbnQgPT0gXCJcIikge1xyXG4gICAgICAgICAgICBhdFN0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYXRFbmQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHsgYXRTdGFydCwgYXRFbmQgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNlbFJhbmdlOiBSYW5nZSwgdGVzdFJhbmdlOiBSYW5nZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHNlbFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIHRlc3RSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNldEVuZChzZWxSYW5nZS5zdGFydENvbnRhaW5lciwgc2VsUmFuZ2Uuc3RhcnRPZmZzZXQpO1xyXG4gICAgICAgICAgICBhdFN0YXJ0ID0gdGVzdFJhbmdlLnRvU3RyaW5nKCkgPT09IFwiXCI7XHJcblxyXG4gICAgICAgICAgICB0ZXN0UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsKTtcclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNldFN0YXJ0KHNlbFJhbmdlLmVuZENvbnRhaW5lciwgc2VsUmFuZ2UuZW5kT2Zmc2V0KTtcclxuICAgICAgICAgICAgYXRFbmQgPSB0ZXN0UmFuZ2UudG9TdHJpbmcoKSA9PT0gXCJcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGF0U3RhcnQsIGF0RW5kIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEluc2VydHMgYSBuZXcgbm9kZSBpbnRvIHRoZSBET00gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBzcGVjaWZpZWQgcmVmZXJlbmNlIG5vZGUuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZHluYW1pY2FsbHkgbW9kaWZ5aW5nIHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgYnkgYWRkaW5nIG5ldyBjb250ZW50XHJcbiAgICAqIG9yIGNvbXBvbmVudHMgaW4gcmVsYXRpb24gdG8gZXhpc3RpbmcgZWxlbWVudHMuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIFRoZSBuZXcgbm9kZSB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00uXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gcmVmZXJlbmNlTm9kZSAtIFRoZSBub2RlIGFmdGVyIHdoaWNoIHRoZSBuZXcgbm9kZSBzaG91bGQgYmUgaW5zZXJ0ZWQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBwZXJmb3JtcyBhIERPTSBtYW5pcHVsYXRpb24gb3BlcmF0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGluc2VydCBhIG5ldyBwYXJhZ3JhcGggYWZ0ZXIgYW4gZXhpc3RpbmcgZGl2IGVsZW1lbnQ6XHJcbiAgICAqIGNvbnN0IG5ld1BhcmFncmFwaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcclxuICAgICogbmV3UGFyYWdyYXBoLnRleHRDb250ZW50ID0gJ0hlbGxvLCB3b3JsZCEnO1xyXG4gICAgKiBjb25zdCByZWZlcmVuY2VEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXlEaXYnKTtcclxuICAgICogaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCByZWZlcmVuY2VEaXYpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHJlZmVyZW5jZU5vZGUgaGFzIGEgcGFyZW50IG5vZGUuIElmIGEgcGFyZW50IG5vZGUgZXhpc3RzLCBpdCB1c2VzXHJcbiAgICAqIGBwYXJlbnROb2RlLmluc2VydEJlZm9yZSgpYCB0byBpbnNlcnQgdGhlIG5ld05vZGUgaW50byB0aGUgRE9NIHJpZ2h0IGFmdGVyIHRoZSByZWZlcmVuY2VOb2RlLlxyXG4gICAgKiBUaGlzIGlzIGFjaGlldmVkIGJ5IHNwZWNpZnlpbmcgYHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmdgIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIGBpbnNlcnRCZWZvcmUoKWAsXHJcbiAgICAqIHdoaWNoIGVmZmVjdGl2ZWx5IHBsYWNlcyB0aGUgbmV3Tm9kZSBkaXJlY3RseSBhZnRlciB0aGUgcmVmZXJlbmNlTm9kZSBpbiB0aGUgZG9jdW1lbnQncyBzdHJ1Y3R1cmUuXHJcbiAgICAqIElmIHRoZSByZWZlcmVuY2VOb2RlIGhhcyBubyBwYXJlbnQsIHRoZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIGFzIGluc2VydGlvbiBpcyBub3QgcG9zc2libGUuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGluc2VydEFmdGVyKG5ld05vZGU6IE5vZGUsIHJlZmVyZW5jZU5vZGU6IE5vZGUpIHtcclxuICAgICAgICBpZiAocmVmZXJlbmNlTm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZS5uZXh0U2libGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDaGVja3MgaWYgYSBnaXZlbiBET00gTm9kZSBoYXMgYW55IHZpc2libGUgdGV4dCBjb250ZW50LiBUaGUgZnVuY3Rpb24gY29uc2lkZXJzIHRleHQgY29udGVudCBkaXJlY3RseSB3aXRoaW4gdGhlIG5vZGVcclxuICAgICogYXMgd2VsbCBhcyByZWN1cnNpdmVseSBjaGVja2luZyBhbGwgY2hpbGQgbm9kZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IG9yIGFueSBwYXJ0IG9mIGEgc3VidHJlZVxyXG4gICAgKiBoYXMgdGV4dHVhbCBzaWduaWZpY2FuY2UsIHdoaWNoIG1pZ2h0IGFmZmVjdCBkaXNwbGF5IGxvZ2ljLCB2YWxpZGF0aW9uLCBvciBwcm9jZXNzaW5nLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgRE9NIE5vZGUgdG8gY2hlY2sgZm9yIHRleHQgY29udGVudC5cclxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG5vZGUgaXRzZWxmIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4gaGFzIG5vbi1lbXB0eSB0ZXh0IGNvbnRlbnQsIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gU3VwcG9zZSB5b3Ugd2FudCB0byBjaGVjayBpZiBhIHBhcmFncmFwaCBlbGVtZW50IGlzIGVtcHR5IG9yIG5vdDpcclxuICAgICogY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGVQYXJhZ3JhcGgnKTtcclxuICAgICogY29uc3QgaGFzQ29udGVudCA9IGhhc1RleHRDb250ZW50KHBhcmFncmFwaCk7XHJcbiAgICAqIGNvbnNvbGUubG9nKCdEb2VzIHRoZSBwYXJhZ3JhcGggaGF2ZSBjb250ZW50PycsIGhhc0NvbnRlbnQpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgdGhlIHRleHQgY29udGVudCBvZiB0aGUgbm9kZSBpdHNlbGYuIElmIHRoZSBub2RlJ3MgdGV4dENvbnRlbnQsIHdoZW4gdHJpbW1lZCwgaXMgbm90IGFuIGVtcHR5IHN0cmluZyxcclxuICAgICogdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb2YgdmlzaWJsZSB0ZXh0LiBJZiB0aGUgaW5pdGlhbCBjaGVjayBmYWlscywgdGhlIGZ1bmN0aW9uIHRoZW4gcmVjdXJzaXZlbHlcclxuICAgICogY2hlY2tzIGVhY2ggY2hpbGQgbm9kZSB0byBkZXRlcm1pbmUgaWYgYW55IGNoaWxkIGNvbnRhaW5zIHZpc2libGUgdGV4dC4gVGhpcyByZWN1cnNpb24gZW5zdXJlcyB0aGF0IGV2ZW4gZGVlcGx5IG5lc3RlZCB0ZXh0IG5vZGVzXHJcbiAgICAqIHRoYXQgY29udHJpYnV0ZSB0byB0aGUgdmlzaWJsZSBjb250ZW50IGFyZSBhY2NvdW50ZWQgZm9yLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBmaW5kaW5nIHZpc2libGUgdGV4dCxcclxuICAgICogb3B0aW1pemluZyB0aGUgc2VhcmNoIHByb2Nlc3Mgd2l0aGluIHBvdGVudGlhbGx5IGxhcmdlIERPTSBzdHJ1Y3R1cmVzLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBoYXNUZXh0Q29udGVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycgfHxcclxuICAgICAgICAgICAgKG5vZGUuaGFzQ2hpbGROb2RlcygpICYmIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKS5zb21lKGNoaWxkTm9kZSA9PiB0aGlzLmhhc1RleHRDb250ZW50KGNoaWxkTm9kZSkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2xvbmVzIGEgc3BlY2lmaWVkIEhUTUxFbGVtZW50IGFuZCBpbnNlcnRzIHRoZSBjbG9uZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3JpZ2luYWwgZWxlbWVudCBpbiB0aGUgRE9NLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgZHVwbGljYXRpbmcgaW50ZXJhY3RpdmUgY29tcG9uZW50cyBvciBjb250ZW50IGJsb2NrcyB3aXRoaW4gYSBkeW5hbWljIGludGVyZmFjZS5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBIVE1MRWxlbWVudCB0byBiZSBjbG9uZWQgYW5kIHJlaW5zZXJ0ZWQuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9uZWQgSFRNTEVsZW1lbnQgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBvciBudWxsIGlmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBwYXJlbnQuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtZSB5b3UgaGF2ZSBhIGxpc3QgaXRlbSB0aGF0IHlvdSB3YW50IHRvIGR1cGxpY2F0ZTpcclxuICAgICogY29uc3QgbGlzdEl0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaS5teS1pdGVtJyk7XHJcbiAgICAqIGNvbnN0IG5ld0xpc3RJdGVtID0gY2xvbmVBbmRJbnNlcnRBZnRlcihsaXN0SXRlbSk7XHJcbiAgICAqIGlmIChuZXdMaXN0SXRlbSkge1xyXG4gICAgKiAgICAgY29uc29sZS5sb2coJ0l0ZW0gd2FzIGNsb25lZCBzdWNjZXNzZnVsbHkuJyk7XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gY2xvbmUgdGhlIHByb3ZpZGVkIGBlbGVtZW50YCB1c2luZyBgY2xvbmVOb2RlKHRydWUpYCwgd2hpY2ggZW5zdXJlcyB0aGF0IGFsbCBjaGlsZCBub2RlcyBhbmQgYXR0cmlidXRlcyBhcmUgY29waWVkLlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gdGhlbiBjaGVja3MgaWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaGFzIGEgcGFyZW50IG5vZGUuIElmIGl0IGRvZXMgbm90LCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxsIHNpbmNlIGluc2VydGlvbiBjYW5ub3QgcHJvY2VlZC5cclxuICAgICogSWYgYSBwYXJlbnQgbm9kZSBleGlzdHMsIHRoZSBjbG9uZWQgZWxlbWVudCBpcyBpbnNlcnRlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgb3JpZ2luYWwgZWxlbWVudCB1c2luZyBgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKWAuXHJcbiAgICAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byBlZmZlY3RpdmVseSBkdXBsaWNhdGUgYW5kIHBsYWNlIHRoZSBuZXcgZWxlbWVudCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiB3aXRoaW4gdGhlIERPTSB0cmVlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBjbG9uZUFuZEluc2VydEFmdGVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBjbG9uZWRFbGVtZW50ID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNsb25lZEVsZW1lbnQsIGVsZW1lbnQubmV4dFNpYmxpbmcpO1xyXG5cclxuICAgICAgICBpZiAoY2xvbmVkRWxlbWVudC5pZCkge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsb25lZEVsZW1lbnQuaWQubWF0Y2goL14oLis/KS0vKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XHJcbiAgICAgICAgICAgICAgICBjbG9uZWRFbGVtZW50LmlkID0gcHJlZml4ICsgJy0nICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2xvbmVkRWxlbWVudC5pZCA9IFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNsb25lZEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgKiBTZWFyY2hlcyBmb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgZWxlbWVudCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgQ1NTIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHRyYXZlcnNlcyB1cCBmcm9tIHRoZSBhY3RpdmUgZWxlbWVudCBpbiB0aGUgRE9NIHRyZWUgYW5kIGNoZWNrcyBlYWNoIGFuY2VzdG9yIHRvIHNlZSBpZiBpdCBtYXRjaGVzXHJcbiAgICAqIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZS5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIFRoZSBjbGFzcyBuYW1lIHRvIG1hdGNoIGFnYWluc3QgYW5jZXN0b3IgZWxlbWVudHMuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFN1cHBvc2UgeW91IHdhbnQgdG8gZmluZCB0aGUgY2xvc2VzdCBmb3JtIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgaW5wdXQgZmllbGQ6XHJcbiAgICAqIGNvbnN0IGNsb3Nlc3RGb3JtID0gZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoJ215LWZvcm0tY2xhc3MnKTtcclxuICAgICogY29uc29sZS5sb2coY2xvc2VzdEZvcm0pO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBiZWdpbnMgYnkgb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnQgdXNpbmcgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgLlxyXG4gICAgKiBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZWxlbWVudCwgb3IgdGhlIGFjdGl2ZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW55IGFuY2VzdG9yIHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyxcclxuICAgICogdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbC4gT3RoZXJ3aXNlLCBpdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBhbmNlc3RvcnMgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IHVudGlsIGl0IGZpbmRzXHJcbiAgICAqIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIG9yIHJlYWNoZXMgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50LiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29tcGxleFxyXG4gICAgKiBmb3JtcyBvciBpbnRlcmFjdGl2ZSBhcmVhcyB3aGVyZSBjb250ZXh0LWJhc2VkIGFjdGlvbnMgZGVwZW5kIG9uIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBET00gc3RydWN0dXJlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudDogTm9kZSB8IG51bGwgPSBhY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmXHJcbiAgICAgICAgICAgICAgICAoY3VycmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEZpbmRzIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUgZnJvbSB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbi5cclxuICAgICogSWYgdGhlIHNlbGVjdGlvbiBpcyBpbiBhIHRleHQgbm9kZSwgaXQgY2xpbWJzIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBjbG9zZXN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgY2xhc3MuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBjb250ZXh0LXNlbnNpdGl2ZSBvcGVyYXRpb25zIGJhc2VkIG9uIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiBkb2N1bWVudCBlZGl0aW5nIG9yIHByb2Nlc3NpbmcgZW52aXJvbm1lbnRzLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gVGhlIGNsYXNzIG5hbWUgdG8gc2VhcmNoIGZvciBpbiBhbmNlc3RvciBlbGVtZW50cy5cclxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gVGhlIGNsb3Nlc3QgYW5jZXN0b3IgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG9yIG51bGwgaWYgbm8gc3VjaCBlbGVtZW50IGlzIGZvdW5kLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2xvc2VzdEFuY2VzdG9yT2ZTZWxlY3Rpb25CeUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBzZWxlY3Rpb24gYW5kIGlmIGl0IGhhcyBhdCBsZWFzdCBvbmUgcmFuZ2VcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgc3RhcnRpbmcgbm9kZSBvZiB0aGUgc2VsZWN0aW9uXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBub2RlIGlzIGEgdGV4dCBub2RlLCBzdGFydCBmcm9tIGl0cyBwYXJlbnQgZWxlbWVudFxyXG4gICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAmJiBjdXJyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3NcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoY3VycmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFJlYXJyYW5nZSBjb250ZW50IGFyb3VuZCB0aGUgc3BsaXQgcG9pbnQgYmFzZWQgb24gdGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcm9jZXNzIG9mIHNwbGl0dGluZyB0aGUgY29udGVudCBhdCB0aGUgY3Vyc29yLFxyXG4gICAgKiB0aGVuIHJlYXJyYW5naW5nIHRoZSBjb250ZW50IGJ5IGRlbGV0aW5nIGFwcHJvcHJpYXRlIHBhcnRzIGluIHRoZSBvcmlnaW5hbFxyXG4gICAgKiBhbmQgY2xvbmVkIG5vZGVzLiBJdCBlbnN1cmVzIHRoYXQgYWZ0ZXIgdGhlIHNwbGl0LCB0aGUgb3JpZ2luYWwgbm9kZSBjb250YWluc1xyXG4gICAgKiBvbmx5IHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCB0aGUgY2xvbmVkIG5vZGUgY29udGFpbnMgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGN1cnNvci5cclxuICAgICogSW1wb3J0YW50bHksIHRoaXMgZnVuY3Rpb24gbWFpbnRhaW5zIHRoZSB2YWxpZGl0eSBvZiB0aGUgRE9NIHN0cnVjdHVyZSBhZnRlciBtb2RpZmljYXRpb25zLFxyXG4gICAgKiBwcmV2ZW50aW5nIGFueSBkaXNydXB0aW9ucyBpbiBkb2N1bWVudCBzdHJ1Y3R1cmUgdGhhdCBjb3VsZCBhZmZlY3QgcmVuZGVyaW5nIG9yIGZ1cnRoZXIgc2NyaXB0aW5nLlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtOb2RlfSBjdXJyZW50Tm9kZSAtIFRoZSBub2RlIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQgYmVmb3JlIHRoZSBzcGxpdC5cclxuICAgICogQHBhcmFtIHtOb2RlfSBuZXdOb2RlIC0gVGhlIGNsb25lZCBub2RlIHRoYXQgd2lsbCBjb250YWluIHRoZSBjb250ZW50IGFmdGVyIHRoZSBzcGxpdC5cclxuICAgICogQHJldHVybnMge3ZvaWR9IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWU7IGl0IG1vZGlmaWVzIERPTSBub2RlcyBkaXJlY3RseS5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtaW5nIGN1cnJlbnROb2RlIGlzIGFuIGVsZW1lbnQgd2l0aCB0ZXh0IGNvbnRlbnQgYW5kIGEgY3Vyc29yIHBvc2l0aW9uIHdpdGhpbiBpdCxcclxuICAgICogLy8gYW5kIG5ld05vZGUgaXMgaXRzIGNsb25lZCBjb3VudGVycGFydDpcclxuICAgICogcmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY3VycmVudE5vZGUsIG5ld05vZGUpO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYSBwYXJ0IG9mIGFuIGVkaXRpbmcgc3lzdGVtIHdoZXJlIGNvbnRlbnQgbmVlZHMgdG8gYmUgZHluYW1pY2FsbHlcclxuICAgICogc3BsaXQgYW5kIHJlYXJyYW5nZWQuIEl0IHVzZXMgYSBjdXJzb3ItYmFzZWQgYXBwcm9hY2ggdG8gZGV0ZXJtaW5lIHRoZSBzcGxpdCBwb2ludCxcclxuICAgICogcmVtb3ZlcyBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIGFuZCB0aGUgY2xvbmUgYmFzZWQgb24gdGhlIGN1cnNvcidzIHBvc2l0aW9uLFxyXG4gICAgKiBhbmQgc2V0cyB1cCB0aGUgbm9kZXMgZm9yIHN1YnNlcXVlbnQgdXNlciBpbnRlcmFjdGlvbnMuIFRoZSBET00gcmVtYWlucyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQsXHJcbiAgICAqIGVuc3VyaW5nIHRoYXQgc3Vic2VxdWVudCBvcGVyYXRpb25zLCBzdWNoIGFzIGZ1cnRoZXIgc3BsaXRzIG9yIHN0eWxlIGNoYW5nZXMsIGNhbiBiZSBwZXJmb3JtZWRcclxuICAgICogd2l0aG91dCBhZGRpdGlvbmFsIGNoZWNrcyBvciBjb3JyZWN0aW9ucy5cclxuICAgICovXHJcbiAgICBzdGF0aWMgcmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY3VycmVudE5vZGU6IE5vZGUsIG5ld05vZGU6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IERPTVV0aWxzLmdldEN1cnNvclBvc2l0aW9uKGN1cnJlbnROb2RlIGFzIE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlczEgPSB0aGlzLnNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKGN1cnJlbnROb2RlIGFzIE5vZGUpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIG9yaWdpbmFsXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZShyYW5nZXMxWzFdKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uZGVsZXRlRnJvbURvY3VtZW50KCk7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgY2xvbmVcclxuICAgICAgICBpZiAobmV3Tm9kZSAmJiBjdXJzb3JQb3NpdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNldEN1cnNvclBvc2l0aW9uKG5ld05vZGUsIGN1cnNvclBvc2l0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlczIgPSB0aGlzLnNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKG5ld05vZGUgYXMgTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZShyYW5nZXMyWzBdKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2FsY3VsYXRlcyB0aGUgY3Vyc29yIHBvc2l0aW9uIHdpdGhpbiB0aGUgc3BlY2lmaWVkIG5vZGUuIFRoZSBwb3NpdGlvbiBpcyBkZXRlcm1pbmVkXHJcbiAgICAqIGJ5IGNvdW50aW5nIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG5vZGUgdG8gdGhlIGN1cnNvcidzIGxvY2F0aW9uIHdpdGhpbiB0aGUgbm9kZS5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBlc3NlbnRpYWwgZm9yIHNjZW5hcmlvcyB3aGVyZSBwcmVjaXNlIHRleHQgbWFuaXB1bGF0aW9uIGlzIHJlcXVpcmVkLCBzdWNoIGFzXHJcbiAgICAqIHRleHQgZWRpdG9ycyBvciBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29udGVudCBmaWVsZHMuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgLSBUaGUgbm9kZSB3aXRoaW4gd2hpY2ggdG8gY2FsY3VsYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSBUaGUgemVyby1iYXNlZCBpbmRleCByZXByZXNlbnRpbmcgdGhlIGN1cnNvcidzIHBvc2l0aW9uIHdpdGhpbiB0aGUgbm9kZSxcclxuICAgICogb3IgbnVsbCBpZiB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IGludGVyc2VjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbm9kZSBvciBpZiB0aGVyZSBhcmUgYW55IGlzc3Vlc1xyXG4gICAgKiByZXRyaWV2aW5nIHRoZSBzZWxlY3Rpb24uXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGFuZCB0aGUgY3Vyc29yIGlzIGluc2lkZSBpdDpcclxuICAgICogY29uc3QgcG9zaXRpb24gPSBnZXRDdXJzb3JQb3NpdGlvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktZWRpdGFibGUtZGl2JykpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnQ3Vyc29yIHBvc2l0aW9uOicsIHBvc2l0aW9uKTtcclxuICAgICogXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24ncyByYW5nZSBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBpbnRlcnNlY3RzIHdpdGggdGhlXHJcbiAgICAqIGdpdmVuIG5vZGUuIElmIGFuIGludGVyc2VjdGlvbiBpcyBmb3VuZCwgaXQgdXNlcyBhIFRyZWVXYWxrZXIgdG8gdHJhdmVyc2UgdGhlIHRleHQgbm9kZXMgdW5kZXJcclxuICAgICogdGhlIGdpdmVuIG5vZGUsIGNvdW50aW5nIGNoYXJhY3RlcnMgdW50aWwgaXQgcmVhY2hlcyB0aGUgc3RhcnQgY29udGFpbmVyIG9mIHRoZSByYW5nZS5cclxuICAgICogVGhpcyBhbGxvd3MgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBhbiBhY2N1cmF0ZSBjaGFyYWN0ZXIgaW5kZXggZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgbmVzdGVkIGVsZW1lbnRzXHJcbiAgICAqIG9yIG1peGVkIGNvbnRlbnQgKHRleHQgY29tYmluZWQgd2l0aCBlbGVtZW50cykuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGdldEN1cnNvclBvc2l0aW9uKG5vZGU6IE5vZGUpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIW5vZGUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBpZiAoIXJhbmdlLmludGVyc2VjdHNOb2RlKG5vZGUpKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbiAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxyXG4gICAgICAgICAgICB7IGFjY2VwdE5vZGU6IG5vZGUgPT4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBsZXQgY2hhckNvdW50ID0gMDtcclxuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLmZpcnN0Q2hpbGQoKTtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSA9PT0gcmFuZ2Uuc3RhcnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGNoYXJDb3VudCArPSByYW5nZS5zdGFydE9mZnNldDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGFyQ291bnQgKz0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjaGFyQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBlbGVtZW50IGJhc2VkIG9uIGEgY2hhcmFjdGVyIGluZGV4LlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcmFuZ2UgYW5kIHVzZXMgYSBUcmVlV2Fsa2VyIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHRleHQgbm9kZXNcclxuICAgICogd2l0aGluIHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIGV4YWN0IGxvY2F0aW9uIHRvIHNldCB0aGUgY3Vyc29yLiBUaGUgcG9zaXRpb24gaXMgc2V0XHJcbiAgICAqIGJ5IGNvdW50aW5nIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHNwZWNpZmllZCBpbmRleC5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBzZXQgdGhlIGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIC0gVGhlIHplcm8tYmFzZWQgY2hhcmFjdGVyIGluZGV4IHdoZXJlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHBvc2l0aW9uZWQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBkaXJlY3RseSBtb2RpZmllcyB0aGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIHBhcmFncmFwaCBlbGVtZW50IGFuZCB5b3Ugd2FudCB0byBzZXQgdGhlIGN1cnNvciBhdCB0aGUgMTB0aCBjaGFyYWN0ZXI6XHJcbiAgICAqIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteS1wYXJhZ3JhcGgnKTtcclxuICAgICogc2V0Q3Vyc29yUG9zaXRpb24ocGFyYWdyYXBoLCAxMCk7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhlIGZ1bmN0aW9uIGNsZWFycyBhbnkgZXhpc3Rpbmcgc2VsZWN0aW9ucywgY2FsY3VsYXRlcyB0aGUgY29ycmVjdCB0ZXh0IG5vZGUgYW5kIG9mZnNldCB3aXRoaW4gdGhhdCBub2RlLFxyXG4gICAgKiBhbmQgdGhlbiBzZXRzIGEgbmV3IHJhbmdlIGF0IHRoYXQgcG9zaXRpb24uIEl0IGVuc3VyZXMgdGhhdCB0aGUgY3Vyc29yIGlzIG1vdmVkIGFjY3VyYXRlbHksIGV2ZW4gd2l0aGluXHJcbiAgICAqIGNvbXBsZXggbmVzdGVkIGNvbnRlbnQgc3RydWN0dXJlcy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB0ZXh0IGVkaXRpbmcgYXBwbGljYXRpb25zIGFuZCBkeW5hbWljXHJcbiAgICAqIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW1zIHdoZXJlIHByZWNpc2UgY3Vyc29yIGNvbnRyb2wgaXMgcmVxdWlyZWQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHNldEN1cnNvclBvc2l0aW9uKGVsZW1lbnQ6IE5vZGUsIHBvc2l0aW9uOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgY29uc3QgdHJlZVdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbiAgICAgICAgICAgIGVsZW1lbnQsXHJcbiAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxyXG4gICAgICAgICAgICB7IGFjY2VwdE5vZGU6ICgpID0+IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgIGxldCBjdXJyZW50UG9zID0gMDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHRMZW5ndGggPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoIHx8IDA7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UG9zICsgdGV4dExlbmd0aCA+PSBwb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY3VycmVudE5vZGUsIHBvc2l0aW9uIC0gY3VycmVudFBvcyk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRQb3MgKz0gdGV4dExlbmd0aDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZXRyaWV2ZXMgdGhlIGNvbnRlbnQgdHlwZSBhdHRyaWJ1dGUgZnJvbSB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb250ZW50IGJsb2NrIGluIHRoZSBkb2N1bWVudC5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBwcmltYXJpbHkgdXNlZCBpbiBjb250ZXh0cyB3aGVyZSBkaWZmZXJlbnQgYWN0aW9ucyBvciBiZWhhdmlvcnMgYXJlIGNvbmRpdGlvbmVkXHJcbiAgICAqIHVwb24gdGhlIHR5cGUgb2YgY29udGVudCB0aGUgdXNlciBpcyBpbnRlcmFjdGluZyB3aXRoLlxyXG4gICAgKlxyXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gVGhlIHZhbHVlIG9mIHRoZSAnZGF0YS1jb250ZW50LXR5cGUnIGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMgb24gdGhlIGNvbnRlbnQgZWxlbWVudCxcclxuICAgICogb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCBvciB0aGUgY29udGVudCBlbGVtZW50IGRvZXMgbm90IGV4aXN0LlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBJZiB5b3UgbmVlZCB0byBhcHBseSBzcGVjaWZpYyBsb2dpYyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBjb250ZW50IGN1cnJlbnRseSBiZWluZyBlZGl0ZWQ6XHJcbiAgICAqIGNvbnN0IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCgpO1xyXG4gICAgKiBpZiAoY29udGVudFR5cGUgPT09ICdwJykge1xyXG4gICAgKiAgICAgY29uc29sZS5sb2coJ0VkaXRpbmcgYSB0ZXh0IGJsb2NrJyk7XHJcbiAgICAqIH0gZWxzZSBpZiAoY29udGVudFR5cGUgPT09ICdoMScpIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdFZGl0aW5nIGFuIGhlYWRpbmcnKTtcclxuICAgICogfVxyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBiZWdpbnMgYnkgY2FsbGluZyBgZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKClgLCB3aGljaCBzaG91bGQgcmV0dXJuIHRoZSBjdXJyZW50bHkgYWN0aXZlIGJsb2NrIGVsZW1lbnRcclxuICAgICogaW4gdGhlIFVJLiBJdCB0aGVuIHNlYXJjaGVzIGZvciBhbiBlbGVtZW50IHdpdGhpbiB0aGlzIGJsb2NrIHdpdGggdGhlIGNsYXNzICcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JyxcclxuICAgICogd2hpY2ggaXMgZXhwZWN0ZWQgdG8gY2FycnkgYSAnZGF0YS1jb250ZW50LXR5cGUnIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGNvbnRlbnQgKGUuZy4sICd0ZXh0JywgJ2ltYWdlJywgZXRjLikuXHJcbiAgICAqIFRoZSBmdW5jdGlvbiByZXRyaWV2ZXMgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIGdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKTtcclxuICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGJsb2NrPy5xdWVyeVNlbGVjdG9yKFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAoIWNvbnRlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IGNvbnRlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50VHlwZSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTcGxpdHMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCByb290IG5vZGUgaW50byB0d28gcmFuZ2VzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi5cclxuICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHR3byByYW5nZXM6IG9uZSBmb3IgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBjdXJzb3IgYW5kIG9uZSBmb3IgdGhlIGNvbnRlbnQgYWZ0ZXIuXHJcbiAgICAqIFRoZSBvcGVyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgYm91bmRhcmllcyBvZiB0aGUgcHJvdmlkZWQgcm9vdCBub2RlLCBlbnN1cmluZyB0aGF0IHRoZSBkaXZpc2lvbiByZXNwZWN0c1xyXG4gICAgKiB0aGUgc3RydWN0dXJhbCBpbnRlZ3JpdHkgb2YgdGhlIGNvbnRlbnQgd2l0aGluIHRoYXQgbm9kZS5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gcm9vdE5vZGUgLSBUaGUgcm9vdCBub2RlIHdpdGhpbiB3aGljaCB0aGUgY29udGVudCBpcyB0byBiZSBzcGxpdC4gVGhpcyBub2RlIHNldHMgdGhlIGJvdW5kYXJ5IGZvciB0aGUgc3BsaXQgb3BlcmF0aW9uLlxyXG4gICAgKiBAcmV0dXJucyB7UmFuZ2VbXX0gQW4gYXJyYXkgb2YgdHdvIGBSYW5nZWAgb2JqZWN0czogdGhlIGZpcnN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBjdXJzb3IsIGFuZCB0aGUgc2Vjb25kIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGN1cnNvci5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtZSB0aGVyZSBpcyBhIGRpdiBlbGVtZW50IHdpdGggY29udGVudCBhbmQgYSBjdXJzb3IgcG9zaXRpb24gc29tZXdoZXJlIGluc2lkZSBpdDpcclxuICAgICogY29uc3QgY29udGVudERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50RGl2Jyk7XHJcbiAgICAqIGNvbnN0IHJhbmdlcyA9IHNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKGNvbnRlbnREaXYpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnQ29udGVudCBiZWZvcmUgY3Vyc29yOicsIHJhbmdlc1swXS5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnQ29udGVudCBhZnRlciBjdXJzb3I6JywgcmFuZ2VzWzFdLmNsb25lQ29udGVudHMoKS50ZXh0Q29udGVudCk7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgcmFuZ2UgYW5kIGNoZWNrcyBpZiBpdCBpbnRlcnNlY3RzIHdpdGggdGhlIHByb3ZpZGVkIHJvb3ROb2RlLlxyXG4gICAgKiBJZiBzbywgaXQgY29uc3RydWN0cyB0d28gbmV3IHJhbmdlcyB1c2luZyB0aGUgcm9vdE5vZGUgYXMgdGhlIGNvbnRleHQ6XHJcbiAgICAqIC0gVGhlIGZpcnN0IHJhbmdlIGNhcHR1cmVzIGFsbCBjb250ZW50IGZyb20gdGhlIHN0YXJ0IG9mIHJvb3ROb2RlIHVwIHRvIHRoZSBjdXJzb3IncyBzdGFydC5cclxuICAgICogLSBUaGUgc2Vjb25kIHJhbmdlIGNhcHR1cmVzIGFsbCBjb250ZW50IGZyb20gdGhlIGN1cnNvcidzIGVuZCB0byB0aGUgZW5kIG9mIHJvb3ROb2RlLCBvcHRpb25hbGx5IGV4dGVuZGluZyB0byB0aGUgbGFzdCBjaGlsZCBvZiByb290Tm9kZSBpZiBuZWNlc3NhcnkuXHJcbiAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgaW52b2x2aW5nIHJpY2ggdGV4dCBlZGl0aW5nIG9yIGFueSBzY2VuYXJpbyB3aGVyZSBjb250ZW50IG5lZWRzIHRvIGJlIHNlZ21lbnRlZCBhcm91bmQgYSB1c2VyJ3MgcG9pbnQgb2YgZm9jdXMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHNwbGl0Q29udGVudEF0Q3Vyc29yU2VsZWN0aW9uKHJvb3ROb2RlOiBOb2RlKTogUmFuZ2VbXSB7XHJcbiAgICAgICAgY29uc3QgcmFuZ2VzOiBSYW5nZVtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIHJhbmdlcztcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2VCZWZvcmUgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlQmVmb3JlLnNlbGVjdE5vZGVDb250ZW50cyhyb290Tm9kZSk7XHJcbiAgICAgICAgcmFuZ2VCZWZvcmUuc2V0RW5kKHJhbmdlLnN0YXJ0Q29udGFpbmVyLCByYW5nZS5zdGFydE9mZnNldCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlQWZ0ZXIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlQWZ0ZXIuc2VsZWN0Tm9kZUNvbnRlbnRzKHJvb3ROb2RlKTtcclxuICAgICAgICByYW5nZUFmdGVyLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcclxuICAgICAgICBpZiAocm9vdE5vZGUubGFzdENoaWxkKSB7XHJcbiAgICAgICAgICAgIHJhbmdlQWZ0ZXIuc2V0RW5kQWZ0ZXIocm9vdE5vZGUubGFzdENoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJhbmdlcy5wdXNoKHJhbmdlQmVmb3JlKTtcclxuICAgICAgICByYW5nZXMucHVzaChyYW5nZUFmdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUGxhY2VzIHRoZSBjdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIGEgc3BlY2lmaWVkIGVkaXRhYmxlIEhUTUwgZWxlbWVudC4gVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgdGhlIGVsZW1lbnQgaXMgXHJcbiAgICAqIGNvbnRlbnQtZWRpdGFibGUsIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gdXNlciBpbnRlcmZhY2VzXHJcbiAgICAqIHdoZXJlIHRleHQgZWRpdGluZyBjYXBhYmlsaXRpZXMgYXJlIGR5bmFtaWNhbGx5IGVuYWJsZWQsIGFuZCBpbW1lZGlhdGUgdXNlciBpbnRlcmFjdGlvbiBpcyBleHBlY3RlZC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWRpdGFibGVFbGVtZW50IC0gVGhlIGNvbnRlbnQtZWRpdGFibGUgSFRNTCBlbGVtZW50IHdoZXJlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgc3RhcnQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBkaXJlY3RseSBtYW5pcHVsYXRlcyB0aGUgRE9NIGFuZCBzZWxlY3Rpb24gc3RhdGUuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEFzc3VtaW5nIHRoZXJlIGlzIGEgY29udGVudC1lZGl0YWJsZSBwYXJhZ3JhcGggaW4gdGhlIGRvY3VtZW50OlxyXG4gICAgKiBjb25zdCBlZGl0YWJsZVBhcmFncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0YWJsZVBhcmFncmFwaCcpO1xyXG4gICAgKiBwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChlZGl0YWJsZVBhcmFncmFwaCk7XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBpZiB0aGUgYGVkaXRhYmxlRWxlbWVudGAgaXMgY29udGVudC1lZGl0YWJsZS4gSWYgaXQgaXMgbm90LCBhIHdhcm5pbmcgaXMgbG9nZ2VkIHRvIHRoZSBjb25zb2xlLlxyXG4gICAgKiBJZiB0aGUgZWxlbWVudCBpcyBlZGl0YWJsZSwgaXQ6XHJcbiAgICAqIDEuIFNldHMgZm9jdXMgb24gdGhlIGVsZW1lbnQgdG8gZW5zdXJlIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHVzZXIgaW5wdXQuXHJcbiAgICAqIDIuIENyZWF0ZXMgYSBuZXcgUmFuZ2Ugb2JqZWN0LCBzZWxlY3RzIGFsbCB0aGUgY29udGVudHMgb2YgdGhlIGVsZW1lbnQsIGFuZCBjb2xsYXBzZXMgdGhpcyByYW5nZSB0byB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAqIDMuIENsZWFycyBhbnkgZXhpc3Rpbmcgc2VsZWN0aW9ucyBhbmQgYXBwbGllcyB0aGUgbmV3IHJhbmdlLCBlZmZlY3RpdmVseSBwb3NpdGlvbmluZyB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudC5cclxuICAgICogVGhpcyBhcHByb2FjaCBpcyBjcnVjaWFsIGZvciBlZGl0aW5nIGludGVyZmFjZXMsIGVuc3VyaW5nIHRoYXQgdXNlciBpbnRlcmFjdGlvbiBpcyBpbnR1aXRpdmUgYW5kIGltbWVkaWF0ZWx5IHJlc3BvbnNpdmUuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGVkaXRhYmxlRWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRhYmxlRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgZWxlbWVudCBpcyBub3QgZWRpdGFibGUuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFNldHMgdGhlIGZvY3VzIGFuZCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgdGV4dCB3aXRoaW4gYSBzcGVjaWZpZWQgY29udGVudC1lZGl0YWJsZSBIVE1MIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgbWV0aG9kIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBoYW5kbGUgY29udGVudC1lZGl0YWJsZSBlbGVtZW50cyBieSBwb3NpdGlvbmluZyB0aGUgY3Vyc29yXHJcbiAgICAqIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnRlbnQncyBjb21wb3NpdGlvbiAodGV4dCwgZWxlbWVudHMsIGV0Yy4pLlxyXG4gICAgKlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIGNvbnRlbnQtZWRpdGFibGUuIElmIGl0IGlzLCBpdCB1c2VzIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgXHJcbiAgICAqIHRvIGVuc3VyZSB0aGF0IGFsbCBET00gdXBkYXRlcyBoYXZlIGNvbXBsZXRlZCBiZWZvcmUgc2V0dGluZyBmb2N1cyBhbmQgYWRqdXN0aW5nIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEl0IHRoZW4gY3JlYXRlcyBhIHJhbmdlIHNwYW5uaW5nIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50LCBmaW5kcyB0aGUgZGVlcGVzdCBsYXN0IG5vZGUsIGFuZCBzZXRzIHRoZVxyXG4gICAgKiBjdXJzb3IgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGlzIG5vZGUuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgcmljaCB0ZXh0IGVkaXRvcnMgb3IgYW55IGFwcGxpY2F0aW9uXHJcbiAgICAqIHRoYXQgcmVxdWlyZXMgcHJlY2lzZSBjb250cm9sIG92ZXIgY3Vyc29yIHBsYWNlbWVudCBpbiBlZGl0YWJsZSBjb250ZW50LlxyXG4gICAgKlxyXG4gICAgKiBJZiB0aGUgZWxlbWVudCBpcyBub3QgY29udGVudC1lZGl0YWJsZSwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGVkaXRlZC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGVudEJsb2NrIC0gVGhlIGNvbnRlbnQtZWRpdGFibGUgSFRNTCBlbGVtZW50IHdoZXJlIHRoZSBjdXJzb3Igd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGVuZC5cclxuICAgICovXHJcbiAgICBzdGF0aWMgcGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGNvbnRlbnRCbG9jazogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoY29udGVudEJsb2NrLmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50QmxvY2suZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRlbnRCbG9jayk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGxhc3ROb2RlOiBOb2RlIHwgbnVsbCA9IGNvbnRlbnRCbG9jaztcclxuICAgICAgICAgICAgICAgIHdoaWxlIChsYXN0Tm9kZS5sYXN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IGxhc3ROb2RlLmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRFbmQobGFzdE5vZGUsIGxhc3ROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSA/IGxhc3ROb2RlLnRleHRDb250ZW50IS5sZW5ndGggOiAwKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBlbGVtZW50IGlzIG5vdCBlZGl0YWJsZS5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRDdXJyZW50QWN0aXZlQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNsb3Nlc3QoXCIuYmxvY2tcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YocGFyZW50U2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBFbGVtZW50KS5jbG9zZXN0KHBhcmVudFNlbGVjdG9yKSAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlRmlsdGVyVGV4dCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgICBsZXQgbGFzdFNsYXNoUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBjb250YWluZXIucGFyZW50RWxlbWVudD8uaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IGNvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBvZmZzZXQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IG5vZGUudGV4dENvbnRlbnQ/LnN1YnN0cmluZygwLCBvZmZzZXQpIHx8IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoUG9zaXRpb24gPSB0ZXh0QmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKFwiL1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTbGFzaFBvc2l0aW9uICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBsYXN0U2xhc2hQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG5vZGUucGFyZW50Tm9kZT8udGV4dENvbnRlbnQ/Lmxhc3RJbmRleE9mKFwiL1wiKSB8fCAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlRoZSBjdXJzb3IgaXMgbm90IHdpdGhpbiBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50IG9yIGEgdGV4dCBub2RlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk5vIGFjdGl2ZSBzZWxlY3Rpb24uXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxhc3RTbGFzaFBvc2l0aW9uO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgc3RhdGljIGZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeURhdGFDb250ZW50VHlwZShldmVudDogTW91c2VFdmVudCwgZGF0YUNvbnRlbnRUeXBlOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBjbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmRhdGFzZXQuY29udGVudFR5cGUgPT09IGRhdGFDb250ZW50VHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2xpY2tlZEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZGF0YXNldC5jb250ZW50VHlwZSA9PT0gZGF0YUNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkKGV2ZW50OiBNb3VzZUV2ZW50LCBpZDogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNsaWNrZWRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlDbGFzcyhldmVudDogTW91c2VFdmVudCwgY2xhc3NLZXk6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudCE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzS2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2xpY2tlZEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzS2V5KSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZihldmVudDogS2V5Ym9hcmRFdmVudCwgc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCB0YXJnZXQ6IEVsZW1lbnQgfCBudWxsID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICghKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFBhcmVudFRhcmdldEJ5U2VsZWN0b3IoZXZlbnQ6IE1vdXNlRXZlbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogRWxlbWVudCB8IG51bGwgPSAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkgPyBldmVudC50YXJnZXQgOiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBOb2RlID8gZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQgOiBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHRhcmdldC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQYXJlbnRGcm9tU2VsZWN0aW9uKHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gfCBudWxsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgbGV0IHJhbmdlOiBSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGxldCBjb21tb25BbmNlc3RvckNvbnRhaW5lcjogTm9kZSA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCAmJiBjb21tb25BbmNlc3RvckNvbnRhaW5lci5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQ6IEVsZW1lbnQgfCBudWxsID0gY29tbW9uQW5jZXN0b3JDb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50XHJcbiAgICAgICAgICAgID8gY29tbW9uQW5jZXN0b3JDb250YWluZXJcclxuICAgICAgICAgICAgOiBjb21tb25BbmNlc3RvckNvbnRhaW5lci5wYXJlbnRFbGVtZW50O1xyXG4gICAgXHJcbiAgICAgICAgd2hpbGUgKHBhcmVudEVsZW1lbnQgJiYgcGFyZW50RWxlbWVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZW1vdmVDbGFzc2VzV2l0aFByZWZpeChlbGVtZW50OiBFbGVtZW50LCBwcmVmaXg6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXNUb1JlbW92ZSA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpLmZpbHRlcihjbHMgPT4gY2xzLnN0YXJ0c1dpdGgocHJlZml4KSk7XHJcbiAgICAgICAgY2xhc3Nlc1RvUmVtb3ZlLmZvckVhY2goY2xzID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbHMpKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNUYXJnZXREZXNjZW5kYW50T2ZTZWxlY3RvcihldmVudDogRXZlbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgVGV4dCkge1xyXG4gICAgICAgICAgICB0YXJnZXQgPSAoZXZlbnQudGFyZ2V0IGFzIFRleHQpLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhbmNlc3RvciA9IHRhcmdldC5jbG9zZXN0KHNlbGVjdG9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9yICE9PSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZWFyY2hlcyBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgc3BlY2lmaWVkIHNlbGVjdG9yLCBjaGVja2luZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIGl0cyBkZXNjZW5kYW50cy5cclxuICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20sIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guXHJcbiAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgQ1NTIHNlbGVjdG9yIHRvIG1hdGNoIGFnYWluc3QuXHJcbiAgICAqIEByZXR1cm5zIFRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIGluY2x1ZGluZyB0aGUgZWxlbWVudCBpdHNlbGYsIG9yIG51bGwgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JJbmNsdWRpbmdTZWxmKGVsZW1lbnQ6IEVsZW1lbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBtYXRjaGVzIHRoZSBzZWxlY3RvclxyXG4gICAgICAgIGlmIChlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBub3QsIHVzZSB0aGUgc3RhbmRhcmQgcXVlcnlTZWxlY3RvciB0byBmaW5kIGEgbWF0Y2hpbmcgZGVzY2VuZGFudFxyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN0YXRpYyBzYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50LmlubmVySFRNTDtcclxuICAgIC8vICAgICBpZiAoY29udGVudC5lbmRzV2l0aCgnPGJyPicpKSB7XHJcbiAgICAvLyAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudC5zbGljZSgwLCAtNCk7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gfVxyXG5cclxuICAgIHN0YXRpYyBzYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50LmlubmVySFRNTDtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzaG91bGRSZXN0b3JlQ2FyZXQgPSBmYWxzZTtcclxuICAgICAgICBsZXQgY2FyZXRQb3MgPSAwO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VFbmRzQXRDb250ZW50RW5kID0gcmFuZ2UuZW5kT2Zmc2V0ID09PSBlbGVtZW50LmlubmVyVGV4dC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBpZiAocmFuZ2VFbmRzQXRDb250ZW50RW5kICYmIGNvbnRlbnQuZW5kc1dpdGgoJzxicj4nKSkge1xyXG4gICAgICAgICAgICAgICAgc2hvdWxkUmVzdG9yZUNhcmV0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNhcmV0UG9zID0gcmFuZ2UuZW5kT2Zmc2V0OyAvLyBNYW50ZXIgYSBwb3Npw6fDo28gb3JpZ2luYWwgZG8gY2FyZXRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmVtb3ZlciA8YnI+IGZpbmFsLCBzZSBleGlzdGlyLCB1c2FuZG8gbWFuaXB1bGHDp8OjbyBkbyBET01cclxuICAgICAgICBpZiAoY29udGVudC5lbmRzV2l0aCgnPGJyPicpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGVsZW1lbnQubGFzdENoaWxkO1xyXG4gICAgICAgICAgICBpZiAobGFzdENoaWxkICYmIGxhc3RDaGlsZC5ub2RlTmFtZSA9PT0gJ0JSJykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChsYXN0Q2hpbGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkUmVzdG9yZUNhcmV0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gbmV3IFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHROb2RlcyA9IHRoaXMuZ2V0VGV4dE5vZGVzSW4oZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGxldCBjaGFyQ291bnQgPSAwO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXh0Tm9kZSBvZiB0ZXh0Tm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVMZW5ndGggPSB0ZXh0Tm9kZS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhckNvdW50ICsgbm9kZUxlbmd0aCA+PSBjYXJldFBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCBjYXJldFBvcyAtIGNoYXJDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKHRleHROb2RlLCBjYXJldFBvcyAtIGNoYXJDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnQgKz0gbm9kZUxlbmd0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUZXh0Tm9kZXNJbihub2RlOiBOb2RlKTogVGV4dFtdIHtcclxuICAgICAgICBsZXQgdGV4dE5vZGVzOiBUZXh0W10gPSBbXTtcclxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSBhcyBUZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGV4dE5vZGVzID0gdGV4dE5vZGVzLmNvbmNhdCh0aGlzLmdldFRleHROb2Rlc0luKGNoaWxkcmVuW2ldKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRleHROb2RlcztcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGFsbENvbnRlbnRFZGl0YWJsZXMuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxDb250ZW50RWRpdGFibGVzW2luZGV4IC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZXh0Q29udGVudEVkaXRhYmxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhbGxDb250ZW50RWRpdGFibGVzOiBIVE1MRWxlbWVudFtdID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpKSBhcyBIVE1MRWxlbWVudFtdO1xyXG5cclxuICAgICAgICBjb25zdCBpbmRleCA9IGFsbENvbnRlbnRFZGl0YWJsZXMuaW5kZXhPZihlbGVtZW50KTtcclxuICAgICAgICBpZiAoaW5kZXggPCBhbGxDb250ZW50RWRpdGFibGVzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFsbENvbnRlbnRFZGl0YWJsZXNbaW5kZXggKyAxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXRBY3RpdmVDb250ZW50RWRpdGFibGUoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gRE9NVXRpbHMuZmluZENvbnRlbnRFZGl0YWJsZUluRGVzY2VuZGFudHMoYWN0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGZpbmRDb250ZW50RWRpdGFibGVJbkRlc2NlbmRhbnRzKGVsZW1lbnQ6IEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGlmICgoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IGVsZW1lbnQuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IERPTVV0aWxzLmZpbmRDb250ZW50RWRpdGFibGVJbkRlc2NlbmRhbnRzKGNoaWxkKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2F2ZUNhcmV0UG9zaXRpb24yZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFySW5kZXggPSBBcnJheS5mcm9tKGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpLnNsaWNlKDAsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQpLmxlbmd0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgY2hhckluZGV4LCBob3Jpem9udGFsUG9zOiByZWN0LmxlZnQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgY2hhckluZGV4OiAwLCBob3Jpem9udGFsUG9zOiAwIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlc3RvcmVDYXJldFBvc2l0aW9uMmQoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xyXG4gICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE5vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUubm9kZVZhbHVlKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKHRlc3RSZWN0LmxlZnQgLSBwb3NpdGlvbi5ob3Jpem9udGFsUG9zKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3ROb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IGk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGNsb3NlIGVub3VnaCwgYnJlYWsgZWFybHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSA8IDUpIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChiZXN0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYmVzdE5vZGUsIGJlc3RPZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBzYXZlQ2FyZXRQb3NpdGlvbjNkKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogeyBjaGFySW5kZXg6IG51bWJlciwgaG9yaXpvbnRhbFBvczogbnVtYmVyLCB2ZXJ0aWNhbFBvczogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXJJbmRleCA9IEFycmF5LmZyb20oZWxlbWVudC50ZXh0Q29udGVudCB8fCAnJykuc2xpY2UoMCwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCkubGVuZ3RoO1xyXG4gICAgICAgICAgICByZXR1cm4geyBjaGFySW5kZXgsIGhvcml6b250YWxQb3M6IHJlY3QubGVmdCwgdmVydGljYWxQb3M6IHJlY3QudG9wIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGNoYXJJbmRleDogMCwgaG9yaXpvbnRhbFBvczogMCwgdmVydGljYWxQb3M6IDAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVzdG9yZUNhcmV0UG9zaXRpb24zZChlbGVtZW50OiBIVE1MRWxlbWVudCwgcG9zaXRpb246IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlbGVtZW50LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XHJcbiAgICAgICAgICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgICAgIGxldCBiZXN0Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgIGxldCBiZXN0T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmICghbm9kZS5ub2RlVmFsdWUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3RhbmNlID0gTWF0aC5hYnModGVzdFJlY3QubGVmdCAtIHBvc2l0aW9uLmhvcml6b250YWxQb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC50b3AgLSBwb3NpdGlvbi52ZXJ0aWNhbFBvcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IE1hdGguc3FydChob3Jpem9udGFsRGlzdGFuY2UgKiogMiArIHZlcnRpY2FsRGlzdGFuY2UgKiogMik7ICAvLyBVc2UgRXVjbGlkZWFuIGRpc3RhbmNlXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbERpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IHRvdGFsRGlzdGFuY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3ROb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IGk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGNsb3NlIGVub3VnaCwgYnJlYWsgZWFybHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsRGlzdGFuY2UgPCA1KSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYmVzdE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHN0YXRpYyBtZXJnZUFuZE5vcm1hbGl6ZUlubGluZUVsZW1lbnRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGVsZW1lbnQubm9ybWFsaXplKCk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IG1lcmdlSW5saW5lRWxlbWVudHMgPSAobm9kZTogQ2hpbGROb2RlKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIFsnU1BBTicsICdDT0RFJywgJ0VNJywgJ1NUUk9ORycsICdCJywgJ0knXS5pbmNsdWRlcyhjdXJyZW50Tm9kZS5ub2RlTmFtZSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBtZXJnZUlubGluZUVsZW1lbnRzKGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbGV0IG5leHROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHROb2RlICYmIG5leHROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBuZXh0Tm9kZS5ub2RlTmFtZSA9PT0gY3VycmVudE5vZGUubm9kZU5hbWUpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHROb2RlLmZpcnN0Q2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmFwcGVuZENoaWxkKG5leHROb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVUb1JlbW92ZSA9IG5leHROb2RlO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBub2RlVG9SZW1vdmUucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQobm9kZVRvUmVtb3ZlKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICB9XHJcbiAgICAvLyAgICAgfTtcclxuXHJcbiAgICAvLyAgICAgbWVyZ2VJbmxpbmVFbGVtZW50cyhlbGVtZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgbWVyZ2VJbmxpbmVFbGVtZW50cyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGVsZW1lbnQubm9ybWFsaXplKCk7ICAvLyBOb3JtYWxpemEgb3MgbsOzcyBkZSB0ZXh0byBwcmltZWlyb1xyXG5cclxuICAgICAgICBjb25zdCBjaGlsZHJlbjogTm9kZUxpc3RPZjxDaGlsZE5vZGU+ID0gZWxlbWVudC5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50ID0gY2hpbGRyZW5baV0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoWydTUEFOJywgJ0NPREUnLCAnRU0nLCAnU1RST05HJywgJ0InLCAnSSddLmluY2x1ZGVzKGNoaWxkRWxlbWVudC5ub2RlTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDEgJiYgY2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nICYmIGNoaWxkRWxlbWVudC5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGRFbGVtZW50Lm5vZGVOYW1lID09PSAoY2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KS5ub2RlTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQuYXBwZW5kQ2hpbGQoKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuZmlyc3RDaGlsZCEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGRFbGVtZW50Lm5leHRTaWJsaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMubWVyZ2VJbmxpbmVFbGVtZW50cyhjaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSAnLi9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudSc7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB9IGZyb20gJy4vc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvcic7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9idXR0b24tZ3JvdXAvQnV0dG9uR3JvdXAnO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tICdAL2NvbW1vbi9DdXN0b21FdmVudHMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tICdAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHMnO1xyXG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tICdAL2NvbW1vbi9aSW5kZXgnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgZHJvcGRvd25zOiBEcm9wZG93bk1lbnVbXTtcclxuICAgIHNlcGFyYXRvcnM6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcltdO1xyXG4gICAgY3VycmVudFNlbGVjdGlvblJhbmdlOiBSYW5nZSB8IG51bGw7XHJcbiAgICBodG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51OiBIVE1MRWxlbWVudCB8IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3ducyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9ycyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImZsb2F0aW5nLXRvb2xiYXJcIiwgXCJzZWxlY3Qtd3JhcHBlclwiLCBcInNvZnQtYm94LXNoYWRvd1wiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93KCk6IHZvaWQge1xyXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5mb2N1c2FibGVcIik7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZWxlY3Rpb24gZm91bmQnKTtcclxuICAgIC8vICAgICAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAvLyAgICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAvLyAgICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcblxyXG4gICAgLy8gICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuZmxvYXRpbmdUb29sYmFyRGlzcGxheWVkLCB7XHJcbiAgICAvLyAgICAgICAgIC8vICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgLy8gICAgICAgICAvLyAgICAgY2FuY2VsYWJsZTogdHJ1ZVxyXG4gICAgLy8gICAgICAgICAvLyB9KSk7XHJcbiAgICAvLyAgICAgfSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZERyb3Bkb3duKGRyb3Bkb3duOiBEcm9wZG93bk1lbnUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5wdXNoKGRyb3Bkb3duKVxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZEJ1dHRvbkdyb3VwKGJ1dHRvbkdyb3VwOiBCdXR0b25Hcm91cCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXAuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFNlcGFyYXRvcihzZXBhcmF0b3I6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9ycy5wdXNoKHNlcGFyYXRvcik7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChzZXBhcmF0b3IuaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFRleHRUb29sYmFyKGJ1dHRvbjogQnV0dG9uR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbi5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYW55RHJvcGRvd25WaXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAoY29uc3QgZHJvcGRvd24gb2YgdGhpcy5kcm9wZG93bnMpIHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Bkb3duIG9mIHRoaXMuZHJvcGRvd25zKSB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5kcm9wZG93bkxpc3QuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgZHJvcGRvd24uZHJvcGRvd25MaXN0LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpIHtcclxuXHJcbiAgICAgICAgLy8gUHJldmVudCBmb2N1cyBjaGFuZ2Ugd2hlbiBjbGlja2luZyBvbiB0aGlzIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUHJldmVudCBmb2N1cyBjaGFuZ2Ugd2hlbiBjbGlja2luZyBvbiB0aGlzIGVsZW1lbnRcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveEZpbmlzaGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jYW5IaWRlICYmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9IGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykpIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLmlzU2VsZWN0aW9uRW1wdHkoKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKChldmVudC5rZXkgPT09ICdFc2NhcGUnIHx8IGV2ZW50LmtleSA9PT0gJ0RlbGV0ZScpICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApICYmICF0aGlzLmFueURyb3Bkb3duVmlzaWJsZSgpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgfSBcclxuICAgICAgICAvLyAgICAgLy8gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApICYmICF0aGlzLmlucHV0TGlua0JveFdyYXBwZXIuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgLy8gICAgIC8vICAgICB0aGlzLnJlc3RvcmVSYW5nZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vICAgICAvLyB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrRGVsZXRlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuYmxvY2tUeXBlQ2hhbmdlZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpc1NlbGVjdGlvbkVtcHR5KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIHJldHVybiAhc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwIHx8IHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0oKSA9PT0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzdG9yZVJhbmdlU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UodGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UhKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbiIsImltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFuZ2VDb2xvciB7XHJcblxyXG4gICAgY29sb3I6IENvbG9ycztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb2xvcjogQ29sb3JzKSB7XHJcbiAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNob3dIaWRlQWN0aXZlQnV0dG9uIHtcclxuXHJcbiAgICBjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCI7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgaW50ZW50aW9uOiBcInNob3dcIiB8IFwiaGlkZVwiO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWU6IHN0cmluZywgaW50ZW50aW9uOiBcInNob3dcIiB8IFwiaGlkZVwiKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0tleSA9IGNsYXNzS2V5O1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmludGVudGlvbiA9IGludGVudGlvbjtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBSZXNldEFjdGl2ZUJ1dHRvbnMge1xyXG5cclxuICAgIGNsYXNzS2V5OiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCIpIHtcclxuICAgICAgICB0aGlzLmNsYXNzS2V5ID0gY2xhc3NLZXk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJVUlBY3Rpb24gfSBmcm9tIFwiLi9JVUlBY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDbG9zZUVsZW1lbnQgaW1wbGVtZW50cyBJVUlBY3Rpb24ge1xyXG5cclxufSIsImltcG9ydCB7IElVSUFjdGlvbiB9IGZyb20gXCIuL0lVSUFjdGlvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNob3dFbGVtZW50IGltcGxlbWVudHMgSVVJQWN0aW9uIHtcclxuXHJcbn0iLCJpbXBvcnQgeyBJVUlBY3Rpb24gfSBmcm9tIFwiLi9JVUlBY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSBpbXBsZW1lbnRzIElVSUFjdGlvbiB7XHJcblxyXG4gICAgbGFuZ3VhZ2U6IHN0cmluZztcclxuICAgIGJsb2NrSWQ6IHN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKGJsb2NrSWQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYmxvY2tJZCA9IGJsb2NrSWQ7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCIuL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIi4vSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ2hhbmdlQ29sb3IgfSBmcm9tIFwiLi9VSUFjdGlvbnMvQ2hhbmdlQ29sb3JcIjtcclxuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiLi9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgUmVzZXRBY3RpdmVCdXR0b25zIH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Jlc2V0QWN0aXZlQnV0dG9uc1wiO1xyXG5pbXBvcnQgeyBDbG9zZUVsZW1lbnQgfSBmcm9tIFwiLi9VSUFjdGlvbnMvQ2xvc2VFbGVtZW50XCI7XHJcbmltcG9ydCB7IFNob3dFbGVtZW50IH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Nob3dFbGVtZW50XCI7XHJcbmltcG9ydCB7IENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlIH0gZnJvbSBcIi4vVUlBY3Rpb25zL0NoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuXHJcblxyXG4gICAgc3RhdGljIGVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudCh0YXJnZXRDbGFzczogc3RyaW5nLCBibG9ja0lkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UoYmxvY2tJZCwgbGFuZ3VhZ2UpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRTaG93RWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLlNob3dFbGVtZW50LCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0VsZW1lbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENsb3NlRWxlbWVudEV2ZW50KHRhcmdldElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IENsb3NlRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZDogc3RyaW5nLCBjb2xvcjogQ29sb3JzKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb246IG5ldyBDaGFuZ2VDb2xvcihjb2xvcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KHRhcmdldENsYXNzOiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWU6IHN0cmluZywgaW50ZW5zaW9uOiBcInNob3dcIiB8IFwiaGlkZVwiKSB7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImhpbGl0ZUNvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSkge1xyXG4gICAgICAgICAgICBpbnRlbnNpb24gPSBcImhpZGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImZvcmVDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5Gb3JlQ29sb3JJbml0aWFsKSB7XHJcbiAgICAgICAgICAgIGludGVuc2lvbiA9IFwiaGlkZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRhcmdldENsYXNzID09IFwiYmFja2dyb3VuZENvbG9yXCIgJiYgdmFsdWUgPT0gQ29sb3JzLkJhY2tncm91bmRDb2xvck5vbmUpIHtcclxuICAgICAgICAgICAgaW50ZW5zaW9uID0gXCJoaWRlXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuU2hvd0hpZGVBY3RpdmVCdXR0b24sIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgU2hvd0hpZGVBY3RpdmVCdXR0b24odGFyZ2V0Q2xhc3MsIHZhbHVlLCBpbnRlbnNpb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQodGFyZ2V0Q2xhc3M6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5SZXNldEFjdGl2ZUJ1dHRvbnMsIHtcclxuXHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3M6IHRhcmdldENsYXNzLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgUmVzZXRBY3RpdmVCdXR0b25zKHRhcmdldENsYXNzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vVE9ETzogcmV3cml0ZSB0aGlzIGRvY1xyXG4gICAgLyoqXHJcbiAgICAqIEVtaXRzIGEgY3VzdG9tIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBzdGF0ZXMgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHRleHQgc2VsZWN0aW9uLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNydWNpYWwgaW4gYSB0ZXh0IGVkaXRpbmcgZW52aXJvbm1lbnQgd2hlcmUgbXVsdGlwbGUgY29tcG9uZW50cyBtaWdodCBuZWVkIHRvXHJcbiAgICAqIHVwZGF0ZSB0aGVpciBzdGF0ZSBiYXNlZCBvbiBjaGFuZ2VzIGluIHRleHQgZm9ybWF0dGluZy4gVGhlIGVtaXR0ZWQgZXZlbnQgKGBDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWRgKVxyXG4gICAgKiBjYXJyaWVzIGZvcm1hdHRpbmcgc3RhdGUgZGF0YSwgd2hpY2ggY29tcG9uZW50cyBjYW4gdXNlIHRvIHN5bmNocm9uaXplIHRoZWlyIFVJIGVsZW1lbnRzIHdpdGggdGhlXHJcbiAgICAqIGN1cnJlbnQgdGV4dCBmb3JtYXR0aW5nIChlLmcuLCB1cGRhdGluZyBidXR0b24gc3RhdGVzLCBkaXNwbGF5aW5nIGFjdGl2ZSBmb3JtYXR0aW5nIG9wdGlvbnMpLlxyXG4gICAgKlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGNoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiBleGl0cyBlYXJseSB0byBhdm9pZCBwcm9jZXNzaW5nIHVubmVjZXNzYXJ5IGV2ZW50cyxcclxuICAgICogZXNwZWNpYWxseSB0byBtaXRpZ2F0ZSBpc3N1ZXMgaW4gYnJvd3NlcnMgbGlrZSBGaXJlZm94IHdoZXJlIGBzZWxlY3Rpb25jaGFuZ2VgIG1pZ2h0IGZpcmUgZHVyaW5nIHR5cGluZ1xyXG4gICAgKiB3aXRob3V0IGFuIGFjdHVhbCBjaGFuZ2UgaW4gc2VsZWN0aW9uLlxyXG4gICAgKlxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlIGFzIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gZW1pdCBldmVudHMgYmFzZWQgb24gdGhlIGZvcm1hdHRpbmcgc3RhdGUuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIGludm9rZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiBhIGNsYXNzIHRoYXQgaGFuZGxlcyB0ZXh0IGZvcm1hdHRpbmc6XHJcbiAgICAqIHRoaXMuZW1pdEZvcm1hdENoYW5nZUV2ZW50cygpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogSGVyZSdzIGhvdyB0aGUgZnVuY3Rpb24gd29ya3M6XHJcbiAgICAqIDEuIENoZWNrcyBmb3IgYW4gYWN0aXZlIGFuZCBub24tZW1wdHkgdGV4dCBzZWxlY3Rpb24uIElmIGVtcHR5LCByZXR1cm5zIGVhcmx5LlxyXG4gICAgKiAyLiBHYXRoZXJzIGN1cnJlbnQgc3RhdGUgb2YgdGV4dCBmb3JtYXR0aW5nIGNvbW1hbmRzIHN1Y2ggYXMgJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsIGFuZCAnc3RyaWtlVGhyb3VnaCcsXHJcbiAgICAqICAgIGFuZCBkeW5hbWljYWxseSBjb2xsZWN0cyB0aGUgc3RhdGUgb2YgdmFyaW91cyBoaWdobGlnaHQgY29sb3JzIHVzaW5nIGEgc2VydmljZS5cclxuICAgICogMy4gRGlzcGF0Y2hlcyBhIGN1c3RvbSBldmVudCAoYEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZGApIHdpdGggdGhlc2UgZm9ybWF0dGluZyBzdGF0ZXMuXHJcbiAgICAqICAgIENvbXBvbmVudHMgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24gbGlzdGVuIHRvIHRoaXMgZXZlbnQgYW5kIHVwZGF0ZSB0aGVpciBzdGF0ZXMgYWNjb3JkaW5nbHksXHJcbiAgICAqICAgIGVuc3VyaW5nIHRoYXQgVUkgY29udHJvbHMgbGlrZSB0b29sYmFyIGJ1dHRvbnMgcmVmbGVjdCB0aGUgY3VycmVudCBmb3JtYXR0aW5nIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKi9cclxuICAgIC8vIHN0YXRpYyBlbWl0Rm9ybWF0Q2hhbmdlRXZlbnQgPSAoXHJcblxyXG4gICAgLy8gICAgIGJvbGQ6IGJvb2xlYW4sXHJcbiAgICAvLyAgICAgaXRhbGljOiBib29sZWFuLFxyXG4gICAgLy8gICAgIHVuZGVybGluZTogYm9vbGVhbixcclxuICAgIC8vICAgICBzdHJpa2VUaHJvdWdoOiBib29sZWFuLFxyXG4gICAgLy8gICAgIGhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ10gOiBib29sZWFuIH0sIFxyXG4gICAgLy8gICAgIGZvcmVDb2xvcjogeyBba2V5OiBzdHJpbmddIDogYm9vbGVhbn0pOiB2b2lkID0+IHtcclxuXHJcbiAgICAvLyAgICAgLy8gVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAvLyAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgIC8vICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgIC8vICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgLy8gICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbj8udG9TdHJpbmcoKS50cmltKCkgPT09ICcnKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbW1hbmRTdGF0ZXM6IElGb3JtYXRDb21tYW5kID0ge1xyXG4gICAgLy8gICAgICAgICBib2xkOiBib2xkLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGl0YWxpYyxcclxuICAgIC8vICAgICAgICAgdW5kZXJsaW5lOiB1bmRlcmxpbmUsXHJcbiAgICAvLyAgICAgICAgIHN0cmlrZVRocm91Z2g6IHN0cmlrZVRocm91Z2gsXHJcbiAgICAvLyAgICAgICAgIGhpbGl0ZUNvbG9yOiBoaWxpdGVDb2xvcixcclxuICAgIC8vICAgICAgICAgZm9yZUNvbG9yOiBmb3JlQ29sb3IsXHJcbiAgICAvLyAgICAgICAgIGNlbGxIaWxpdGVDb2xvcjoge31cclxuICAgIC8vICAgICB9O1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD4oQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCB7XHJcbiAgICAvLyAgICAgICAgIGRldGFpbDogY29tbWFuZFN0YXRlc1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudChzY29wZTogVGFibGVTY29wZXMsIGNvbG9yOiBDb2xvcnMpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuY2hhbmdlVGFibGVCb3JkZXJDb2xvcixcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBjb2xvcixcclxuICAgICAgICAgICAgICAgIHNjb3BlOiBzY29wZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgZW1pdENlbGxDaGFuZ2VFdmVudCA9IChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQgPT4ge1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjZWxsSGlsaXRlQ29sb3I6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcblxyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW5dID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgLy8gICAgIGNlbGxIaWxpdGVDb2xvcltDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yR3JleV0gPSBUYWJsZVV0aWxzLmlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY29tbWFuZFN0YXRlczogSUZvcm1hdENvbW1hbmQgPSB7XHJcbiAgICAvLyAgICAgICAgIGJvbGQ6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBpdGFsaWM6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICB1bmRlcmxpbmU6IGZhbHNlLFxyXG4gICAgLy8gICAgICAgICBzdHJpa2VUaHJvdWdoOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgaGlsaXRlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBmb3JlQ29sb3I6IHt9LFxyXG4gICAgLy8gICAgICAgICBjZWxsSGlsaXRlQ29sb3I6IGNlbGxIaWxpdGVDb2xvclxyXG4gICAgLy8gICAgIH07XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPihDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWQsIHtcclxuICAgIC8vICAgICAgICAgZGV0YWlsOiBjb21tYW5kU3RhdGVzXHJcbiAgICAvLyAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgLy8gfVxyXG5cclxufSIsImltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuL0Zsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tIFwiQC9jb21tb24vWkluZGV4XCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XHJcbmltcG9ydCB7IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcclxuaW1wb3J0IHsgS2V5Ym9hcmRLZXlzIH0gZnJvbSBcIkAvY29tbW9uL0tleWJvYXJkS2V5c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIGV4dGVuZHMgRmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHRleHRPcGVyYXRpb25zU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgaW5pdGlhbFJlY3Q6IERPTVJlY3QgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGxvY2tlZEhpZGUgPSBmYWxzZTtcclxuICAgIGRlYm91bmNlVGltZXI6IGFueSA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcih0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgaWYgKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4LlZlcnlJbXBvcnRhbnQ7XHJcbiAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UgPSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUZXh0T3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRleHRPcGVyYXRpb25zU2VydmljZVwiKTs7XHJcblxyXG4gICAgICAgIGlmICghVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2UgPSBuZXcgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIodGV4dE9wZXJhdGlvbnNTZXJ2aWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpIHtcclxuXHJcbiAgICAgICAgLy9UaGlzIGJsb2NrIGNoZWNrcyBmb3IgYW4gYWN0aXZlIHNlbGVjdGlvbiBhbmQgd2hldGhlciBpdCBjb250YWlucyBhbnkgY29udGVudC5cclxuICAgICAgICAvLyBJbiBGaXJlZm94LCB0aGUgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnQgbWF5IGJlIGZpcmVkIGV2ZW4gd2hpbGUgdHlwaW5nLFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIG5vdCB0aGUgaW50ZW5kZWQgdHJpZ2dlciBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gcmVhY3QgdG8gYWN0dWFsIGNoYW5nZXMgaW4gc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgb3IgbnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWFybHksIGVmZmVjdGl2ZWx5IGlnbm9yaW5nXHJcbiAgICAgICAgLy8gdGhlc2UgdW53YW50ZWQgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnRzIGR1cmluZyB0eXBpbmcuXHJcbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgLy8gaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLmlzQ29sbGFwc2VkIHx8IHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0ubGVuZ3RoID09IDApIHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBjb25zdCB0eHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0eHQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIik7XHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaXNMaW5rOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ2NyZWF0ZUxpbmsnKTtcclxuICAgICAgICAgICAgY29uc3QgaXNCb2xkOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ2JvbGQnKTtcclxuICAgICAgICAgICAgY29uc3QgaXNJdGFsaWM6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSgnaXRhbGljJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVW5kZXJsaW5lOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ3VuZGVybGluZScpO1xyXG4gICAgICAgICAgICBjb25zdCBpc0lubGluZUNvZGU6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZShcImlubGluZUNvZGVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU3RyaWtlVGhyb3VnaDogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdHJpa2VUaHJvdWdoJyk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBoaWxpdGVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JSZWRdID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW5dID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbik7XHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSk7XHJcbiAgICAgICAgICAgIGhpbGl0ZUNvbG9yc1tDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3ddID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yR3JleV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZm9yZUNvbG9yczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yUmVkXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JSZWQpO1xyXG4gICAgICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JHcmVlbl0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JCbHVlXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yWWVsbG93XSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgICAgICBmb3JlQ29sb3JzW0NvbG9ycy5Gb3JlQ29sb3JHcmV5XSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Rm9yZUNvbG9yKENvbG9ycy5Gb3JlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGhpbGl0ZUNvbG9ycykuZm9yRWFjaCgoW2NvbG9yLCBhY3RpdmVdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIGNvbG9yLCBcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZm9yZUNvbG9ycykuZm9yRWFjaCgoW2NvbG9yLCBhY3RpdmVdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImZvcmVDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNMaW5rLCBCdXR0b25JRHMuTGluayk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNCb2xkLCBCdXR0b25JRHMuQm9sZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNJdGFsaWMsIEJ1dHRvbklEcy5JdGFsaWMpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzSW5saW5lQ29kZSwgQnV0dG9uSURzLklubGluZUNvZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzVW5kZXJsaW5lLCBCdXR0b25JRHMuVW5kZXJsaW5lKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1N0cmlrZVRocm91Z2gsIEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoKTtcclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChhY3RpdmU6IGJvb2xlYW4sIHRhcmdldElkOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoYWN0aXZlKSB7XHJcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudCh0YXJnZXRJZCwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQodGFyZ2V0SWQsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc0FmdGVyQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0NvbGxhcHNlZCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBkZWJvdW5jZVRpbWVyOiBhbnk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2V1cCwgKGV2ZW50KSA9PiB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZXVwLCB0aGlzLnByb2Nlc3NBZnRlckNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CYmxDbGljaywgdGhpcy5wcm9jZXNzQWZ0ZXJDaGFuZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuU2VsZWN0aW9uQ2hhbmdlLCB0aGlzLnByb2Nlc3NBZnRlckNoYW5nZS5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLlNoaWZ0KSB7XHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93SGlkZShldmVudCwgaXNTZWxlY3RpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZG93biwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpc1NlbGVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dIaWRlKGV2ZW50LCBpc1NlbGVjdGluZyk7XHJcblxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcik7XHJcbiAgICAgICAgICAgIGRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIaWRlKGV2ZW50LCBpc1NlbGVjdGluZyk7XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLlNlbGVjdGlvbkNoYW5nZSwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGUoZXZlbnQsIGlzU2VsZWN0aW5nKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkVzY2FwZSkgJiYgIXRoaXMubG9ja2VkSGlkZSkge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYW55RHJvcGRvd25WaXNpYmxlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHN1cGVyLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZFVwZGF0ZVBvc2l0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50UmVjdCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5pbml0aWFsUmVjdCkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uQ2hhbmdlZCA9IE1hdGguYWJzKGN1cnJlbnRSZWN0LmxlZnQgLSB0aGlzLmluaXRpYWxSZWN0LmxlZnQpID4gMTAgfHwgTWF0aC5hYnMoY3VycmVudFJlY3QudG9wIC0gdGhpcy5pbml0aWFsUmVjdC50b3ApID4gMTA7XHJcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uQ2hhbmdlZDtcclxuICAgIH1cclxuXHJcbiAgICBzaG93SGlkZShldmVudDogRXZlbnQsIGlzU2VsZWN0aW5nOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIC8vVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG5cclxuICAgICAgICBjb25zdCBoYXNDb250ZW50ID0gdGhpcy5oYXNTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFoYXNDb250ZW50KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sb2NrZWRIaWRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxSZWN0ID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29udGVudCAmJiAhaXNTZWxlY3RpbmcpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlnbm9yZUZsb2F0aW5nVG9vbGJhciA9IERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLmlnbm9yZS10ZXh0LWZsb2F0aW5nLXRvb2xiYXJcIikgfHwgRE9NVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIuZ2lzdFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZ25vcmVGbG9hdGluZ1Rvb2xiYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZFVwZGF0ZVBvc2l0aW9uKCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZ25vcmVGbG9hdGluZ1Rvb2xiYXIgPSBET01VdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi5naXN0XCIpIHx8IERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLmdpc3RcIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWdub3JlRmxvYXRpbmdUb29sYmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGV4dCAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHJlY3RzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZWN0cyBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaXJzdFJlY3QgPSByZWN0c1swXTtcclxuXHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RMZWZ0ID0gZmlyc3RSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RUb3AgPSBmaXJzdFJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0Qm90dG9tID0gZmlyc3RSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSBjX2ZpcnN0UmVjdExlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdFRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gY19maXJzdFJlY3RCb3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoRE9NVXRpbHMuZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoXCJ0aXRsZVwiKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG9TZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLmhpZGVUdXJuSW50b0Ryb3Bkb3duSWZJbkNlbGwoKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzQ2VsbCA9IERPTVV0aWxzLmlzU2VsZWN0aW9uSW5UYWJsZUNlbGwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMuZm9yRWFjaChkcm9wZG93biA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5pZCA9PSBcInR1cm5JbnRvTWVudVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5kaXNwbGF5O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9ycy5mb3JFYWNoKHNlcGFyYXRvciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZXBhcmF0b3IuaWQgPT0gXCJ0dXJuSW50b1NlcGFyYXRvclwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJlY3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRQb3NpdGlvbihyZWN0OiBET01SZWN0KSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcclxuXHJcbiAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsb2NrSGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2tlZEhpZGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja0hpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2NrZWRIaWRlID0gZmFsc2U7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJbnB1dExpbmtCb3hXcmFwcGVyIH0gZnJvbSBcIi4vSW5wdXRMaW5rQm94V3JhcHBlclwiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwYXJlbnRXcmFwcGVyPzogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcih7fSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hJbnB1dFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnR5cGUgPSBcInVybFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnBsYWNlaG9sZGVyID0gXCJQYXN0ZSBvciB0eXBlIGEgbGluay4uLlwiO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudFdyYXBwZXIocGFyZW50V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50V3JhcHBlciA9IHBhcmVudFdyYXBwZXI7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveCB9IGZyb20gXCIuL0lucHV0TGlua0JveFwiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRMaW5rQm94V3JhcHBlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW5wdXRMaW5rQm94OiBJbnB1dExpbmtCb3g7XHJcbiAgICBoaWdobGlnaHRzOiBIVE1MRGl2RWxlbWVudFtdID0gW107XHJcbiAgICBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xyXG5cclxuICAgIHRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBjb25zdCBpbnB1dExpbmtCb3ggPSBuZXcgSW5wdXRMaW5rQm94KCk7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3g6IGlucHV0TGlua0JveCxcclxuICAgICAgICAgICAgYnV0dG9uOiBidXR0b25cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IFwibGlua0JveFwiO1xyXG4gICAgICAgIHRoaXMuaW5wdXRMaW5rQm94ID0gaW5wdXRMaW5rQm94O1xyXG4gICAgICAgIHRoaXMuYnV0dG9uID0gYnV0dG9uO1xyXG4gICAgICAgIGlucHV0TGlua0JveC5zZXRQYXJlbnRXcmFwcGVyKHRoaXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyID0gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSBcImxpbmtCb3hcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImRlcGVuZGVudC1ib3hcIiwgXCJzb2Z0LWJveC1zaGFkb3dcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC5hZGQoXCJoZWFkZXJcIik7XHJcbiAgICAgICAgaGVhZGVyLmlubmVyVGV4dCA9IFwiTGlua1wiO1xyXG5cclxuICAgICAgICBjb25zdCBzaGVsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgc2hlbGwuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIHNoZWxsLmNsYXNzTGlzdC5hZGQoXCJsaW5rLWJveC1zaGVsbFwiKVxyXG5cclxuICAgICAgICAvLyBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG5cclxuICAgICAgICB0aGlzLnByb3BzLmJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5idXR0b24uaW5uZXJIVE1MID0gXCJJbnNlcnRcIjtcclxuXHJcbiAgICAgICAgc2hlbGwuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5idXR0b24pO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoZWFkZXIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNoZWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuRXNjYXBlKSkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRydWUpO1xyXG5cclxuICAgICAgICAvLyBDaGFuZ2UgdGhlIGN1cnNvciB3aGVuIHRoZSBDb250cm9sIGtleSBpcyBwcmVzc2VkIGFuZCB0aGUgbW91c2UgaG92ZXJzIG92ZXIgYSBsaW5rLlxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuQ29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdjdHJsLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHJlbW92ZSBjaGFuZ2UgdGhlIGN1cnNvciB3aGVuIHRoZSBDb250cm9sIGtleSBpcyBub3QgcHJlc3NlZCBhbmQgdGhlIG1vdXNlIGhvdmVycyBvdmVyIGEgbGluay5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXl1cCwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2N0cmwtYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNob3dJbnB1dExpbmtCb3hSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAvLyAgICAgLy8gdGhpcy5oaWdobGlnaHRTZWxlY3RlZFRleHQoKTtcclxuICAgICAgICAvLyAgICAgdGhpcy5pbnB1dExpbmtCb3guZm9jdXMoKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydExpbmsoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnQScgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHJlZiA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSE7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGhyZWYsICdfYmxhbmsnKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCcjbGlua0JveCcpICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIiN0ZXh0RmxvYXRpbmdUb29sYmFyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaW5zZXJ0TGluay5iaW5kKHRoaXMpLCB0cnVlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaGFuZGxlU2hvd0VsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPjtcclxuICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBpZiAoZGV0YWlscy50YXJnZXRJZCA9PSB0aGlzLmlkICYmICF0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkZXRhaWxzLnRhcmdldElkID09IHRoaXMuaWQgJiYgdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbnNlcnRMaW5rKGV2ZW50OiBFdmVudCkge1xyXG5cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICBjb25zdCB1cmwgPSAodGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcbiAgICAgICAgY29uc3QgdXJsV2l0aFByb3RvY29sID0gdXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSA/IHVybCA6IGBodHRwczovLyR7dXJsfWA7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBVdGlscy5pc1ZhbGlkVXJsKHVybFdpdGhQcm90b2NvbCk7XHJcblxyXG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5saW5rUmVhZHlUb0luc2VydCxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdXJsV2l0aFByb3RvY29sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYigyNTMsIDIyMiwgMjIyKVwiO1xyXG4gICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QuYWRkKFwic2hha2UtYW5pbWF0aW9uXCIpO1xyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QucmVtb3ZlKFwic2hha2UtYW5pbWF0aW9uXCIpO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5sb2NrSGlkZSgpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBpZiAoIXJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9zaXRpb25MaW5rQ29tcG9uZW50QmVsb3dTZWxlY3Rpb24ocmFuZ2UpO1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0U2VsZWN0ZWRUZXh0KHJhbmdlKTtcclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9zaXRpb25MaW5rQ29tcG9uZW50QmVsb3dTZWxlY3Rpb24ocmFuZ2U6IFJhbmdlKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlY3RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyByZWN0cyBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaXJzdFJlY3QgPSByZWN0c1swXTtcclxuXHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RMZWZ0ID0gZmlyc3RSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RUb3AgPSBmaXJzdFJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0Qm90dG9tID0gZmlyc3RSZWN0LmJvdHRvbTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSBjX2ZpcnN0UmVjdExlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdFRvcCArIHdpbmRvdy5zY3JvbGxZICsgNDA7XHJcblxyXG4gICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdEJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLnVubG9ja0hpZGUoKTtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVIaWdobGlnaHRzKCk7XHJcbiAgICAgICAgKHRoaXMuaW5wdXRMaW5rQm94Lmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gXCJcIjtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmN1cnJlbnRTZWxlY3Rpb25SYW5nZTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRTZWxlY3RlZFRleHQocmFuZ2U6IFJhbmdlKSB7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IGAke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNjMmMyYzInO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUub3BhY2l0eSA9ICcwLjMnO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodHMucHVzaChoaWdobGlnaHQpO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMCwgMTIwLCAyMTUsIDAuMyknO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuXHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWX1weGA7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIaWdobGlnaHRzKCkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5mb3JFYWNoKGhpZ2hsaWdodCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaGlnaGxpZ2h0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodHMgPSBbXTtcclxuICAgIH1cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb250ZW50IH0gZnJvbSBcIi4uL2NvbnRlbnQvQ29udGVudFwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCIuLi90aXRsZS9UaXRsZVwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgQWRkQmxvY2tXcmFwcGVyIH0gZnJvbSBcIi4uL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiLi4vbWVkaWEtaW5wdXR0ZXIvTWVkaWFJbnB1dHRlclwiO1xyXG5pbXBvcnQgeyBJbnB1dExpbmtCb3hXcmFwcGVyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94V3JhcHBlclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRvciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBlZGl0b3JJZDogc3RyaW5nID0gXCJqb2hhbm5lc0VkaXRvclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVkaXRvcjtcclxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XHJcblxyXG4gICAgcHJpdmF0ZSB0aXRsZT86IFRpdGxlO1xyXG4gICAgcHJpdmF0ZSBjb250ZW50PzogQ29udGVudDtcclxuICAgIHByaXZhdGUgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcjtcclxuICAgIHByaXZhdGUgdGV4dEZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIHF1aWNrTWVudTogUXVpY2tNZW51O1xyXG4gICAgcHJpdmF0ZSB0YWJsZUNvbnRleHRUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICBwcml2YXRlIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXI7XHJcbiAgICBwcml2YXRlIGlucHV0TGlua0JveFdyYXBwZXI6IElucHV0TGlua0JveFdyYXBwZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgbWVtZW50bzogSU1lbWVudG8sXHJcbiAgICAgICAgdGl0bGU6IFRpdGxlLFxyXG4gICAgICAgIGNvbnRlbnQ6IENvbnRlbnQsXHJcbiAgICAgICAgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcixcclxuICAgICAgICBmbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIHF1aWNrTWVudTogUXVpY2tNZW51LFxyXG4gICAgICAgIHRhYmxlVG9vbGJhcjogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXIsXHJcbiAgICAgICAgaW5wdXRMaW5rQm94V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlclxyXG4gICAgKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgZWxlbWVudEZhY3RvcnlTZXJ2aWNlOiBlbGVtZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICAgICAgICAgIGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCxcclxuICAgICAgICAgICAgYWRkQmxvY2s6IGFkZEJsb2NrLFxyXG4gICAgICAgICAgICBmbG9hdGluZ1Rvb2xiYXI6IGZsb2F0aW5nVG9vbGJhcixcclxuICAgICAgICAgICAgcXVpY2tNZW51OiBxdWlja01lbnUsXHJcbiAgICAgICAgICAgIHRhYmxlVG9vbGJhcjogdGFibGVUb29sYmFyLFxyXG4gICAgICAgICAgICBtZWRpYUlucHV0dGVyOiBtZWRpYUlucHV0dGVyLFxyXG4gICAgICAgICAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBpbnB1dExpbmtCb3hXcmFwcGVyXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChFZGl0b3IuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dExpbmtCb3hXcmFwcGVyID0gaW5wdXRMaW5rQm94V3JhcHBlcjtcclxuICAgICAgICB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZSA9IGVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xyXG4gICAgICAgIHRoaXMuYWRkQmxvY2sgPSBhZGRCbG9jaztcclxuICAgICAgICB0aGlzLnRleHRGbG9hdGluZ1Rvb2xiYXIgPSBmbG9hdGluZ1Rvb2xiYXI7XHJcbiAgICAgICAgdGhpcy5xdWlja01lbnUgPSBxdWlja01lbnU7XHJcbiAgICAgICAgdGhpcy50YWJsZUNvbnRleHRUb29sYmFyID0gdGFibGVUb29sYmFyO1xyXG4gICAgICAgIHRoaXMubWVkaWFJbnB1dHRlciA9IG1lZGlhSW5wdXR0ZXI7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1lZGl0b3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBjb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY29udGVudC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uZW5hYmxlVGl0bGUgfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb250ZW50V3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENvbnRlbnQgaXMgcmVxdWlyZWRcclxuICAgICAgICBjb250ZW50V3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmNvbnRlbnQuaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChjb250ZW50V3JhcHBlcik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVBZGRCbG9jayB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYWRkQmxvY2suaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUZsb2F0aW5nVG9vbGJhciB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuZmxvYXRpbmdUb29sYmFyLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVRdWlja01lbnUgfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnF1aWNrTWVudS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRhYmxlVG9vbGJhci5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5tZWRpYUlucHV0dGVyLmh0bWxFbGVtZW50KTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmlucHV0TGlua0JveFdyYXBwZXIuaHRtbEVsZW1lbnQpXHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoXHJcbiAgICAgICAgdGl0bGU6IFRpdGxlLFxyXG4gICAgICAgIGNvbnRlbnQ6IENvbnRlbnQsXHJcbiAgICAgICAgYWRkQmxvY2s6IEFkZEJsb2NrV3JhcHBlcixcclxuICAgICAgICB0ZXh0RmxvYXRpbmdUb29sYmFyOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcixcclxuICAgICAgICBxdWlja01lbnU6IFF1aWNrTWVudSxcclxuICAgICAgICB0YWJsZUZsb2F0aW5nVG9vbGJhcjogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgIG1lZGlhSW5wdXR0ZXI6IE1lZGlhSW5wdXR0ZXIpIHtcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElFbGVtZW50RmFjdG9yeVNlcnZpY2U+KFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiKTtcclxuICAgICAgICBjb25zdCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlPihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IG1lbWVudG8gPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SU1lbWVudG8+KFwiSU1lbWVudG9cIik7XHJcbiAgICAgICAgY29uc3QgaW5wdXRMaW5rQm94V3JhcHBlciA9IG5ldyBJbnB1dExpbmtCb3hXcmFwcGVyKCk7XHJcblxyXG4gICAgICAgIGlmICghRWRpdG9yLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIEVkaXRvci5pbnN0YW5jZSA9IG5ldyBFZGl0b3IoZWxlbWVudEZhY3RvcnlTZXJ2aWNlLCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBtZW1lbnRvLCB0aXRsZSwgY29udGVudCwgYWRkQmxvY2ssIHRleHRGbG9hdGluZ1Rvb2xiYXIsIHF1aWNrTWVudSwgdGFibGVGbG9hdGluZ1Rvb2xiYXIsIG1lZGlhSW5wdXR0ZXIsIGlucHV0TGlua0JveFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEVkaXRvci5pbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVkaXRvci5lZGl0b3JJZCk7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lcj8uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0YXJnZXQgYXMgTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmREcmFnSGFuZGxlcihibG9ja0VsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnQgdGFyZ2V0IGlzIG5vdCBhbiBIVE1MRWxlbWVudCBhbmQgY2Fubm90IGhhbmRsZSBIVE1MRWxlbWVudCBzcGVjaWZpYyBtZXRob2RzOicsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnQgdGFyZ2V0IGlzIG5vdCBhIE5vZGU6JywgdGFyZ2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvL0ZvY3VzIG9uIHRoZSBmaXJzdCBwYXJhZ3JhcGhcclxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgPiAuY29udGVudCAuYmxvY2sgcFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdFBhcmFncmFwaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0UGFyYWdyYXBoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFyYWdyYXBoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciA+IC5jb250ZW50IC5ibG9jayBwXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgIGZpcnN0UGFyYWdyYXBoLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZnVuY3Rpb24gKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsaXBib2FyZERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIEVkaXRvci5pbnNlcnRUZXh0QXRDdXJzb3IodGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0cnVlKTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRHJhZ0hhbmRsZXIoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGluc2VydFRleHRBdEN1cnNvcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgaWYgKHNlbC5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGV4dE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIodGV4dE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmREcmFnSGFuZGxlcihlbGVtZW50OiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGFuIEhUTUxFbGVtZW50OicsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG4gICAgICAgIGxldCBkcmFnSGFuZGxlciA9IHBhcmVudD8ucXVlcnlTZWxlY3RvcihcIi5kcmFnLWhhbmRsZXJcIik7XHJcblxyXG4gICAgICAgIGlmICghZHJhZ0hhbmRsZXIgJiYgcGFyZW50KSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVyID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkRSQUdfSEFORExFX0JVVFRPTik7XHJcbiAgICAgICAgICAgIHBhcmVudC5wcmVwZW5kKGRyYWdIYW5kbGVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRHJhZ0hhbmRsZXIoZWxlbWVudDogTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm92aWRlZCBlbGVtZW50IGlzIG5vdCBhbiBIVE1MRWxlbWVudDonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyYWdIYW5kbGVyID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuZHJhZy1oYW5kbGVyXCIpO1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlcj8ucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RDb250ZW50KCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCBFeGNlcHRpb25cIik7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBhdHRhY2hEcmFnSGFuZGxlcigpIHtcclxuICAgICAgICBsZXQgZHJhZ2dlZEl0ZW06IGFueSA9IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBkcm9wTGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyb3BMaW5lLmNsYXNzTGlzdC5hZGQoJ2Ryb3AtbGluZScpO1xyXG4gICAgICAgIGRyb3BMaW5lLnN0eWxlLmhlaWdodCA9ICcycHgnO1xyXG4gICAgICAgIGRyb3BMaW5lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkcmFnLWhhbmRsZXInKSkge1xyXG4gICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0gPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnN0eWxlLm9wYWNpdHkgPSAnMC41JztcclxuICAgICAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZHJhZ2dlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zdHlsZS5vcGFjaXR5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTtcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkcm9wTGluZS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IChldmVudC50YXJnZXQgYXMgRWxlbWVudCk/LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQgIT09IGRyYWdnZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYm91bmRpbmcgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gYm91bmRpbmcueSArIGJvdW5kaW5nLmhlaWdodCAvIDI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChldmVudCBhcyBNb3VzZUV2ZW50KS5jbGllbnRZID4gb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcgIT09IGRyb3BMaW5lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgZHJvcExpbmUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICE9PSBkcm9wTGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdiZWZvcmViZWdpbicsIGRyb3BMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRyb3BMaW5lLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgaWYgKGRyYWdnZWRJdGVtICYmIGRyb3BMaW5lICYmIGRyb3BMaW5lLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGRyb3BMaW5lLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGRyYWdnZWRJdGVtLCBkcm9wTGluZSk7XHJcbiAgICAgICAgICAgICAgICBkcm9wTGluZS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkZEJsb2NrQnV0dG9uIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uOiBTVkdJY29uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBpY29uOiBTVkdJY29uKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWNvbjogaWNvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRpdGxlID0gXCJBZGQgYSBuZXcgYmxvY2tcIjtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImFkZC1ibG9ja1wiLCBcImJsb2NrLW9wZXJhdGlvblwiLCBcInBvaW50ZXJcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuaWNvbi5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETzogVXNlIGNvbW1hbmQgZGlzcGF0Y2hlclxyXG4gICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrLCBmYWxzZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNyZWF0ZShpY29uOiBTVkdJY29uKTogQWRkQmxvY2tCdXR0b24ge1xyXG5cclxuICAgICAgICBjb25zdCBibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlPihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEFkZEJsb2NrQnV0dG9uKGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UsIGljb24pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiLi9BZGRCbG9ja0J1dHRvblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFkZEJsb2NrV3JhcHBlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBidXR0b246IEFkZEJsb2NrQnV0dG9uO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoYnV0dG9uOiBBZGRCbG9ja0J1dHRvbikge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGJ1dHRvbjogYnV0dG9uXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuYnV0dG9uID0gYnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhZGQtYmxvY2std3JhcHBlclwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5idXR0b24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNyZWF0ZShidXR0b246IEFkZEJsb2NrQnV0dG9uKTogQWRkQmxvY2tXcmFwcGVyIHtcclxuICAgICAgICByZXR1cm4gbmV3IEFkZEJsb2NrV3JhcHBlcihidXR0b24pO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIFNpemVzIHtcclxuICAgIFxyXG4gICAgc3RhdGljIG1lZGl1bTogc3RyaW5nID0gXCIxcmVtXCI7XHJcbiAgICBzdGF0aWMgbGFyZ2U6IHN0cmluZyA9IFwiMS4yNXJlbVwiO1xyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU1ZHSWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgdXNlRWxlbWVudDogU1ZHVXNlRWxlbWVudDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpY29uSWQ6IHN0cmluZywgc2l6ZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWQsXHJcbiAgICAgICAgICAgIHNpemU6IHNpemVcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLnVzZUVsZW1lbnQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VzZScpIGFzIFNWR1VzZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWQgIWltcG9ydGFudFwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaWNvbklkfWApO1xyXG5cclxuICAgICAgICB1c2Uuc3R5bGUuY29sb3IgPSBcInJlZCAhaW1wb3J0YW50XCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHVzZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMucHJvcHMuc2l6ZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLnByb3BzLnNpemUpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogU1ZHSWNvbiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCB0aGlzLnByb3BzLnNpemVzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VUbyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3ZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbihpY29uSWQsIHNpemUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvblwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuXHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWRkQmxvY2tCdWlsZGVyIHtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBidWlsZCgpOiBBZGRCbG9ja1dyYXBwZXIge1xyXG4gICAgICAgIHJldHVybiBBZGRCbG9ja1dyYXBwZXIuY3JlYXRlKEFkZEJsb2NrQnV0dG9uLmNyZWF0ZShTVkdJY29uLmNyZWF0ZShJY29ucy5QbHVzLCBTaXplcy5tZWRpdW0pKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICBkcm9wZG93bkJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uO1xyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uLCBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3QpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuXHJcblxyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRUbyh0aGlzKTtcclxuICAgICAgICBkcm9wZG93bkxpc3QuYXBwZW5kVG8odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNlbGVjdC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUocHJlZml4SWQ6IHN0cmluZywgYnV0dG9uOiBEcm9wZG93bk1lbnVCdXR0b24sIGxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnUge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyb3Bkb3duTWVudShwcmVmaXhJZCArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgYnV0dG9uLCBsaXN0KTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3RJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSWNvbj86IFNWR0ljb247XHJcbiAgICBwcml2YXRlIGxlZnRJY29uPzogU1ZHRWxlbWVudCB8IEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzRnVuY3Rpb25MaXN0OiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBvbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdDogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuXHJcbiAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdCxcclxuICAgICAgICBjb21tYW5kOiBzdHJpbmcsXHJcbiAgICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgbGVmdEljb246IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCB8IG51bGwsXHJcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICBzaG9ydGN1dDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gW1wibGlzdC1pdGVtXCIsIFwib3B0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIsIFwiYmxvY2stb3BlcmF0aW9uXCIsIFwibm8tbGlzdC1zdHlsZVwiLCBcIm5vLXNlbGVjdGlvblwiXTtcclxuXHJcbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1zbWFsbC1jaGVja1wiLCBTaXplcy5tZWRpdW0pO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiBsZWZ0SWNvbikge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxyXG4gICAgICAgICAgICBsZWZ0SWNvbjogbGVmdEljb24sXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgc2hvcnRjdXQ6IHNob3J0Y3V0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IGNsYXNzTGlzdDtcclxuICAgICAgICB0aGlzLmxlZnRJY29uID0gbGVmdEljb247XHJcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJY29uID0gaWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaChmdW5jKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBhZGRDbGFzcyhjbGFzc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QucHVzaChjbGFzc0tleSk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkZvY3VzPFQgZXh0ZW5kcyBhbnlbXT4oZnVuYzogKC4uLmFyZ3M6IFQpID0+IHZvaWQsIC4uLmFyZ3M6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaCgoKSA9PiBmdW5jKC4uLmFyZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkxvc2VGb2N1czxUIGV4dGVuZHMgYW55W10+KGZ1bmM6ICguLi5hcmdzOiBUKSA9PiB2b2lkLCAuLi5hcmdzOiBUKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKCgpID0+IGZ1bmMoLi4uYXJncykpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICAgICAgdGhpcy5vbkZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMucHJvcHMuY2xhc3NMaXN0IGFzIHN0cmluZ1tdO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJwb2ludGVyXCIsIC4uLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5sZWZ0SWNvbikge1xyXG4gICAgICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHNwYW4pO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0T3B0aW9uKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmljb24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG9ydGN1dCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG9ydEN1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5pbm5lclRleHQgPSB0aGlzLnByb3BzLnNob3J0Y3V0O1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjUpXCJcclxuXHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNob3J0Q3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAoIERPTVV0aWxzLmdldFBhcmVudEZyb21TZWxlY3Rpb24oXCIuYmxvY2tcIikgfHwgRE9NVXRpbHMuZ2V0UGFyZW50VGFyZ2V0QnlTZWxlY3RvcihldmVudCBhcyBNb3VzZUV2ZW50LCBcIi5ibG9ja1wiKSApIGFzIEhUTUxIdG1sRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAvLyAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmIChjb250YWluZXI/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGZvY3VzYWJsZVBhcmVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGZvY3VzYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIGFzeW5jICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiA9IHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5kcm9wZG93bkl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93bk1lbnVMaXN0LnN3aXRjaFZpc3VhbEZvY3VzKG5vZGUhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdoaWxpdGVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgYmFja2dyb3VuZCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5oaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmZvcmVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmNlbGxIaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy50YWJsZUNlbGxDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb2xvciB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgJ2NvcmVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgY29sb3IuXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmIChzdGF0ZXMuY2VsbEhpbGl0ZUNvbG9yW3RoaXMudmFsdWVdKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB7IGNvbW1hbmQsIHNob3dVSSwgdmFsdWUsIHRhcmdldEJsb2NrVHlwZSB9ID0gZXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUNoZWNrSWNvblZpc2liaWxpdHkoKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29sb3JDaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiB8fFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwgdGhpcy5oYW5kbGVDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZUV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0Q2xhc3MgJiYgZGV0YWlscy50YXJnZXRDbGFzcy5pbmNsdWRlcyhcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiKSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRWYWx1ZXMgPSAoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoYCMke2V2ZW50VmFsdWVzLmJsb2NrSWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSA9PSBldmVudFZhbHVlcy5sYW5ndWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGxldCBjaGlsZCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGNoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2hpbGQubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChuZXh0U2libGluZyAmJiB0aGlzLnNob3VsZE1lcmdlKGNoaWxkLCBuZXh0U2libGluZykpIHtcclxuICAgIC8vICAgICAgICAgICAgIChjaGlsZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MICs9IChuZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0O1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgZWxlbWVudC5ub3JtYWxpemUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzaG91bGRNZXJnZShub2RlMTogQ2hpbGROb2RlLCBub2RlMjogQ2hpbGROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUxPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZTI/Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IGVsZW0xID0gbm9kZTEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgY29uc3QgZWxlbTIgPSBub2RlMiBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICByZXR1cm4gZWxlbTEudGFnTmFtZSA9PT0gZWxlbTIudGFnTmFtZSAmJlxyXG4gICAgLy8gICAgICAgICBlbGVtMS5zdHlsZS5jc3NUZXh0ID09PSBlbGVtMi5zdHlsZS5jc3NUZXh0ICYmXHJcbiAgICAvLyAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0xKS5jb2xvciA9PT0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbTIpLmNvbG9yO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBhc3luYyBjaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYXdhaXQgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcXVlcnkgY29tbWFuZCBzdGF0ZTpcIiwgZXJyb3IpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93SGlkZUFjdGl2ZUJ1dHRvbiwgdGhpcy5oYW5kbGVTaG93SGlkZUFjdGl2ZUJ1dHRvbkV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB0aGlzLmhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0Py5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzISkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKCEoZGV0YWlscy5hY3Rpb24gaW5zdGFuY2VvZiBTaG93SGlkZUFjdGl2ZUJ1dHRvbikpe1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudFZhbHVlcyA9IChkZXRhaWxzLmFjdGlvbiBhcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29sb3IgPSBldmVudFZhbHVlcy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09IGV2ZW50Q29sb3IudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VmFsdWVzLmludGVudGlvbiA9PSBcInNob3dcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50KGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdD8uaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcyEpKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZighKGRldGFpbHMuYWN0aW9uIGluc3RhbmNlb2YgUmVzZXRBY3RpdmVCdXR0b25zKSl7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRMZWZ0SWNvbkNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgIC8vIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3QgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/OiBEcm9wZG93bk1lbnVCdXR0b247XHJcblxyXG4gICAgZHJvcGRvd25JdGVtczogQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PElEcm9wZG93bk1lbnVJdGVtPjtcclxuICAgIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcbiAgICBmaWx0ZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gbmV3IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxEcm9wZG93bk1lbnVMaXN0SXRlbT4oKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQ6IEhUTUxVTGlzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnYmxvY2stdHlwZScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc29mdC1ib3gtc2hhZG93JywgJ2RlcGVuZGVudC1ib3gnLCAnY2hlY2thYmxlLWl0ZW1zJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gXCIyNXZtYXhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguRXh0cmVtZWx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLy8gU2V0IGB0cnVlYCB0byBjYXB0dXJlIHRoZSBldmVudCBkdXJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBwaGFzZSwgZ2l2aW5nIHRoaXMgZnVuY3Rpb24gcHJpb3JpdHkgb3ZlciBvdGhlcnMuXHJcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgZXZlbnQgZnJvbSBiZWluZyBoYW5kbGVkIGJ5IGVhcmxpZXIgYENvbnRlbnRgIGNvbXBvbmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmVtaXRDb21tYW5kRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd0Rvd25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBGbG9hdGluZ1Rvb2xiYXIgd2l0aCBhIERyb3Bkb3duTGlzdCwgdGhpcyBoYW5kbGVyIHNob3VsZCBiZSBpZ25vcmVkIGZvciBzbW9vdGhlciBVSSBjb250cm9sLiBcclxuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBjb21wb25lbnRzIGxpa2UgQmxvY2tUb29sYm94LCB3aGVyZSB0aGVyZSdzIG5vIHJpc2sgb2YgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmluZyBhZnRlciBwcmVzc2luZyBFc2NhcGUgKGlmIHRoZSBjdXJzb3IgaXMgd2l0aGluIHRoZSBibG9jayksXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXIgaXMgdXNlZCB0byBjbG9zZSB0aGUgZHJvcGRvd24gbGlzdCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgRXNjYXBlLlxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRXNjYXBlICYmICF0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoXCIuZmxvYXRpbmctdG9vbGJhclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVyS2V5RG93bkV2ZW50LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja0Nsb25lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZXJLZXlEb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgL15bYS16QS1aXSQvLnRlc3QoZXZlbnQua2V5KSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciArPSBldmVudC5rZXk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkJhY2tzcGFjZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcigpIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJcIiB8fCBpdGVtLnZhbHVlPy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHx8IGl0ZW0udGl0bGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXIudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlciA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IFwiMFwiO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcImF1dG9cIjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbikge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcImF1dG9cIjtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5yaWdodCA9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLXVwXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi1kb3duXCIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbT8udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hWaXN1YWxGb2N1cyhpdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnJlbW92ZUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBpdGVtO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBuZXh0VmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldE5leHRTYXRpc2Z5aW5nKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSAmJiBpdGVtLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xyXG4gICAgICAgIG5leHRWaXNpYmxlSXRlbT8udmFsdWUuZW5zdXJlVmlzaWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtICYmIGl0ZW0uaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtPy52YWx1ZS5lbnN1cmVWaXNpYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgICAgICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uaHRtbEVsZW1lbnQuaWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgLy8mJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/Lmh0bWxFbGVtZW50LmlkfWApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHByZWZpeElkOiBzdHJpbmcsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnVMaXN0IHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KHByZWZpeElkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpKTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtpZDogaWR9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiMjRweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSaWdodCA9IFwiMXB4IHNvbGlkICNkMGQwZDBcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW4gPSBcImF1dG8gNnB4XCI7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXAgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaXRlbVwiKTtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gXCIxMHB4XCI7XHJcbiAgICAgICAgLy8gaHRtbEVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjEwcHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL1NWR0ljb25cIjtcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXBJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd1VJOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgaWNvbjogU1ZHSWNvbikge1xuXG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5zaG93VUkgPSBjb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUxpbms7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG5cbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImVudHJ5XCIsIFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLW9wZXJhdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiKTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlO1xuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIGFzeW5jIChldmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBzaG93VUk6IHRoaXMuc2hvd1VJLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+O1xuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZiAoc3RhdGVzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pZCA9PSBkZXRhaWxzLnRhcmdldElkKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoKGRldGFpbHMuYWN0aW9uIGFzIENoYW5nZUNvbG9yKS5jb2xvcilcblxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXRhaWxzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgIC8vICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZih0aGlzLmlkID09IGRldGFpbHMudGFyZ2V0SWQpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcigoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQ29sb3IpLmNvbG9yKVxuXG4gICAgICAgIC8vICAgICAgICAgLy8gaWYgKGRldGFpbHNbdGhpcy5jb21tYW5kIGFzIGtleW9mIElGb3JtYXRDb21tYW5kXSkge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGljb246IFNWR0ljb24pOiBCdXR0b25Hcm91cEl0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwSXRlbShjb21tYW5kLCB0aXRsZSwgaWNvbik7XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9ySWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjUwJVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMucHJvcHMuY29sb3I7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBJRHJvcGRvd25NZW51SXRlbSB9IGZyb20gXCIuL0lEcm9wZG93bk1lbnVJdGVtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcblxyXG4gICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LCB0aXRsZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBhY3RpdmVJY29uPzogU1ZHSWNvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IFwiXCI7XHJcbiAgICBcclxuICAgIGNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZ2V0TGVmdEljb25CYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRBY3RpdmVJY29uKCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXR0YWNoT25Mb3NlRm9jdXMoZnVuYzogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm5vLWxpc3Qtc3R5bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcclxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIHRpdGxlLmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMsIENvbG9yc05hbWVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvQmxvY2tUb29sYm94XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW0gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUJ1dHRvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0SXRlbSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSXRlbUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25JdGVtSURzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQmxvY2tUb29sYm94QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGFsaWduVG9vbCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5TGVmdCwgXCJMZWZ0XCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkp1c3RpZnlTdGFydCwgU2l6ZXMubGFyZ2UpKS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5Q2VudGVyLCBcIkNlbnRlclwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5Q2VudGVyLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLkp1c3RpZnlSaWdodCwgXCJSaWdodFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5RW5kLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvclRvb2woKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcImNvbG9ySW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JJbnRlcmFjdGl2ZUJ1dHRvblwiICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBuZXcgQ29sb3JJY29uKFwid2hpdGVcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb2xvckJ1dHRvbi5hZGRDc3NDbGFzcyhcImNvbG9yLWludGVyYWN0aXZlLWJ1dHRvblwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJjb2xvckludGVyYWN0aW9uT3B0aW9uc01lbnVcIiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JCdXR0b24sIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKGNvbG9yRHJvcGRvd25MaXN0LCBcIkJhY2tncm91bmRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JSZWQgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25SZWQgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy5jaGFuZ2VDYWxsb3V0QmFja2dyb3VuZENvbG9yLCBDb2xvcnNOYW1lcy5DYWxsb3V0QmFja2dyb3VuZFJlZCwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JSZWQuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZWVuICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRHcmVlbiwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbikuaHRtbEVsZW1lbnQsIFwiR3JlZW5cIik7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yR3JlZW4uYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uQmx1ZSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvckJsdWUuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JZZWxsb3cgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25ZZWxsb3cgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy5jaGFuZ2VDYWxsb3V0QmFja2dyb3VuZENvbG9yLCBDb2xvcnNOYW1lcy5DYWxsb3V0QmFja2dyb3VuZFllbGxvdywgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JleSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kR3JleSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KS5odG1sRWxlbWVudCwgXCJHcmV5XCIpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvckdyZXkuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uTm9uZSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvck5vbmUuYWRkQ2xhc3MoXCJibG9jay10b29sYm94LWNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChiYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoYmFja2dyb3VuZENvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGJhY2tncm91bmRDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbGFuZ3VhZ2VTZWxlY3Rpb25Ub29sKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IERyb3Bkb3duTWVudUxpc3QuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZU9wdGlvblNlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZUJ1dHRvblwiLCBcIlBsYWluIFRleHRcIiwgc2VsZWN0LCB0cnVlLCBbXCJjb2RlLWJsb2NrLWxhbmd1YWdlLW1lbnVcIiwgXCJjb2xvci1pbnRlcmFjdGl2ZS1idXR0b25cIl0pO1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBEcm9wZG93bk1lbnUuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGlvbk9wdGlvbnNNZW51XCIsIGJ1dHRvbiwgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgc2VsZWN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShzZWxlY3QsIFwiTGFuZ3VhZ2VcIikpO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhCbG9ja1Rvb2xib3gubGFuZ3VhZ2VNYXApLnNvcnQoKGEsIGIpID0+IGFbMV0ubG9jYWxlQ29tcGFyZShiWzFdKSkuZm9yRWFjaCgoW2NvZGUsIG5hbWVdKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJsYW5ndWFnZVNlbGVjdGlvbkl0ZW0tXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIHNlbGVjdCwgQ29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UsIGNvZGUsIG51bGwsIG5hbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJwbGFpbnRleHRcIikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZChpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGV4dHJhT3B0aW9ucygpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ID0gRHJvcGRvd25NZW51TGlzdC5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiwgW1wibWVkaWEtbW9yZS1vcHRpb24tc2VsZWN0XCJdKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibW9yZUludGVyYWN0aXZlT3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIGxpc3QsIGZhbHNlLCBbXCJtb3JlTWVkaWFPcHRpb25zQnV0dG9uXCJdKTtcclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IERyb3Bkb3duTWVudS5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25zTWVudVwiLCBidXR0b24sIGxpc3QpO1xyXG5cclxuICAgICAgICBsaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShsaXN0LCBcIk1vcmUgb3B0aW9uc1wiKSk7XHJcbiAgICAgICAgbGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZHVwbGljYXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5EdXBsaWNhdGUsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJDbG9uZVwiLCBcIkN0cmwrRFwiKSk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmRlbGV0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5UcmFzaCwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbGlzdC5hcHBlbmQoZGVsZXRlSXRlbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElCbG9ja1Rvb2xib3ggfSBmcm9tIFwiLi9JQmxvY2tUb29sYm94XCI7XG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XG5pbXBvcnQgeyBUb29sYm94T3B0aW9ucyB9IGZyb20gXCIuL1Rvb2xib3hPcHRpb25zXCI7XG5pbXBvcnQgeyBCbG9ja1Rvb2xib3hCdWlsZGVyIH0gZnJvbSBcIkAvYnVpbGRlcnMvQmxvY2tUb29sYm94QnVpbGRlclwiO1xuaW1wb3J0IHsgRE9NRWxlbWVudHMgfSBmcm9tIFwiQC9jb21tb24vRE9NRWxlbWVudHNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja1Rvb2xib3ggaW1wbGVtZW50cyBJQmxvY2tUb29sYm94IHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja1Rvb2xib3g7XG5cbiAgICBzdGF0aWMgbGFuZ3VhZ2VNYXA6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIC8vIFwiMWNcIjogXCIxQ1wiLFxuICAgICAgICAvLyBcImFibmZcIjogXCJBQk5GXCIsIFxuICAgICAgICAvLyBcImFjY2Vzc2xvZ1wiOiBcIkFjY2VzcyBMb2dzXCIsIFxuICAgICAgICAvLyBcImFjdGlvbnNjcmlwdFwiOiBcIkFjdGlvblNjcmlwdFwiLCBcbiAgICAgICAgXCJhZGFcIjogXCJBZGFcIixcbiAgICAgICAgLy9cImFuZ2Vsc2NyaXB0XCI6IFwiQW5nZWxTY3JpcHRcIiwgXG4gICAgICAgIFwiYXBhY2hlXCI6IFwiQXBhY2hlIENvbmZpZ1wiLFxuICAgICAgICBcImFwcGxlc2NyaXB0XCI6IFwiQXBwbGVTY3JpcHRcIixcbiAgICAgICAgXCJhcmR1aW5vXCI6IFwiQXJkdWlub1wiLFxuICAgICAgICAvLyBcImFybWFzbVwiOiBcIkFSTSBBc3NlbWJseVwiLCBcbiAgICAgICAgXCJhc2NpaWRvY1wiOiBcIkFzY2lpRG9jXCIsXG4gICAgICAgIC8vIFwiYXNtXCI6IFwiQXNzZW1ibHlcIiwgXG4gICAgICAgIC8vIFwiYXV0b2hvdGtleVwiOiBcIkF1dG9Ib3RrZXlcIiwgXG4gICAgICAgIC8vIFwiYXV0b2l0XCI6IFwiQXV0b0l0XCIsIFxuICAgICAgICBcImJhc2hcIjogXCJCYXNoXCIsXG4gICAgICAgIFwiYmFzaWNcIjogXCJCQVNJQ1wiLFxuICAgICAgICBcImNcIjogXCJDXCIsXG4gICAgICAgIFwiY3NoYXJwXCI6IFwiQyNcIixcbiAgICAgICAgXCJjcHBcIjogXCJDKytcIixcbiAgICAgICAgXCJjc3NcIjogXCJDU1NcIixcbiAgICAgICAgLy8gXCJjbG9qdXJlXCI6IFwiQ2xvanVyZVwiLCBcbiAgICAgICAgXCJjb2ZmZWVzY3JpcHRcIjogXCJDb2ZmZWVTY3JpcHRcIixcbiAgICAgICAgLy8gXCJkXCI6IFwiRFwiLCBcbiAgICAgICAgXCJkYXJ0XCI6IFwiRGFydFwiLFxuICAgICAgICAvLyBcImRlbHBoaVwiOiBcIkRlbHBoaVwiLCBcbiAgICAgICAgLy8gXCJlbGl4aXJcIjogXCJFbGl4aXJcIiwgXG4gICAgICAgIC8vIFwiZWxtXCI6IFwiRWxtXCIsIFxuICAgICAgICAvLyBcImVybGFuZ1wiOiBcIkVybGFuZ1wiLCBcbiAgICAgICAgLy8gXCJmc2hhcnBcIjogXCJGI1wiLCBcbiAgICAgICAgLy8gXCJmb3J0cmFuXCI6IFwiRm9ydHJhblwiLCBcbiAgICAgICAgXCJnb1wiOiBcIkdvXCIsXG4gICAgICAgIC8vIFwiZ3Jvb3Z5XCI6IFwiR3Jvb3Z5XCIsIFxuICAgICAgICAvLyBcImhhc2tlbGxcIjogXCJIYXNrZWxsXCIsIFxuICAgICAgICBcImh0bWxcIjogXCJIVE1MXCIsXG4gICAgICAgIFwiamF2YVwiOiBcIkphdmFcIixcbiAgICAgICAgXCJqYXZhc2NyaXB0XCI6IFwiSmF2YVNjcmlwdFwiLFxuICAgICAgICBcImpzb25cIjogXCJKU09OXCIsXG4gICAgICAgIC8vIFwianVsaWFcIjogXCJKdWxpYVwiLCBcbiAgICAgICAgLy8gXCJrb3RsaW5cIjogXCJLb3RsaW5cIiwgXG4gICAgICAgIC8vIFwibGF0ZXhcIjogXCJMYVRlWFwiLCBcbiAgICAgICAgLy8gXCJsaXNwXCI6IFwiTGlzcFwiLCBcbiAgICAgICAgLy8gXCJsdWFcIjogXCJMdWFcIiwgXG4gICAgICAgIFwibWFya2Rvd25cIjogXCJNYXJrZG93blwiLFxuICAgICAgICAvLyBcIm1hdGxhYlwiOiBcIk1BVExBQlwiLCBcbiAgICAgICAgLy8gXCJvYmplY3RpdmUtY1wiOiBcIk9iamVjdGl2ZS1DXCIsIFxuICAgICAgICBcInBlcmxcIjogXCJQZXJsXCIsXG4gICAgICAgIFwicGhwXCI6IFwiUEhQXCIsXG4gICAgICAgIFwicGxhaW50ZXh0XCI6IFwiUGxhaW4gVGV4dFwiLFxuICAgICAgICBcInB5dGhvblwiOiBcIlB5dGhvblwiLFxuICAgICAgICAvLyBcInJcIjogXCJSXCIsIFxuICAgICAgICBcInJ1YnlcIjogXCJSdWJ5XCIsXG4gICAgICAgIC8vIFwicnVzdFwiOiBcIlJ1c3RcIiwgXG4gICAgICAgIC8vIFwic2NhbGFcIjogXCJTY2FsYVwiLCBcbiAgICAgICAgLy8gXCJzY2hlbWVcIjogXCJTY2hlbWVcIiwgXG4gICAgICAgIFwic2Nzc1wiOiBcIlNDU1NcIixcbiAgICAgICAgXCJzaGVsbFwiOiBcIlNoZWxsXCIsXG4gICAgICAgIFwic3FsXCI6IFwiU1FMXCIsXG4gICAgICAgIC8vIFwic3dpZnRcIjogXCJTd2lmdFwiLCBcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCI6IFwiVHlwZVNjcmlwdFwiLFxuICAgICAgICAvLyBcInZibmV0XCI6IFwiVmlzdWFsIEJhc2ljIC5ORVRcIiwgXG4gICAgICAgIC8vIFwidmhkbFwiOiBcIlZIRExcIiwgXG4gICAgICAgIFwieG1sXCI6IFwiWE1MXCIsXG4gICAgICAgIFwieWFtbFwiOiBcIllBTUxcIlxuICAgIH07XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpZiAoQmxvY2tUb29sYm94Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tUb29sYm94LmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEJsb2NrVG9vbGJveCB7XG4gICAgICAgIGlmICghQmxvY2tUb29sYm94Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICBCbG9ja1Rvb2xib3guaW5zdGFuY2UgPSBuZXcgQmxvY2tUb29sYm94KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJsb2NrVG9vbGJveC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTGlzdGVuaW5nIGJsb2NrIHRvb2xib3hlcy4uLlwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VvdmVyLCB0aGlzLmluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlLmJpbmQodGhpcykpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Gb2N1c2luLCB0aGlzLmhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luLmJpbmQodGhpcykpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Gb2N1c291dCwgdGhpcy5oYW5kbGVUYWJsZUJlaGF2aW9yRm9jdXNPdXQuYmluZCh0aGlzKSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrRXZlbnQuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbGJveFZpc2liaWxpdHlDb250cm9sbGVyKHRhcmdldEVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogSGFuZGxlcyBmb2N1cyBpbiBldmVudHMgd2l0aGluIGEgdGFibGUuIElmIHRoZSBmb2N1cyBpcyB3aXRoaW4gYSB0YWJsZSBlbGVtZW50LFxuICAgICogaXQgdHJpZ2dlcnMgdGhlIHRvb2xib3ggdmlzaWJpbGl0eSBjb250cm9sbGVyIHRvIHBvdGVudGlhbGx5IGhpZGUgdGhlIHRvb2xib3guXG4gICAgKiBUaGlzIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgdGhlIHRvb2xib3ggZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRhYmxlIGludGVyYWN0aW9ucy5cbiAgICAqXG4gICAgKiBAcGFyYW0ge0ZvY3VzRXZlbnR9IGV2ZW50IC0gVGhlIGZvY3VzIGV2ZW50IHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgd2l0aGluIHRoZSB0YWJsZSBnYWlucyBmb2N1cy5cbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpKSB7XG4gICAgICAgICAgICB0aGlzLnRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcih0YXJnZXRFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZm9jdXMgb3V0IGV2ZW50cyB3aXRoaW4gYSB0YWJsZS4gSWYgdGhlIGZvY3VzIG1vdmVzIG91dCBvZiBhIHRhYmxlIGVsZW1lbnQsXG4gICAgICogaXQgdHJpZ2dlcnMgdGhlIHRvb2xib3ggdmlzaWJpbGl0eSBjb250cm9sbGVyIHRvIHBvdGVudGlhbGx5IHNob3cgdGhlIHRvb2xib3guXG4gICAgICogVGhpcyBoZWxwcyBpbiBlbnN1cmluZyB0aGF0IHRoZSB0b29sYm94IGlzIGF2YWlsYWJsZSBmb3IgdXNlIHdoZW4gdGhlIHRhYmxlIGlzIG5vdCBhY3RpdmVseSBmb2N1c2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtGb2N1c0V2ZW50fSBldmVudCAtIFRoZSBmb2N1cyBldmVudCB0cmlnZ2VyZWQgd2hlbiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgdGFibGUgbG9zZXMgZm9jdXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cblxuICAgIHByaXZhdGUgaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzT3V0KGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpKSB7XG4gICAgICAgICAgICB0aGlzLnRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcih0YXJnZXRFbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcihjZWxsOiBIVE1MRWxlbWVudCwgZm9yY2VIaWRlRWxlbWVudDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBibG9jayA9IGNlbGwuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1dyYXBwZXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKCcuYmxvY2stdG9vbGJhcicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcmNlSGlkZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1dyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5zZXJ0VG9vbGJveEludG9CbG9ja09uY2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblxuICAgICAgICBjb25zdCBjb250ZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAuJHtUb29sYm94T3B0aW9ucy5JbmNsdWRlQmxvY2tUb29sYmFyQ2xhc3N9YCk7XG5cbiAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgaWYgKCFibG9jaykgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvcHRpb25zQnV0dG9uRXhpc3RzID0gYmxvY2sucXVlcnlTZWxlY3RvcignLmJsb2NrLXRvb2xiYXItd3JhcHBlcicpICE9PSBudWxsO1xuICAgICAgICBpZiAoIW9wdGlvbnNCdXR0b25FeGlzdHMpIHtcblxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUxhbmd1YWdlU2VsZWN0aW9uVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkxhbmd1YWdlU2VsZWN0aW9uVG9vbENsYXNzKTtcbiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVBbGlnblRvb2wgPSBjb250ZW50LmNsYXNzTGlzdC5jb250YWlucyhUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XG4gICAgICAgICAgICBjb25zdCBpbmNsdWRlQ29sb3JUb29sID0gY29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoVG9vbGJveE9wdGlvbnMuQ29sb3JUb29sQ2xhc3MpO1xuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUV4dHJhT3B0aW9ucyA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcblxuICAgICAgICAgICAgY29uc3QgdG9vbGJveFdyYXBwZXIgPSBCbG9ja1Rvb2xib3guY3JlYXRlVG9vbGJveChpbmNsdWRlTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sLCBpbmNsdWRlQWxpZ25Ub29sLCBpbmNsdWRlQ29sb3JUb29sLCBpbmNsdWRlRXh0cmFPcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2suYXBwZW5kQ2hpbGQodG9vbGJveFdyYXBwZXIpO1xuICAgICAgICAgICAgICAgIGJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZW50ZXIsIChldmVudCkgPT4gdGhpcy5yZXNldFRvb2xib3goZXZlbnQsIGJsb2NrIGFzIEhUTUxFbGVtZW50KSk7XG5cbiAgICAgICAgICAgICAgICBibG9jay5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29sYmFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2suY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQmxvY2tUb29sYm94KHRvb2xib3hXcmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgYmxvY2suYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VsZWF2ZSwgKCkgPT4gdGhpcy5oaWRlQmxvY2tUb29sYm94KHRvb2xib3hXcmFwcGVyKSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghRE9NVXRpbHMuaXNUYXJnZXREZXNjZW5kYW50T2ZTZWxlY3RvcihldmVudCwgYCMke2Jsb2NrLmlkfWApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZXMgPSBibG9jay5xdWVyeVNlbGVjdG9yQWxsKFwiaWZyYW1lXCIpO1xuICAgICAgICAgICAgICAgIGlmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VlbnRlciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xiYXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSBcImZsZXhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJDb2xvcihibG9jayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWxlYXZlLCAoKSA9PiB0aGlzLmhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXIpKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG5cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBjaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2s6IEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbiA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuY29sb3ItaW50ZXJhY3RpdmUtYnV0dG9uIGRpdlwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FsbG91dFdyYXBwZXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmNhbGxvdXQtd3JhcHBlclwiKTtcblxuICAgICAgICBpZiAoY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbiAmJiBjYWxsb3V0V3JhcHBlcikge1xuXG4gICAgICAgICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjYWxsb3V0V3JhcHBlcik7XG5cbiAgICAgICAgICAgIGNvbG9ySW50ZXJhY3RpdmVCdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICAgICAgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IHN0eWxlLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI2NjY1wiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZUJsb2NrVG9vbGJveCh0b29sYm94V3JhcHBlcjogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xuICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xuICAgICAgICBpZiAodG9vbGJhcikge1xuXG4gICAgICAgICAgICBpZiAoIUJsb2NrVG9vbGJveC5pc0FueURlcGVuZGVudEJveFZpc2libGUodG9vbGJhcikpIHtcbiAgICAgICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0FueURlcGVuZGVudEJveFZpc2libGUoaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRlcGVuZGVudEJveGVzID0gaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5kZXBlbmRlbnQtYm94XCIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYm94IG9mIGRlcGVuZGVudEJveGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGJveCk7XG5cbiAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNldFRvb2xib3goZXZlbnQ6IEV2ZW50LCBibG9jazogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYmxvY2tUb29sYmFyID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyXCIpO1xuXG4gICAgICAgIGlmICghYmxvY2tUb29sYmFyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImJsb2NrLXRvb2xiYXIgbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9yZSA9IGJsb2NrVG9vbGJhci5xdWVyeVNlbGVjdG9yKFwiLm1lZGlhLW1vcmUtb3B0aW9uLXNlbGVjdFwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKG1vcmUpIHtcbiAgICAgICAgICAgIG1vcmUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sb3IgPSBibG9ja1Rvb2xiYXIucXVlcnlTZWxlY3RvcihcIi5jb2xvci1pbnRlcmFjdGl2ZS1zZWxlY3RcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgY29sb3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2spO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVUb29sYm94KGluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wgPSBmYWxzZSwgaW5jbHVkZUFsaWduVG9vbCA9IGZhbHNlLCBpbmNsdWRlQ29sb3JUb29sID0gZmFsc2UsIGluY2x1ZGVFeHRyYU9wdGlvbnMgPSBmYWxzZSk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG4gICAgICAgIGh0bWxFbGVtZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiYmxvY2stdG9vbGJhci13cmFwcGVyXCIsIFwiZXhjbHVkZS1mcm9tLWNsb25lXCIsIENvbW1vbkNsYXNzZXMuRWRpdG9yT25seSk7XG4gICAgICAgIGh0bWxFbGVtZW50V3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJibG9jay10b29sYmFyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IGBidGItJHtVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCl9YDtcblxuICAgICAgICBodG1sRWxlbWVudFdyYXBwZXIuYXBwZW5kQ2hpbGQoaHRtbEVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmxhbmd1YWdlU2VsZWN0aW9uVG9vbCgpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlQWxpZ25Ub29sKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmFsaWduVG9vbCgpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlQ29sb3JUb29sKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmNvbG9yVG9vbCgpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlRXh0cmFPcHRpb25zKSB7XG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmV4dHJhT3B0aW9ucygpLmh0bWxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudFdyYXBwZXI7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi8uLi9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21VSUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21VSUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcbmltcG9ydCB7IEJsb2NrVG9vbGJveCB9IGZyb20gXCJAL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9CbG9ja1Rvb2xib3hcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVCdXR0b24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuICAgIHN2Z0ljb24/OiBTVkdJY29uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0LCBpbmNsdWRlQ2hldnJvbkljb246IGJvb2xlYW4gPSB0cnVlKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN2Z0ljb24gPSBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNoZXZyb24tZG93blwiLCBTaXplcy5tZWRpdW0pO1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBkcm9wZG93bkxpc3Q6IGRyb3Bkb3duTGlzdCxcclxuICAgICAgICAgICAgc3ZnSWNvbjogaW5jbHVkZUNoZXZyb25JY29uID8gc3ZnSWNvbiA6IG51bGxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkxpc3QgPSBkcm9wZG93bkxpc3Q7XHJcbiAgICAgICAgdGhpcy5zdmdJY29uID0gc3ZnSWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuXHJcbiAgICAgICAgZHJvcGRvd25MaXN0LnNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbih0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQ6IEhUTUxCdXR0b25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIC8vIGh0bWxFbGVtZW50LnRpdGxlID0gdGhpcy5wcm9wcy50aXRsZVxyXG4gICAgICAgIGh0bWxFbGVtZW50LnJvbGUgPSBcImJ1dHRvblwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJidXR0b24tcmVzZXRcIiwgXCJ0ZXh0LWZvcm1hdHRpbmctc2VsZWN0LWJ1dHRvblwiLCBcInRleHQtZm9ybWF0dGluZy1vcGVyYXRpb25cIiwgXCJvcHRpb24taG92ZXJcIiwgXCJwb2ludGVyXCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnRhYkluZGV4ID0gMTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIsIHRoaXMucHJvcHMuZHJvcGRvd25MaXN0Lmh0bWxFbGVtZW50LmlkKTtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnRpdGxlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZChcIm5vLXNlbGVjdGlvblwiKTtcclxuICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHRoaXMucHJvcHMudGl0bGU7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMudGl0bGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc3ZnSWNvbikge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnN2Z0ljb24uaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZHJvcGRvd25MaXN0LmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkxpc3Quc2hvdygpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlLCB0aGlzLmhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VFdmVudChldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPjtcclxuICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBpZiAoZGV0YWlscy50YXJnZXRDbGFzcyAmJiB0aGlzLmNsYXNzTGlzdC5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzKSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRWYWx1ZXMgPSAoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoYCMke2V2ZW50VmFsdWVzLmJsb2NrSWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZihibG9jayl7XHJcbiAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGl0bGUoQmxvY2tUb29sYm94Lmxhbmd1YWdlTWFwW2V2ZW50VmFsdWVzLmxhbmd1YWdlXSk7XHJcbiAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2Jsb2NrJztcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VUaXRsZSh2YWx1ZTogc3RyaW5nKXtcclxuICAgICAgICBjb25zdCBzcGFuID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic3BhblwiKTtcclxuICAgICAgICBpZihzcGFuKXtcclxuICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHByZWZpeElkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgfCBIVE1MRWxlbWVudCwgbGlzdDogRHJvcGRvd25NZW51TGlzdCwgaW5jbHVkZUNoZXZyb25JY29uPzogYm9vbGVhbiwgY2xhc3Nlc0tleTogc3RyaW5nW10gPSBbXSk6IERyb3Bkb3duTWVudUJ1dHRvbiB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKHByZWZpeElkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCB0aXRsZSwgbGlzdCwgaW5jbHVkZUNoZXZyb25JY29uKTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwSXRlbSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25JdGVtSURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkl0ZW1JRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25MaXN0SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bkxpc3RJRHNcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51SURzIH0gZnJvbSBcIkAvY29yZS9Ecm9wZG93bk1lbnVJRHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIge1xyXG5cclxuICAgIHN0YXRpYyBidWlsZCgpOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gXCJcIlxyXG4gICAgICAgIGNvbnN0IGZsb2F0aW5nQmFyID0gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kRHJvcGRvd24oVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnR1cm5JbnRvRHJvcGRvd24oKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kU2VwYXJhdG9yKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoXCJ0dXJuSW50b1NlcGFyYXRvclwiKSk7XHJcbiAgICAgICAgZmxvYXRpbmdCYXIuYXBwZW5kQnV0dG9uR3JvdXAoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLmJ1dHRvbkdyb3VwKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5jb2xvckRyb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGV4dE9wZXJhdGlvbnNTZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5tb3JlT3B0aW9uc0Ryb3Bkb3duKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmxvYXRpbmdCYXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHR1cm5JbnRvRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgdHVybkludG9CYXJMaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJ0dXJuSW50b1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0dXJuSW50b0J1dHRvblwiLCBcIlRleHRcIiwgdHVybkludG9CYXJMaXN0KTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInR1cm5JbnRvTWVudVwiLCB0dXJuSW50b0JhckJ1dHRvbiwgdHVybkludG9CYXJMaXN0KTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiVHVybiBpbnRvXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29ucy5wYXJhZ3JhcGguaHRtbEVsZW1lbnQsIFwiVGV4dFwiLCBcIkN0cmwrU2hpZnQrRW50ZXJcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29ucy50b2RvX2xpc3QuaHRtbEVsZW1lbnQsIFwiVG9kbyBsaXN0XCIsIFwiQ3RybCsxXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uQnVsbGV0ZWRMaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFNWR0ljb25zLmJfbGlzdC5odG1sRWxlbWVudCwgXCJCdWxsZXRlZCBsaXN0XCIsIFwiQ3RybCsuXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uTnVtYmVyZWRMaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFNWR0ljb25zLm5fbGlzdC5odG1sRWxlbWVudCwgXCJOdW1iZXJlZCBsaXN0XCIsIFwiQ3RybCsvXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uQmxvY2tDb2RlXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIFNWR0ljb25zLmNvZGUuaHRtbEVsZW1lbnQsIFwiQmxvY2sgY29kZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblF1b3RlXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlFVT1RFLCBTVkdJY29ucy5xdW90ZS5odG1sRWxlbWVudCwgXCJRdW90ZVwiKSk7XHJcbiAgICAgICAgLy90dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzFcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEsIFNWR0ljb25zLmhlYWQxLmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgMVwiLCBcIkN0cmwrQWx0KzFcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nMlwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgU1ZHSWNvbnMuaGVhZDIuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyAyXCIsIFwiQ3RybCtBbHQrMlwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmczXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBTVkdJY29ucy5oZWFkMy5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDNcIiwgXCJDdHJsK0FsdCszXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFNWR0ljb25zLmhlYWQ0Lmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgNFwiLCBcIkN0cmwrQWx0KzRcIikpO1xyXG4gICAgICAgIC8vdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmc1XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81LCBTVkdJY29ucy5oZWFkNS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDVcIiwgXCJDdHJsK0FsdCs1XCIpKTtcclxuICAgICAgICAvL3R1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nNlwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgU1ZHSWNvbnMuaGVhZDYuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyA2XCIsIFwiQ3RybCtBbHQrNlwiKSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0dXJuSW50b0Ryb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzZXBhcmF0b3IoaWQ6IHN0cmluZyk6IEZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBidXR0b25Hcm91cCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGluayA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlTGluaywgXCJMaW5rXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkxpbmssIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgbGluay5zZXRJZChCdXR0b25JRHMuTGluayk7XHJcbiAgICAgICAgbGluay5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJvbGQgPSBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLnRvZ2dsZUJvbGQsIFwiQm9sZFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5Cb2xkLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIGJvbGQuc2V0SWQoQnV0dG9uSURzLkJvbGQpO1xyXG4gICAgICAgIGJvbGQuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGl0YWxpYyA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlSXRhbGljLCBcIkl0YWxpY1wiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5JdGFsaWMsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgaXRhbGljLnNldElkKEJ1dHRvbklEcy5JdGFsaWMpO1xyXG4gICAgICAgIGl0YWxpYy5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdW5kZXJsaW5lID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUsIFwiVW5kZXJsaW5lXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLlVuZGVybGluZSwgU2l6ZXMubGFyZ2UpKTtcclxuICAgICAgICB1bmRlcmxpbmUuc2V0SWQoQnV0dG9uSURzLlVuZGVybGluZSk7XHJcbiAgICAgICAgdW5kZXJsaW5lLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBpbmxpbmVDb2RlID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlLCBcIkNvZGVcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSW5saW5lQ29kZSwgU2l6ZXMubGFyZ2UpKTtcclxuICAgICAgICBpbmxpbmVDb2RlLnNldElkKEJ1dHRvbklEcy5JbmxpbmVDb2RlKTtcclxuICAgICAgICBpbmxpbmVDb2RlLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBzdHJpa2V0aHJvdWdoID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVTdHJpa2VUaHJvdWdoLCBcIlN0cmlrZS10aHJvdWdoXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLlN0cmlrZVRocm91Z2gsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgc3RyaWtldGhyb3VnaC5zZXRJZChCdXR0b25JRHMuU3RyaWtldGhyb3VnaCk7XHJcbiAgICAgICAgc3RyaWtldGhyb3VnaC5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcblxyXG4gICAgICAgIHJldHVybiBncm91cEJ1dHRvbjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY29sb3JEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duTGlzdCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KERyb3Bkb3duTGlzdElEcy5Db2xvclRleHRPcHRpb25TZWxlY3QpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcImNvbG9yVGV4dEJ1dHRvblwiLCBuZXcgQ29sb3JJY29uKFwid2hpdGVcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShEcm9wZG93bk1lbnVJRHMuQ29sb3JUZXh0T3B0aW9uc01lbnUsIGNvbG9yQnV0dG9uLCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJIaWdobGlnaHRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblJlZCwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JSZWQuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZWVuLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZWVuLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZWVuKS5odG1sRWxlbWVudCwgXCJHcmVlblwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvckdyZWVuLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yQmx1ZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkJsdWUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yQmx1ZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblllbGxvdywgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JleSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5LCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JHcmV5LmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbk5vbmUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yTm9uZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZWVuKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZXkpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiVGV4dFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JSZWQsIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBmb3JlQ29sb3JSZWQuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9yR3JlZW4sIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckdyZWVuLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JCbHVlLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckJsdWUuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JZZWxsb3csIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBmb3JlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvciwgQ29sb3JzLkZvcmVDb2xvckdyZXksIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgZm9yZUNvbG9yR3JleS5hZGRDbGFzcyhcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBTaXplcy5sYXJnZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBmb3JlQ29sb3JOb25lLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChmb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGZvcmVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9yZU9wdGlvbnNEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwibW9yZVRleHRPcHRpb25zTWVudVwiLCBtb3JlT3B0aW9uc0J1dHRvbiwgbW9yZU9wdGlvbnNMaXN0KTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShtb3JlT3B0aW9uc0xpc3QsIFwiTW9yZSBvcHRpb25zXCIpKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb3B5T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY29weVNlbGVjdGVkLCBudWxsLCBTVkdJY29ucy5jb3B5Lmh0bWxFbGVtZW50LCBcIkNvcHlcIiwgXCJDdHJsK0NcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY3V0T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY3V0U2VsZWN0ZWQsIG51bGwsIFNWR0ljb25zLmN1dC5odG1sRWxlbWVudCwgXCJDdXRcIiwgXCJDdHJsK1hcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicGFzdGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5wYXN0LCBudWxsLCBTVkdJY29ucy5wYXN0ZS5odG1sRWxlbWVudCwgXCJSZXBsYWNlXCIsIFwiQ3RybCtWXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImR1cGxpY2F0ZU9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29ucy5kdXBsaWNhdGUuaHRtbEVsZW1lbnQsIFwiQ2xvbmVcIiwgXCJDdHJsK0RcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicmVzZXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5yZW1vdmVGb3JtYXQsIG51bGwsIFNWR0ljb25zLmVyYXNlci5odG1sRWxlbWVudCwgXCJSZXNldCBTdHlsZVwiLCBcIkN0cmwrXFxcXFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJkZWxldGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5kZWxldGVCbG9jaywgbnVsbCwgU1ZHSWNvbnMuZGVsZXRlLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChkZWxldGVJdGVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHRvZG9fbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBiX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBjb2RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNvZGUtbWFya1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBxdW90ZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1xdW90ZVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMzogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtM1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZGVsZXRlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtdHJhc2hcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZXJhc2VyOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY2xlYXJcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY3V0OiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY3V0XCIsIFNpemVzLmxhcmdlKSxcclxuICAgIHBhc3RlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtcGFzdGVcIiwgU2l6ZXMubGFyZ2UpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIG1hdGNoaW5nIGJsb2NrIHR5cGVzIGZvdW5kLic7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLmNsYXNzTGlzdC5hZGQoJ2VtcHR5LWJsb2NrLW9wdGlvbnMnKTtcclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3Iuc3R5bGUucGFkZGluZyA9ICcxMHB4JztcclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3Iuc3R5bGUuY29sb3IgPSAncmdiYSg1NSwgNTMsIDQ3LCAwLjY1KSc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRW1wdHlJbmRpY2F0b3I7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBRdWlja01lbnVTZWN0aW9uIH0gZnJvbSAnLi9RdWlja01lbnVTZWN0aW9uJztcbmltcG9ydCB7IFF1aWNrTWVudUVtcHR5IH0gZnJvbSAnLi9RdWlja01lbnVFbXB0eSc7XG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSAnLi9RdWlja01lbnVJdGVtJztcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnQnO1xuaW1wb3J0IHsgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IH0gZnJvbSAnLi4vLi4vY29tbW9uL0NpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCc7XG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuLi8uLi9jb21tb24vSk5vZGVcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tICdAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lcic7XG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gJ0AvY29yZS9JRm9jdXNTdGFjayc7XG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSAnLi9JUXVpY2tNZW51JztcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tICdAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWwnO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnQC9jb21tYW5kcy9Db21tYW5kcyc7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gJ0AvdXRpbGl0aWVzL0RPTVV0aWxzJztcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gJ0AvY29tbW9uL1pJbmRleCc7XG5cbmV4cG9ydCBjbGFzcyBRdWlja01lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQgaW1wbGVtZW50cyBJUXVpY2tNZW51IHtcblxuICAgIHN0YXRpYyBpZCA9IFwicXVpY2tNZW51XCI7XG5cbiAgICBwcml2YXRlIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcbiAgICBwcml2YXRlIG1lbnVTZWN0aW9uczogQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFF1aWNrTWVudVNlY3Rpb24+O1xuICAgIHByaXZhdGUgcXVpY2tNZW51RW1wdHk6IFF1aWNrTWVudUVtcHR5O1xuICAgIHByaXZhdGUgZmlsdGVySW5wdXQ6IHN0cmluZztcbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFF1aWNrTWVudSB8IG51bGw7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrKSB7XG5cbiAgICAgICAgY29uc3QgcXVpY2tNZW51RW1wdHkgPSBuZXcgUXVpY2tNZW51RW1wdHkoKTtcblxuICAgICAgICBzdXBlcih7IHF1aWNrTWVudUVtcHR5OiBxdWlja01lbnVFbXB0eSB9KTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucyA9IG5ldyBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj4oKTtcbiAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eSA9IHF1aWNrTWVudUVtcHR5O1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuICAgIH1cblxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gUXVpY2tNZW51LmlkO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucy13cmFwcGVyJywgJ3NvZnQtYm94LXNoYWRvdycpO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGNvbnN0IGJsb2NrT3B0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBibG9ja09wdGlvbnMuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucycpO1xuICAgICAgICBibG9ja09wdGlvbnMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuXG4gICAgICAgIGJsb2NrT3B0aW9ucy5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnF1aWNrTWVudUVtcHR5Lmh0bWxFbGVtZW50KTtcblxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChibG9ja09wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcbiAgICB9XG5cbiAgICBhcHBlbmQobWVudUl0ZW06IFF1aWNrTWVudVNlY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMuYXBwZW5kKG1lbnVJdGVtKTtcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuYmxvY2stb3B0aW9ucycpIS5hcHBlbmRDaGlsZChtZW51SXRlbS5odG1sRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBRdWlja01lbnUge1xuXG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG5cbiAgICAgICAgaWYgKCFRdWlja01lbnUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFF1aWNrTWVudS5pbnN0YW5jZSA9IG5ldyBRdWlja01lbnUoZm9jdXNTdGFjayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUXVpY2tNZW51Lmluc3RhbmNlO1xuICAgIH1cblxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+KTogdm9pZCB7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xuXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgZmlyc3RTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZ2V0Rmlyc3QoKTtcblxuICAgICAgICBsZXQgY3VycmVudFNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSBmaXJzdFNlY3Rpb25Ob2RlO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50U2VjdGlvbk5vZGUpIHtcblxuICAgICAgICAgICAgY29uc3QgaXRlbU5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbCA9IGN1cnJlbnRTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZEZpcnN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAoaXRlbU5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKGl0ZW1Ob2RlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uTm9kZSA9IGN1cnJlbnRTZWN0aW9uTm9kZS5uZXh0Tm9kZTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWN0aW9uTm9kZSA9PSBmaXJzdFNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVJdGVtOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzVmlzaWJsZUl0ZW0pIHtcblxuICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZCh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUuaW1tZWRpYXRlUGFyZW50KSEuZ2V0UHJldmlvdXNTYXRpc2Z5aW5nKHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSBwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZExhc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFzdFZpc2libGVTZWN0aW9uTm9kZTogSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gfCBudWxsID0gdGhpcy5tZW51U2VjdGlvbnMuZmluZExhc3Qoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgIGlmICghbGFzdFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzVmlzaWJsZUl0ZW0gPSBsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kTGFzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcbiAgICB9XG5cbiAgICBmb2N1c05leHRWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBsZXQgbmV4dFZpc2libGVJdGVtOiBKTm9kZTxRdWlja01lbnVJdGVtPiB8IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSkge1xuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldE5leHRTYXRpc2Z5aW5nKGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgaWYgKCFuZXh0VmlzaWJsZUl0ZW0pIHtcblxuICAgICAgICAgICAgICAgIGxldCBuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5pbW1lZGlhdGVQYXJlbnQpIS5nZXROZXh0U2F0aXNmeWluZyhzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmV4dFZpc2libGVTZWN0aW9uTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHRWaXNpYmxlSXRlbSA9IG5leHRWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlOiBudWxsIHwgSk5vZGU8UXVpY2tNZW51U2VjdGlvbj4gPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kRmlyc3Qoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoIWZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3dpdGNoVmlzdWFsRm9jdXMobmV4dFZpc2libGVJdGVtISk7XG4gICAgfVxuXG4gICAgZmlsdGVySXRlbXMoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW51U2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHNlY3Rpb24uZmlsdGVyU2VjdGlvbih0aGlzLmZpbHRlcklucHV0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLm1lbnVTZWN0aW9ucy5hbnkoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSkpIHtcbiAgICAgICAgICAgIHRoaXMucXVpY2tNZW51RW1wdHkuc2hvdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eS5oaWRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGRpc3BsYXkgdGhlIHF1aWNrTWVudTogbm8gYWN0aXZlIGVsZW1lbnQgZm91bmQuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2goYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNlbGVjdGlvbiBmb3VuZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYO1xuXG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XG5cbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcblxuICAgICAgICAgICAgc3VwZXIuc2hvdygpO1xuXG4gICAgICAgICAgICB0aGlzLmZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5mb2N1cygpO1xuXG4gICAgICAgIH0sIDEwKTtcblxuICAgIH1cblxuICAgIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLnJlc3RvcmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcblxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcblxuICAgICAgICBzdXBlci5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudHMoKSB7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsICgoZXZlbnQ6IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbW1hbmQgfSA9IGV2ZW50LmRldGFpbDtcblxuICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMudHJhbnNmb3JtQmxvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KSBhcyBFdmVudExpc3RlbmVyKTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gRE9NVXRpbHMuZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoXCJibG9ja1wiKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICcvJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiBibG9jaykge1xuXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBzaG93IHF1aWNrTWVudVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KFwiLmlnbm9yZS1xdWljay1tZW51XCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNQcmV2aW91c1Zpc2libGVJdGVtKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIC9eW2EtejAtOSBdJC9pLnRlc3QoZXZlbnQua2V5KSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2F0RmlsdGVySW5wdXQoZXZlbnQua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcklucHV0ID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMYXN0RmlsdGVySW5wdXRDaGFyYWN0ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja1R5cGUgPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0/LnZhbHVlLmJsb2NrVHlwZTtcblxuICAgICAgICAgICAgICAgIGlmIChibG9ja1R5cGUpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXG4gICAgICAgICAgICAgICAgdmFsdWU6IGJsb2NrVHlwZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1IdG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51KGJsb2NrVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChibG9ja1R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25jYXRGaWx0ZXJJbnB1dChzdGc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ICs9IHN0Zy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gdGhpcy5maWx0ZXJJbnB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuL0Jhc2VEb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tICcuL0pOb2RlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBub2RlO1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5zZXROZXh0KG5vZGUpO1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vUXVpY2tNZW51JztcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuL1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51U2VjdGlvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnU7XHJcblxyXG4gICAgbWVudUl0ZW1zID0gbmV3IERvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51SXRlbT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBRdWlja01lbnVTZWN0aW9uT3B0aW9ucykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICAgICAgICBjbGFzc0xpc3Q6IG9wdGlvbnMuY2xhc3NMaXN0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW1tZWRpYXRlUGFyZW50ID0gb3B0aW9ucy5xdWlja01lbnVJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLnByb3BzLmNsYXNzTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xyXG4gICAgICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZChcIm5vLXNlbGVjdGlvblwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9ibG9ja1R5cGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pbW1lZGlhdGVQYXJlbnQ6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpY29uSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmxvY2tUeXBlID0gYmxvY2tUeXBlO1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50ID0gaW1tZWRpYXRlUGFyZW50O1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJywgXCJwb2ludGVyXCIsIFwibm8tc2VsZWN0aW9uXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmxvY2stb3BlcmF0aW9uJywgJ2FwcGx5LXNlbGVjdGVkLWJsb2NrLXR5cGUnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnb3B0aW9uJyk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG9wdGlvbkltYWdlLmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1pbWFnZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmcgPSBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLmljb25JZCwgJzEwMCUnKTtcclxuXHJcbiAgICAgICAgb3B0aW9uSW1hZ2UuYXBwZW5kQ2hpbGQoc3ZnLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uSW1hZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgb3B0aW9uVGV4dC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tdGV4dCcpO1xyXG5cclxuICAgICAgICBjb25zdCBibG9ja1RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuY2xhc3NMaXN0LmFkZCgnYmxvY2stdGl0bGUnKTtcclxuICAgICAgICBibG9ja1RpdGxlLmlubmVyVGV4dCA9IHRoaXMucHJvcHMudGl0bGU7XHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tUaXRsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrRGVzY3JpcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5jbGFzc0xpc3QuYWRkKCdibG9jay1kZXNjcmlwdGlvbicpO1xyXG4gICAgICAgIGJsb2NrRGVzY3JpcHRpb24uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5kZXNjcmlwdGlvbjtcclxuXHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tEZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvblRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW1tZWRpYXRlUGFyZW50ICgpOiBRdWlja01lbnVTZWN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW1tZWRpYXRlUGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBibG9ja1R5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmxvY2tUeXBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+ID0gdGhpcy5faW1tZWRpYXRlUGFyZW50Lm1lbnVJdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ltbWVkaWF0ZVBhcmVudC5pbW1lZGlhdGVQYXJlbnQuc3dpdGNoVmlzdWFsRm9jdXMobm9kZSEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51U2VjdGlvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvblwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVJdGVtXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFF1aWNrTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHF1aWNrTWVudTogUXVpY2tNZW51ID0gUXVpY2tNZW51LmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJhc2ljQmxvY2tzU2VjdGlvbjogUXVpY2tNZW51U2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdCYXNpYycsIGNsYXNzTGlzdDogJ2Jhc2ljLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBiYXNpY0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdUZXh0JywgJ1N0YXJ0IHdyaXRpbmcgaW4gcGxhaW4gdGV4dC4nLCAnaWNvbi1tYXRlcmlhbC1mb3JtYXQnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFwicGFyYWdyYXBoIHRleHQgcFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBcImJ1bGxldGVkIGxpc3QgdW5vcmRlcmVkIGxpc3QgdWxcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ051bWJlcmVkIGxpc3QnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnVGFibGUnLCAnT3JnYW5pemUgZGF0YSBpbiByb3dzIGFuZCBjb2x1bW5zLicsICdpY29uLW1hdGVyaWFsLXRhYmxlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwidGFibGUgdHIgdGhcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0NhbGxvdXQnLCAnRW1waGFzaXplIGtleSBwb2ludHMgd2l0aCBhIGNhbGxvdXQgYm94LicsIEljb25zLkNhbGxvdXQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIFwiY2FsbG91dCBub3RlIHNwb3RsaWdodFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQ29kZScsICdJbmNsdWRlIGEgY29kZSBzbmlwcGV0LicsICdpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmsnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBcImNvZGUgc2NyaXB0IHNvdXJjZSBtYXJrdXBcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1F1b3RlJywgJ0hpZ2hsaWdodCB0ZXh0IGFzIGEgcXVvdGUuJywgJ2ljb24td29yZHByZXNzLXF1b3RlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUsIFwicXVvdGUgYmxvY2txdW90ZSBjaXRhdGlvbiBxdW90YXRpb24gY2l0ZVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAyJywgJ01lZGl1bSBoZWFkZXIgZm9yIHNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBcImhlYWRlciAyIGhlYWRpbmcgMiBoMlwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAzJywgJ1NtYWxsIGhlYWRlciBmb3Igc3Vic2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzMsIFwiaGVhZGVyIDMgaGVhZGluZyAzIGgzXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdTZXBhcmF0b3InLCAnVmlzdWFsbHkgZGl2aWRlIGJsb2Nrcy4nLCAnaWNvbi13b3JkcHJlc3Mtc2VwYXJhdG9yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU0VQQVJBVE9SLCBcInNlcGFyYXRvciBkaXZpZGVyIHJ1bGUgbGluZSBoclwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGJhc2ljQmxvY2tzU2VjdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdNZWRpYScsIGNsYXNzTGlzdDogJ21lZGlhLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBtZWRpYUJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2UuJywgSWNvbnMuSW1hZ2UyLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgXCJpbWFnZSBmaWd1cmUgcGhvdG8gaWxsdXN0cmF0aW9uIHBpY3R1cmUgbWVkaWEgdXBsb2FkXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdZb3VUdWJlJywgJ0VtYmVkIGEgWW91VHViZSB2aWRlby4nLCBJY29ucy5Zb3VUdWJlLCAndmlkZW8nLCBcInZpZGVvIGVtYmVkIHlvdXR1YmUgY2xpcCBmaWxtIG1vdmllIHRhcGVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChtZWRpYUJsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgXCJ0b2RvIGxpc3QgdGFzayBsaXN0IGNoZWNrbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdCdWxsZXRlZCBsaXN0JywgJ09yZ2FuaXplIGl0ZW1zIHdpdGggYnVsbGV0IHBvaW50cy4nLCAnaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChsaXN0QmxvY2tzU2VjdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZW1iZWRTZWN0aW9uID0gbmV3IFF1aWNrTWVudVNlY3Rpb24oeyBxdWlja01lbnVJbnN0YW5jZTogcXVpY2tNZW51LCB0aXRsZTogJ0VtYmVkJywgY2xhc3NMaXN0OiAnZW1iZWQtc2VjdGlvbicgfSk7XHJcblxyXG4gICAgICAgIGVtYmVkU2VjdGlvbi5hcHBlbmRRdWlja01lbnVJdGVtcyhbXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdEh1YiBHaXN0JywgJ0VtYmVkIGEgR2l0SHViIEdpc3QuJywgSWNvbnMuR2l0SHViLCAnZ2l0aHViLWdpc3QnLCBcImNvZGUgZ2lzdCBnaXRodWIgc25pcHBldCBnaXRcIiksXHJcbiAgICAgICAgICAgIC8vIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdExhYiBTbmlwcGV0ICcsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsIEljb25zLkdpdExhYiwgJ2dpdGxhYi1zbmlwcGV0JywgXCJjb2RlIGdpdCBnaXRsYWIgc25pcHBldCBnaXN0XCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHaXRMYWIgU25pcHBldCAnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdDb2RlUGVuJywgJ0VtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtby4nLCBJY29ucy5Db2RlUGVuLCAnY29kZXBlbicsIFwiY29kZSBjb2RlcGVuXCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHb29nbGUgTWFwcycsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ1Nwb3RpZnknLCAnRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrLicsIEljb25zLlNwb3RpZnksICdzcG90aWZ5JywgXCJtcDMgc291bmQgYXVkaW8gbXVzaWMgc3BvdGlmeSB0cmFja1wiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChlbWJlZFNlY3Rpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gcXVpY2tNZW51O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidGl0bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgxXCIpO1xyXG4gICAgICAgIGgxLnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcInRydWVcIik7XHJcbiAgICAgICAgaDEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlVudGl0bGVkXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xyXG4gICAgICAgICAgICBoMS50ZXh0Q29udGVudCA9IHRoaXMucHJvcHMudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoMSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSh2YWx1ZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvdGl0bGUvVGl0bGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaXRsZUJ1aWxkZXIge1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRpdGxlIHtcclxuICAgICAgICByZXR1cm4gVGl0bGUuY3JlYXRlKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIGtleWJvYXJkIGFycm93IGRpcmVjdGlvbnMuXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBEaXJlY3Rpb25zIHtcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dVcCcga2V5LCB1c2VkIHRvIG5hdmlnYXRlIHVwd2FyZHMgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93VXAgPSBcIkFycm93VXBcIixcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dEb3duJyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgZG93bndhcmRzIGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0Rvd24gPSBcIkFycm93RG93blwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd0xlZnQnIGtleSwgdXNlZCB0byBuYXZpZ2F0ZSBsZWZ0IGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0xlZnQgPSBcIkFycm93TGVmdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd1JpZ2h0JyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgcmlnaHQgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93UmlnaHQgPSBcIkFycm93UmlnaHRcIixcclxufVxyXG4iLCJleHBvcnQgZW51bSBUYWJsZVNjb3BlcyB7XHJcbiAgICBDb2x1bW4gPSBcIkNvbHVtblwiLFxyXG4gICAgUm93ID0gXCJSb3dcIixcclxuICAgIENlbGwgPSBcIkNlbGxcIixcclxuICAgIFNlbGVjdGVkQ2VsbHMgPSBcIlNlbGVjdGVkQ2VsbHNcIlxyXG59IiwiZXhwb3J0IGVudW0gU2VsZWN0aW9uTW9kZXMge1xyXG4gICAgVGV4dCA9IFwiVGV4dFwiLFxyXG4gICAgQ2VsbCA9IFwiQ2VsbFwiLFxyXG4gICAgQmxvY2sgPSBcIkJsb2NrXCJcclxufSIsImltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xyXG5pbXBvcnQgeyBUb29sYm94T3B0aW9ucyB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbWJlZFRvb2wge1xyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEltYWdlKHVybE9iajogc3RyaW5nLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxPYmopO1xyXG5cclxuICAgICAgICBpZiAoIWF3YWl0IEVtYmVkVG9vbC52YWxpZGF0ZUltYWdlKHVybC50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGltYWdlXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHJcbiAgICAgICAgaW1hZ2Uuc3JjID0gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaW1hZ2UuYWx0ID0gJ0VtYmVkZGVkIEltYWdlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS53aWR0aCA9ICdhdXRvJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7XHJcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoVG9vbGJveE9wdGlvbnMuQWxpZ25Ub29sQ2xhc3MpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1Rvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzLCBcImZpdC1jb250ZW50XCIsIFwieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbGlkYXRlSW1hZ2UodXJsVG9DaGVjazogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmxUb0NoZWNrO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZEdvb2dsZVNoZWV0KHVybE9iajogVVJMLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRJZCA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpWzNdO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlU2hlZXRJZCA9IGVuY29kZVVSSUNvbXBvbmVudChzaGVldElkKTtcclxuXHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLyR7c2FmZVNoZWV0SWR9L3B1Ymh0bWw/d2lkZ2V0PXRydWUmYW1wO2hlYWRlcnM9ZmFsc2VgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzQ1MHB4JztcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSAnMCc7XHJcbiAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1wieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkWW91VHViZVZpZGVvQXNJZnJhbWUodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmxPYmouc2VhcmNoUGFyYW1zLmdldCgndicpO1xyXG4gICAgICAgIGlmICh2aWRlb0lkKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVWaWRlb0lkID0gZW5jb2RlVVJJQ29tcG9uZW50KHZpZGVvSWQpO1xyXG5cclxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3NhZmVWaWRlb0lkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xyXG4gICAgICAgICAgICBpZnJhbWUuYWxsb3cgPSBcImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcIngtcmVzaXphYmxlXCIsIFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzXSwgZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBZb3VUdWJlIHZpZGVvIFVSTCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKTtcclxuICAgICAgICBjb25zdCBzaG9ydElkID0gcGF0aFNlZ21lbnRzW3BhdGhTZWdtZW50cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgaWYgKHNob3J0SWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVTaG9ydElkSWQgPSBlbmNvZGVVUklDb21wb25lbnQoc2hvcnRJZCk7XHJcblxyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7c2FmZVNob3J0SWRJZH1gO1xyXG4gICAgICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93ID0gXCJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCI7XHJcbiAgICAgICAgICAgIGlmcmFtZS5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBTaG9ydHMgVVJMJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZFlvdVR1YmVQbGF5bGlzdEFzSWZyYW1lKHVybE9iajogVVJMLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3RJZCA9IHVybE9iai5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XHJcbiAgICAgICAgaWYgKGxpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBFbWJlZFRvb2wuY3JlYXRlRW1iZWRDb250YWluZXIoW1wiZW1iZWQtY29udGFpbmVyXCJdKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVMaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQobGlzdElkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3ZpZGVvc2VyaWVzP2xpc3Q9JHtzYWZlTGlzdElkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBwbGF5bGlzdCBVUkwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkU3BvdGlmeUNvbnRlbnQodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0eXBlOiBFbWJlZFR5cGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudElkID0gdXJsT2JqLnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3BvdGlmeS1lbWJlZFwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcblxyXG5cclxuICAgICAgICBpZiAoIWNvbnRlbnRJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udGVudElkIGlzIGVtcHR5XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzYWZlQ29udGVudElkID0gZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRlbnRJZCk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZChcInNwb3RpZnktZW1iZWRcIik7XHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vZW1iZWQvJHt0eXBlfS8ke3NhZmVDb250ZW50SWR9YDtcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic2Nyb2xsaW5nXCIsIFwibm9cIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVRyYWNrOlxyXG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiODBweFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q6XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5U2hvdzpcclxuICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlFcGlzb2RlOlxyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUFydGlzdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjM4MHB4XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEdpc3RBc1NjcmlwdCh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBnaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBpZiAoIWdpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBHaXN0IElEXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaGFkb3dFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzaGFkb3ctZWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImdpc3QtZW1iZWQtY29udGFpbmVyXCIsIFwiZmlndXJlLWVtYmVkLWNvbnRhaW5lclwiLCBcImlnbm9yZS10ZXh0LWZsb2F0aW5nLXRvb2xiYXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjEwMHB4XCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xyXG5cclxuXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNoYWRvd0VsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gc2hhZG93RWxlbWVudC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhZmVHaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQoZ2lzdElkKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NyaXB0U3JjID0gYGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLyR7c2FmZUdpc3RJZH0uanNgO1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgc2NyaXB0LnNyYyA9IHNjcmlwdFNyYztcclxuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFdyaXRlID0gZG9jdW1lbnQud3JpdGU7XHJcbiAgICAgICAgbGV0IHNjcmlwdE91dHB1dCA9ICcnO1xyXG4gICAgICAgIGRvY3VtZW50LndyaXRlID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzY3JpcHRPdXRwdXQgKz0gY29udGVudDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gc2NyaXB0T3V0cHV0O1xyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbSh0ZW1wRGl2LmNoaWxkTm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2lzdCBsb2FkZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aGUgR2lzdFwiKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcblxyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZENvZGVwZW5Bc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCA0IHx8IHBhcnRzWzFdID09PSAnJyB8fCBwYXJ0c1szXSA9PT0gJycpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkw6IEV4cGVjdGVkIGZvcm1hdCAvdXNlci97dXNlcm5hbWV9L3Blbi97cGVuSWR9Jyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHBhcnRzWzFdO1xyXG4gICAgICAgIGNvbnN0IHBlbiA9IHBhcnRzWzNdO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlVXNlciA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VyKTtcclxuICAgICAgICBjb25zdCBzYWZlUGVuID0gZW5jb2RlVVJJQ29tcG9uZW50KHBlbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly9jb2RlcGVuLmlvLyR7c2FmZVVzZXJ9L2VtYmVkLyR7c2FmZVBlbn0/aGVpZ2h0PTI2NSZ0aGVtZS1pZD1saWdodCZkZWZhdWx0LXRhYj1qcyxyZXN1bHRgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLm92ZXJmbG93ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LXNhbWUtb3JpZ2luJywpO1xyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICBFbWJlZFRvb2wuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcInktcmVzaXphYmxlXCJdLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBlbnRyeS5jb250ZW50UmVjdDtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGNvbnRhaW5lci5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwib3ZlcmZsb3ctaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUVtYmVkQ29udGFpbmVyKGNsYXNzZXM6IHN0cmluZ1tdID0gW10pOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZmlndXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlndXJlJyk7XHJcbiAgICAgICAgZmlndXJlLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGZpZ3VyZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbGl6ZUVtYmVkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGNvbnRlbnRFbGVtZW50Q2xhc3Nlczogc3RyaW5nW10gPSBbXSwgbGFzdEZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gbGFzdEZvY3VzZWRFbGVtZW50LmNsb3Nlc3QoYC4ke0NvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnR9YCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKC4uLmNvbnRlbnRFbGVtZW50Q2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldyYXBwZXIgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyLXdyYXBwZXJcIik7XHJcbiAgICAgICAgICAgIHRvb2xiYXJXcmFwcGVyPy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBkZXRlcm1pbmVFbWJlZFR5cGUodXJsOiBzdHJpbmcpOiBFbWJlZFR5cGVzIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybE9iai5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmxPYmoucGF0aG5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKC9eKD86LipcXC4pP3Nwb3RpZnlcXC5jb20kLy50ZXN0KGRvbWFpbikpIHtcclxuICAgICAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoXCIvdHJhY2tcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlUcmFjaztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9hcnRpc3RcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlBcnRpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9lcGlzb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5RXBpc29kZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3Nob3dcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlTaG93O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICgvXig/Oi4qXFwuKT8oeW91dHViZVxcLmNvbXx5b3V0dVxcLmJlKSQvLnRlc3QoZG9tYWluKSkge1xyXG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi93YXRjaFwiKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybE9iai5zZWFyY2hQYXJhbXMuaGFzKFwibGlzdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVQbGF5bGlzdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVWaWRlbztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Zb3VUdWJlUGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9zaG9ydHNcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVTaG9ydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcInZpbWVvLmNvbVwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlZpbWVvVmlkZW87XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiZG9jcy5nb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9zcHJlYWRzaGVldHNcIikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEVtYmVkVHlwZXMuR29vZ2xlU2hlZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwidHdpdHRlci5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Ud2VldDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9tYXBzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdvb2dsZU1hcDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnaXN0LmdpdGh1Yi5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5HaXRIdWJHaXN0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcImdpdGxhYi5jb21cIiAmJiBwYXRoLmluY2x1ZGVzKFwiL3NuaXBwZXRzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdpdExhYlNuaXBwZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiY29kZXBlbi5pb1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkNvZGVQZW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGVudW0gRW1iZWRUeXBlcyB7XHJcbiAgICBTcG90aWZ5VHJhY2sgPSBcInRyYWNrXCIsXHJcbiAgICBTcG90aWZ5UGxheWxpc3QgPSBcInBsYXlsaXN0XCIsXHJcbiAgICBTcG90aWZ5QXJ0aXN0ID0gXCJhcnRpc3RcIixcclxuICAgIFNwb3RpZnlFcGlzb2RlID0gXCJlcGlzb2RlXCIsXHJcbiAgICBTcG90aWZ5U2hvdyA9IFwic2hvd1wiLFxyXG4gICAgWW91VHViZVZpZGVvID0gXCJ2aWRlb1wiLFxyXG4gICAgWW91VHViZVBsYXlsaXN0ID0gXCJwbGF5bGlzdFwiLFxyXG4gICAgWW91VHViZVNob3J0ID0gXCJzaG9ydFwiLFxyXG4gICAgVmltZW9WaWRlbyA9IFwidmlkZW9cIixcclxuICAgIEdvb2dsZVNoZWV0ID0gXCJzaGVldFwiLFxyXG4gICAgVHdlZXQgPSBcInR3ZWV0XCIsXHJcbiAgICBHb29nbGVNYXAgPSBcIm1hcFwiLFxyXG4gICAgR2l0SHViR2lzdCA9IFwiZ2lzdFwiLFxyXG4gICAgR2l0TGFiU25pcHBldCA9IFwic25pcHBldFwiLFxyXG4gICAgQ29kZVBlbiA9IFwicGVuXCJcclxufSIsImV4cG9ydCBlbnVtIFRvb2xiYXJJRHMge1xyXG4gICAgVGFibGVUb29sYmFyID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiLFxyXG4gICAgVGV4dFRvb2xiYXIgPSBcInRleHRGbG9hdGluZ1Rvb2xiYXJcIlxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIHNwZWNpZnlpbmcgYm91bmRhcmllcyB3aXRoaW4gYW4gZWxlbWVudC5cclxuICogQGVudW0ge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBlbnVtIEJvdW5kYXJpZXMge1xyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGZpcnN0IGxpbmUgb2YgYW4gZWxlbWVudCwgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydGluZyBib3VuZGFyeS4gKi9cclxuICAgIEZpcnN0ID0gXCJGaXJzdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGxhc3QgbGluZSBvZiBhbiBlbGVtZW50LCBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZGluZyBib3VuZGFyeS4gKi9cclxuICAgIExhc3QgPSBcIkxhc3RcIlxyXG59IiwiaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBhZGRSb3codGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydFBvc2l0aW9uID0gKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPD0gdGFibGUucm93cy5sZW5ndGgpID8gcG9zaXRpb24gOiB0YWJsZS5yb3dzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuZXdSb3cgPSB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBudW1Db2x1bW5zID0gQXJyYXkuZnJvbSh0YWJsZS5yb3dzKS5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5jZWxscy5sZW5ndGgpLCAwKTtcclxuICAgICAgICBsZXQgYWZmZWN0ZWRDZWxscyA9IFtdOyAgLy8gQXJyYXkgdG8gaG9sZCByZWZlcmVuY2VzIHRvIG5ldyBjZWxsc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3Um93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiRW50ZXIgdGV4dFwiKTtcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKFwiZWRpdGFibGVcIik7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMucHVzaChjZWxsKTsgIC8vIEFkZCBjZWxsIHJlZmVyZW5jZSB0byBhcnJheVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuY2xhc3NMaXN0LnJlbW92ZShcInRlbXBvcmFyeS1zaGFkb3dcIikpO1xyXG4gICAgICAgIH0sIDcwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFkZENvbHVtbih0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0UG9zaXRpb24gPSBwb3NpdGlvbiAhPT0gbnVsbCA/IHBvc2l0aW9uIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBhZmZlY3RlZENlbGxzID0gW107ICAvLyBBcnJheSB0byBob2xkIHJlZmVyZW5jZXMgdG8gbmV3IGNlbGxzXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gdGFibGUucm93c1tpXS5pbnNlcnRDZWxsKGluc2VydFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiY2VsbFwiKTtcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKFwiZWRpdGFibGVcIik7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMucHVzaChjZWxsKTsgIC8vIEFkZCBjZWxsIHJlZmVyZW5jZSB0byBhcnJheVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGFmZmVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuY2xhc3NMaXN0LnJlbW92ZShcInRlbXBvcmFyeS1zaGFkb3dcIikpO1xyXG4gICAgICAgIH0sIDcwMCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBpc0xhc3RDb2x1bW4odGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0YWJsZS5jb250YWlucyhjZWxsKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjZWxsUm93ID0gY2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgbGFzdENlbGxJblJvdyA9IGNlbGxSb3cuY2VsbHNbY2VsbFJvdy5jZWxscy5sZW5ndGggLSAxXTtcclxuICAgICAgICByZXR1cm4gY2VsbCA9PT0gbGFzdENlbGxJblJvdztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNMYXN0Um93KHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGFibGUuY29udGFpbnMoY2VsbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxhc3RSb3dJblRhYmxlID0gdGFibGUucm93c1t0YWJsZS5yb3dzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIHJldHVybiBjZWxsUm93ID09PSBsYXN0Um93SW5UYWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ29sdW1uQnlDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRkXCIgJiYgY2VsbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwidGhcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYSB0YWJsZSBjZWxsLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gcm93LnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IGNlbGwuY2VsbEluZGV4O1xyXG5cclxuICAgICAgICAvLyBBZGQgZmFkZS1vdXQgY2xhc3MgdG8gYWxsIGNlbGxzIGluIHRoZSBjb2x1bW5cclxuICAgICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRhYmxlLnJvd3NbaV0uY2VsbHNbY29sdW1uSW5kZXhdLmNsYXNzTGlzdC5hZGQoXCJmYWRlLW91dFwiKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgLy8gRGVsYXkgdGhlIGNvbHVtbiByZW1vdmFsIGZvciAzMDAgbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPCB0YWJsZS5yb3dzW2ldLmNlbGxzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNvbHVtbkluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0YWJsZS5yb3dzW2ldLmRlbGV0ZUNlbGwoY29sdW1uSW5kZXgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSwgOTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlUm93QnlDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRkXCIgJiYgY2VsbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwidGhcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYSB0YWJsZSBjZWxsLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gcm93LnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gQWRkIGZhZGUtb3V0IGNsYXNzIHRvIGFsbCBjZWxscyBpbiB0aGUgcm93XHJcbiAgICAgICAgLy8gQXJyYXkuZnJvbShyb3cuY2VsbHMpLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImZhZGUtb3V0XCIpO1xyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBEZWxheSB0aGUgcm93IHJlbW92YWwgZm9yIDMwMCBtaWxsaXNlY29uZHNcclxuXHJcbiAgICAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0YWJsZS5kZWxldGVSb3cocm93LnJvd0luZGV4KTtcclxuICAgICAgICAvLyB9LCA5MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRBY3RpdmVUYWJsZUNlbGwoKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RkJykge1xyXG4gICAgICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhY3RpdmVFbGVtZW50Py5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50IHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHN0YXRpYyBpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGFyZ2V0SGV4Q29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgIC8vICAgICBpZiAoIWFjdGl2ZUNlbGwgfHwgYWN0aXZlQ2VsbC50YWdOYW1lICE9PSAnVEQnIHx8ICFhY3RpdmVDZWxsLmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgICB9XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVDZWxsKTtcclxuICAgIC8vICAgICBjb25zdCBjdXJyZW50QmFja2dyb3VuZENvbG9yID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGhleEJhY2tncm91bmRDb2xvciA9IFV0aWxzLnJnYlRvSGV4KGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IpO1xyXG5cclxuICAgIC8vICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHRhcmdldEhleENvbG9yLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAvLyB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBnZXRMYXN0VGFibGVDZWxsKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gdGFibGUucm93cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5yb3dzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gcm93LmNlbGxzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzW2pdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiBjZWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRGaXJzdFRhYmxlQ2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlLnJvd3NbaV07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzW2pdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwuaXNDb250ZW50RWRpdGFibGUpIHJldHVybiBjZWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZWlnaGJvckNlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwge1xyXG5cclxuICAgICAgICBpZiAoIWNlbGwucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gKGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50KS5yb3dJbmRleDtcclxuICAgICAgICBjb25zdCBjZWxsSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93UmlnaHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50KS5jZWxsc1tjZWxsSW5kZXggKyAxXSA/PyBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbnMuQXJyb3dMZWZ0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkuY2VsbHNbY2VsbEluZGV4IC0gMV0gPz8gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93VXA6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUucm93c1tyb3dJbmRleCAtIDFdPy5jZWxsc1tjZWxsSW5kZXhdID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd0Rvd246XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUucm93c1tyb3dJbmRleCArIDFdPy5jZWxsc1tjZWxsSW5kZXhdID8/IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGNoYW5nZUNlbGxCb3JkZXJDb2xvcihcclxuICAgICAgICB0YWJsZTogSFRNTFRhYmxlRWxlbWVudCxcclxuICAgICAgICBzY29wZTogVGFibGVTY29wZXMsXHJcbiAgICAgICAgY29sb3I6IHN0cmluZ1xyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IGNlbGxzVG9DaGFuZ2U6IE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+IHwgSFRNTENvbGxlY3Rpb25PZjxIVE1MVGFibGVDZWxsRWxlbWVudD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChzY29wZSkge1xyXG4gICAgICAgICAgICBjYXNlIFRhYmxlU2NvcGVzLkNvbHVtbjpcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gKHRhYmxlLnF1ZXJ5U2VsZWN0b3IoXCJ0ZC5zZWxlY3RlZFwiKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCk/LmNlbGxJbmRleDtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoYHRkOm50aC1jaGlsZCgke2NvbHVtbkluZGV4ICsgMX0pYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5Sb3c6XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGwgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKFwidGQuc2VsZWN0ZWRcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gc2VsZWN0ZWRDZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsc1RvQ2hhbmdlID0gcm93LmNlbGxzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuQ2VsbDpcclxuICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQuc2VsZWN0ZWRcIikgYXMgTm9kZUxpc3RPZjxIVE1MVGFibGVDZWxsRWxlbWVudD47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5TZWxlY3RlZENlbGxzOlxyXG4gICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZC5zZWxlY3RlZFwiKSBhcyBOb2RlTGlzdE9mPEhUTUxUYWJsZUNlbGxFbGVtZW50PjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzY29wZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2VsbHNUb0NoYW5nZSkge1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgICBBcnJheS5mcm9tKGNlbGxzVG9DaGFuZ2UpLmZvckVhY2goKGNlbGwpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlciA9IGAxcHggZG91YmxlICR7Y29sb3J9YDtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9IGAxcHggZG91YmxlICR7Y29sb3J9YDtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm94U2hhZG93ID0gYDAgMCAwIDFweCAke2NvbG9yfSBpbnNldGA7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgYm94U2hhZG93ID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUoJ2JveC1zaGFkb3cnKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJvcmRlciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXInKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJiYlwiKTtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm9yZGVyID0gYm9yZGVyO1xyXG4gICAgICAgICAgICAgICAgLy8gY2VsbC5zdHlsZS5ib3hTaGFkb3cgPSBib3hTaGFkb3c7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0JveCBTaGFkb3c6JywgYm94U2hhZG93KTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3JkZXI6JywgYm9yZGVyKTtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBtb3ZlRm9jdXNUb0JlbG93Q2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBuZXh0Um93ID0gY2VsbC5wYXJlbnRFbGVtZW50Py5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTFRhYmxlUm93RWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgaWYgKCFuZXh0Um93KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gY2VsbCBiZWxvd1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcbiAgICAgICAgY29uc3QgYmVsb3dDZWxsID0gbmV4dFJvdy5jZWxsc1tjZWxsSW5kZXhdO1xyXG4gICAgICAgIGlmICghYmVsb3dDZWxsIHx8ICFiZWxvd0NlbGwuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBObyBlZGl0YWJsZSBjZWxsIGJlbG93XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBiZWxvd0NlbGwuZm9jdXMoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElRdWlja01lbnUgfSBmcm9tIFwiLi4vcXVpY2stbWVudS9JUXVpY2tNZW51XCI7XHJcbmltcG9ydCB7IElTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gXCJAL2NvcmUvSVNob3J0Y3V0TGlzdGVuZXJzXCI7XHJcbmltcG9ydCB7IElUYWJsZUxpc3RlbmVycyB9IGZyb20gXCJAL2NvcmUvbGlzdGVuZXJzL0lUYWJsZUxpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udGVudCBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe30pO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiY29udGVudFwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gXCIxLjNyZW1cIjtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmluY2x1ZGVGaXJzdFBhcmFncmFwaCB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZChFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGgoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENsZWFycyB0ZXh0IHNlbGVjdGlvbiB3aGVuIGluaXRpYXRpbmcgYSBkcmFnIGZyb20gZWxlbWVudHMgd2l0aCB0aGUgYC5kcmFnLWhhbmRsZXJgIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIGEgYG1vdXNlZG93bmAgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVudGlyZSBkb2N1bWVudC4gV2hlbiBhIG1vdXNlZG93blxyXG4gICAgKiBldmVudCBvY2N1cnMgb24gYW4gZWxlbWVudCB0aGF0IGlzIGEgY2hpbGQgb2YgYSBgLmRyYWctaGFuZGxlcmAgb3Igb24gdGhlIGAuZHJhZy1oYW5kbGVyYCBpdHNlbGYsXHJcbiAgICAqIGl0IGNoZWNrcyBpZiB0aGUgdGFyZ2V0IG9yIGl0cyBwYXJlbnQgaXMgYSBkZXNpZ25hdGVkIGRyYWcgaGFuZGxlci4gSWYgdHJ1ZSwgaXQgY2xlYXJzIGFueSBjdXJyZW50IHRleHQgc2VsZWN0aW9ucy5cclxuICAgICogVGhpcyBwcmV2ZW50cyB0ZXh0IGZyb20gYmVpbmcgYWNjaWRlbnRhbGx5IHNlbGVjdGVkIGR1cmluZyBkcmFnLWFuZC1kcm9wIGludGVyYWN0aW9ucywgZW5oYW5jaW5nIFVYIGluIGRyYWdnYWJsZSBpbnRlcmZhY2VzLlxyXG4gICAgKiBcclxuICAgICogQGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uT25EcmFnXHJcbiAgICAqL1xyXG4gICAgY2xlYXJTZWxlY3Rpb25PbkRyYWcoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgbGV0IHBhcmVudDogRWxlbWVudCB8IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuY2xvc2VzdChcIi5kcmFnLWhhbmRsZXJcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaEV2ZW50KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uT25EcmFnKCk7XHJcbiAgICAgICAgdGhpcy5yZVJlbmRlclBsYWNlaG9sZGVyKCk7XHJcblxyXG5cclxuICAgICAgICAvLyBFdmVudCBzZWxlY3RvclxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIGEgY2xhc3NlICdibG9jay1zZWxlY3RlZCcgZGUgcXVhbHF1ZXIgYmxvY28gcHJldmlhbWVudGUgc2VsZWNpb25hZG9cclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTZWxlY3RlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWQuZm9yRWFjaChzZWxlY3RlZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdzZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTsgLy8gUmVtb3ZlIHRhYmluZGV4IHF1YW5kbyBuw6NvIGVzdMOhIG1haXMgc2VsZWNpb25hZG9cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBWZXJpZmljYSBzZSBvIGVsZW1lbnRvIGNsaWNhZG8gw6kgdW0gZmlsaG8gZGUgdW0gJ3NlcGFyYXRvcidcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50OyAvLyBDYXN0IGRvIHRhcmdldCBwYXJhIEhUTUxFbGVtZW50XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQuY2xvc2VzdChcIi5zZXBhcmF0b3Itd3JhcHBlclwiKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50QmxvY2sgPSBjdXJyZW50RWxlbWVudC5jbG9zZXN0KCcuc2VwYXJhdG9yLXdyYXBwZXInKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCBwYXJhIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jay5jbGFzc0xpc3QuYWRkKCdzZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRCbG9jay5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7IC8vIEFkaWNpb25hIHRhYmluZGV4IHBhcmEgcGVybWl0aXIgZm9jb1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2suZm9jdXMoKTsgLy8gQ29sb2NhIG8gZm9jbyBubyBibG9jbyBzZWxlY2lvbmFkb1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQmx1ciwgKGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbG9zZXN0KCcuc2VwYXJhdG9yLXNlbGVjdGVkJykpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHRhcmdldC5jbG9zZXN0KCcuc2VwYXJhdG9yLXNlbGVjdGVkJykhO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlcGFyYXRvci5jbGFzc0xpc3QucmVtb3ZlKCdzZXBhcmF0b3Itc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgIHNlcGFyYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7IC8vIExpbXBhIG8gYXRyaWJ1dG8gcGFyYSBuw6NvIGludGVyZmVyaXIgY29tIGEgbmF2ZWdhw6fDo28gbm9ybWFsXHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVhcGxpY2FyIGF0cmlidXRvcyBxdWUgZ2FyYW50ZW0gbyBmb2NvXHJcbiAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgICBzZXBhcmF0b3Iuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpO1xyXG4gICAgICAgICAgICAgICAgLy8gfSwgNTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcbiAgICAgICAgLy9lbmQgZXZlbnQgc2VsZWN0b3JcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb3BpZWRUZXh0XCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY29weUVsZW1lbnRJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjb3B5T3B0aW9uIC50ZXh0LW9wdGlvbiBzcGFuXCIpIGFzIEhUTUxTcGFuRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGNvcHlFbGVtZW50SXRlbSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29waWVkIVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvcHlFbGVtZW50SXRlbS50ZXh0Q29udGVudCA9IFwiQ29weVwiO1xyXG4gICAgICAgICAgICAgICAgfSwgMTUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9Gb2N1cyBvbiBQIHdoZW4gbG9hZFxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1lZGl0b3InKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIGxldCBibG9ja3MgPSBlZGl0b3IucXVlcnlTZWxlY3RvckFsbCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gYmxvY2tzWzBdLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocC5pbm5lclRleHQgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50LXdyYXBwZXIgLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLnByZXNzZWRFbnRlck9uVGl0bGUsIHt9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgYXN5bmMgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoRE9NVXRpbHMuaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZihldmVudCwgXCIuaWdub3JlLWV2ZW50c1wiKSAmJiBldmVudC5rZXkgIT09ICdUYWInKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9vbGJhciA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyPihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5FbnRlciAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIXF1aWNrTWVudS5pc1Zpc2libGUgJiYgIXRhYmxlVG9vbGJhci5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZihET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5qb2hhbm5lcy1jb2RlXCIpKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoXCIudGFibGUtY29udHJvbGxlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5jbG9zZXN0KFwidGQsIHRoXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVDb250cm9sbGVyLnF1ZXJ5U2VsZWN0b3IoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkQmVsb3cgPSBUYWJsZVV0aWxzLm1vdmVGb2N1c1RvQmVsb3dDZWxsKHRhYmxlLCBhY3RpdmVDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2N1c2VkQmVsb3cpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZm9jdXNPbk5leHRCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCkuY2xvc2VzdChcIi5qb2hhbm5lcy1jb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgYmxvY2sgd2hlbiBwcmVzcyBFbnRlclxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnROZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5CYWNrc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2VwYXJhdG9yLXdyYXBwZXInKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0U3RhcnQgJiYgc2VsZWN0ZWRDb250ZW50Py5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLm1lcmdlV2l0aFByZXZpb3VzQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZXBhcmF0b3Itd3JhcHBlcicpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uTmV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0RW5kICYmIHNlbGVjdGVkQ29udGVudD8ubGVuZ3RoID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5tZXJnZVdpdGhOZXh0QmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgJiYgQ29udGVudC5pc0N1cnNvckF0RW5kKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgQ29udGVudC5pc0N1cnNvckF0U3RhcnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgQ29udGVudC5pc0N1cnNvck9uTGFzdExpbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgQ29udGVudC5pc0N1cnNvck9uRmlyc3RMaW5lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fUFJFVklPVVMsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiLmpvaGFubmVzLWNvZGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYkNoYXJhY3RlciA9ICdcXHUwMGEwXFx1MDBhMFxcdTAwYTBcXHUwMGEwJztcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcsIGZhbHNlLCB0YWJDaGFyYWN0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CbHVyLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLnNhbml0aXplRWxlbWVudEV2ZW50SGFuZGxlcihldmVudCksIHRydWUpXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHNhbml0aXplRWxlbWVudEV2ZW50SGFuZGxlcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY29udGVudEVkaXRhYmxlID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBET01VdGlscy5zYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZSh0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZHMgYW4gaW5wdXQgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVudGlyZSBkb2N1bWVudCB0byBoYW5kbGUgcGxhY2Vob2xkZXIgYmVoYXZpb3IgZm9yIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50cy5cclxuICAgICogVGhpcyB3b3JrYXJvdW5kIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBhZGRyZXNzIGEga25vd24gaXNzdWUgaW4gRmlyZWZveCB3aGVyZSBjb250ZW50RWRpdGFibGUgZWxlbWVudHNcclxuICAgICogZG8gbm90IHByb3Blcmx5IHJlc2V0IHRoZWlyIHBsYWNlaG9sZGVycyBhZnRlciB0aGUgY29udGVudCBpcyBkZWxldGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgKiBcclxuICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGNoZWNrcyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBpbnB1dCBldmVudCBpcyBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50IGFuZCB3aGV0aGVyIGl0IGhhcyBhXHJcbiAgICAqIGN1c3RvbSAnZGF0YS1wbGFjZWhvbGRlcicgYXR0cmlidXRlLiBJZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgZW1wdHkgKGlnbm9yaW5nIHdoaXRlIHNwYWNlcyksIHRoZSBmdW5jdGlvblxyXG4gICAgKiByZXNldHMgdGhlICdkYXRhLXBsYWNlaG9sZGVyJyB0byBlbnN1cmUgaXQgZGlzcGxheXMgY29ycmVjdGx5LCBhbmQgY2xlYXJzIGFueSByZXNpZHVhbCB0ZXh0IGNvbnRlbnQgdGhhdCBtaWdodFxyXG4gICAgKiBpbnRlcmZlcmUgd2l0aCB0aGUgcGxhY2Vob2xkZXIgZGlzcGxheS5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIHV0aWxpemUgdGhpcyB3b3JrYXJvdW5kLCBlbnN1cmUgeW91ciBjb250ZW50RWRpdGFibGUgZWxlbWVudHMgaGF2ZSBhICdkYXRhLXBsYWNlaG9sZGVyJyBhdHRyaWJ1dGUuXHJcbiAgICAqIC8vIDxkaXYgY29udGVudEVkaXRhYmxlPVwidHJ1ZVwiIGRhdGEtcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0IGhlcmUuLi5cIj48L2Rpdj5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGlucHV0IGV2ZW50IHRyaWdnZXJlZCBieSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIGRvY3VtZW50J3MgaW5wdXQtY2FwYWJsZSBlbGVtZW50cy5cclxuICAgICovXHJcbiAgICByZVJlbmRlclBsYWNlaG9sZGVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLklucHV0LCBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVBsYWNlaG9sZGVyID0gZWRpdGFibGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGN1c3RvbVBsYWNlaG9sZGVyIHx8ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRFbmQodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IHRhcmdldC5jbG9zZXN0KCcuZm9jdXNhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb2N1c2FibGVQYXJlbnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIGVuZE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5lbmRPZmZzZXQgPT09IChyYW5nZS5lbmRDb250YWluZXIudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JBdFN0YXJ0KHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIHN0YXJ0Tm9kZSA9PT0gZm9jdXNhYmxlUGFyZW50ICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0Rmlyc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGVsZW1lbnQsIDApO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlVG9wID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlVG9wID09PSBlbGVtZW50VG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0TGFzdFZpc2libGVMaW5lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgIHJhbmdlLnNldEVuZChlbGVtZW50LCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCByYW5nZUJvdHRvbSA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgICAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZUJvdHRvbSA9PT0gZWxlbWVudEJvdHRvbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGRpZEN1cnNvck1vdmUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdCA9IG9yaWdpbmFsUmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSBuZXdSYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRNb3ZlID0gIShvcmlnaW5hbFJlY3QudG9wID09PSBuZXdSZWN0LnRvcCAmJiBvcmlnaW5hbFJlY3QubGVmdCA9PT0gbmV3UmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgICAgIGlmICghZGlkTW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRpZE1vdmUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbnRlbnQge1xyXG5cclxuICAgICAgICBjb25zdCBzaG9ydGN1dExpc3RlbmVyID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElTaG9ydGN1dExpc3RlbmVycz4oXCJJU2hvcnRjdXRMaXN0ZW5lcnNcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVMaXN0ZW5lcnMgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlTGlzdGVuZXJzPihcIklUYWJsZUxpc3RlbmVyc1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnRCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBDb250ZW50IHtcclxuICAgICAgICByZXR1cm4gQ29udGVudC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9JVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9jb21tb24vRGlyZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCIuLi8uLi9jb21tb24vRE9NRWxlbWVudHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlcyB9IGZyb20gXCIuL1NlbGVjdGlvbk1vZGVcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBGbG9hdGluZ1Rvb2xiYXIgaW1wbGVtZW50cyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuICAgIHNlbGVjdGVkQ2VsbHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10gPSBbXTtcclxuICAgIGFjdHVhbEZvY3VzZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xyXG5cclxuXHJcbiAgICAvLyBUaGUgc2VsZWN0aW9uIG1vZGUgYW5kIHNlbGVjdGlvbkFjdGl2ZUZsYWcgd29yayB0b2dldGhlciB3aGVuIHdlIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluc2lkZSBhIGNlbGwgb3IgcHJlc3Mgc2hpZnQgdG8gYWN0aXZhdGUgdGhlIHNlbGVjdGlvbkFjdGl2ZUZsYWcuXHJcbiAgICAvLyBBZnRlciBhY3RpdmF0aW5nIHRoZSBmbGFnLCB3ZSBjYW4gc2VsZWN0IHRleHQgaW5zaWRlIGEgY2VsbC4gSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgdGV4dCBpbnNpZGUgdGhlIGNlbGwgdXNpbmcgc2hpZnQgKyBkaXJlY3Rpb25hbCBrZXlzIG9yIHBsYWNlIHRoZSBjdXJzb3Igb3V0c2lkZVxyXG4gICAgLy8gdGhlIGFjdGl2ZSBjZWxsLCBpdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGVudGVyIGNlbGwgc2VsZWN0aW9uIG1vZGUuIFdlIGNoYW5nZSB0aGUgc2VsZWN0aW9uIG1vZGUgaW4gdGhlc2UgY2FzZXMuXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlcyA9IFNlbGVjdGlvbk1vZGVzLlRleHQ7IC8vIFRoZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlXHJcbiAgICBzZWxlY3Rpb25GbGFnOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgdG8gdHJhY2sgd2hldGhlciB0ZXh0IHNlbGVjdGlvbiBpcyBhY3RpdmVcclxuICAgIHNlbGVjdGVkVGV4dDogc3RyaW5nID0gXCJcIjsgLy8gU3RvcmFnZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaywgdGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUgPSB0aGlzLmNsZWFyQW5kSGlkZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4Lk1vZGVyYXRlbHlJbXBvcnRhbnQ7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCB0aGlzLmhhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIHRoaXMuaGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVTdGFydFNlbGVjdGlvbkluQ2VsbEtleURvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXl1cCwgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hVSUV2ZW50KCk7XHJcblxyXG4gICAgICAgIHN1cGVyLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjZWxsICYmICFjZWxsLm1hdGNoZXMoJy5maWd1cmUtZW1iZWQtY29udGFpbmVyIHRkJykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJNb3VzZURvd24gZXZlbnQgb246IFwiLCBldmVudC50YXJnZXQpO1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsICE9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQWxsKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGNlbGwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2Rlcy5UZXh0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBTZWxlY3Rpb25Nb2Rlcy5DZWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0aW9uU3RhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50Q2VsbCAmJiAhY3VycmVudENlbGwubWF0Y2hlcygnLmdpc3QgdGQnKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRW50ZXIgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgLy8gYWxlcnQoXCJqdW1wIHRvIG5leHQgbGluZVwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVzY2FwZSAmJiB0aGlzLmNhbkhpZGUgJiYgIVRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkuaXNWaXNpYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCAxMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVTdGFydFNlbGVjdGlvbkluQ2VsbEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudENlbGwgJiYgIWN1cnJlbnRDZWxsLm1hdGNoZXMoJy5naXN0IHRkJykpIHtcclxuICAgICAgICAgICAgaWYgKCFldmVudC5yZXBlYXQgJiYgZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRmxhZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2Rlcy5UZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENlbGwoY3VycmVudENlbGwpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUNlbGxTZWxlY3Rpb25Db250aW51YXRpb25PbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudENlbGwgJiYgIWN1cnJlbnRDZWxsLm1hdGNoZXMoJy5naXN0IHRkJykpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gU2VsZWN0aW9uTW9kZXMuQ2VsbCAmJiBldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkuc3RhcnRzV2l0aCgnQXJyb3cnKSAmJiAhZXZlbnQucmVwZWF0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY3VycmVudENlbGwuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDZWxsID0gVGFibGVVdGlscy5nZXROZWlnaGJvckNlbGwodGFibGUsIGN1cnJlbnRDZWxsLCBldmVudC5rZXkgYXMgRGlyZWN0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGN1cnJlbnRDZWxsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKG5leHRDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplVGV4dCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGV4dFxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXHJcbiAgICAgICAgICAgIC50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbiBmcm9tIHRoZSBkb2N1bWVudFxyXG4gICAgKiB3aXRoIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dC4gSWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1hdGNoZXMgdGhlIHByZXZpb3VzbHkgc3RvcmVkXHJcbiAgICAqIHNlbGVjdGlvbiwgaXQgc3dpdGNoZXMgdGhlIHNlbGVjdGlvbiBtb2RlIHRvIGNlbGwgc2VsZWN0aW9uIGFuZCByZXNldHMgdGhlIHNlbGVjdGVkIHRleHQuXHJcbiAgICAqIElmIHRoZXJlIGlzIGEgbmV3IHNlbGVjdGlvbiAoYWN0dWFsU2VsZWN0aW9uIGlzIG5vdCBlbXB0eSksIGl0IHVwZGF0ZXMgdGhlIHN0b3JlZCBzZWxlY3RlZCB0ZXh0XHJcbiAgICAqIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxyXG4gICAgKlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVUZXh0KHNlbGVjdGlvbi50b1N0cmluZygpLnRyaW0oKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENlbGwubWF0Y2hlcygnLmdpc3QgdGQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRleHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQoKGN1cnJlbnRDZWxsLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8oY3VycmVudENlbGwpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaW50ZXJhY3Rpb24ga2VlcHMgdGhlIG1lbnUgdmlzaWJsZSBhZnRlciBhbGwgdGV4dCBpcyBzZWxlY3RlZCwgZW5oYW5jaW5nIHVzZXIgZW5nYWdlbWVudC4gXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBwcmVzc2VzIGEgZGlyZWN0aW9uYWwga2V5IGFnYWluIGJleW9uZCB0aGlzIHBvaW50LCB0aGUgbWVudSBpcyBoaWRkZW4gYW5kIGNlbGwgc2VsZWN0aW9uIG1vZGUgaXMgaW5pdGlhdGVkLCBcclxuICAgICAgICAgICAgICAgIC8vIHN0cmVhbWxpbmluZyB0aGUgaW50ZXJmYWNlIGFuZCBmb2N1c2luZyBvbiBzdWJzZXF1ZW50IHRhc2tzLlxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgKGF0U3RhcnQgfHwgYXRFbmQpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGFjdHVhbFNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3Rpb24gZmxhZyBpcyBzZXQsIGluZGljYXRpbmcgdGhhdCBzZWxlY3Rpb24gdXBkYXRlcyBzaG91bGQgYmUgbW9uaXRvcmVkXHJcbiAgICAvLyAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgLy8gICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGZyb20gdGhlIGRvY3VtZW50XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKS50cmltKCkgfHwgXCJcIik7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgY3VycmVudENlbGxUZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KChjdXJyZW50Q2VsbC50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpO1xyXG5cclxuICAgIC8vICAgICAgICAgbGV0IGlzVGhlRW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uPy5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25SYW5nZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0T2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gc2VsZWN0aW9uUmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxUZXh0TGVuZ3RoID0gY3VycmVudENlbGxUZXh0Lmxlbmd0aDtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0IHx8IGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGNlbGwgdGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBpc1RoZUVuZCA9IHNlbGVjdGlvbkVuZE9mZnNldCA+PSBjZWxsVGV4dExlbmd0aDtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgfHwgZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93VXApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGNhcmV0IGJlaW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgY2VsbCB0ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzVGhlRW5kID0gc2VsZWN0aW9uU3RhcnRPZmZzZXQgPT09IDA7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gbWF0Y2hlcyB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHRcclxuICAgIC8vICAgICAgICAgaWYgKGN1cnJlbnRDZWxsVGV4dCA9PT0gXCJcIiB8fCAoYWN0dWFsU2VsZWN0aW9uID09PSB0aGlzLnNlbGVjdGVkVGV4dC50cmltKCkgJiYgaXNUaGVFbmQpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSB0aGUgc2FtZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXNuJ3QgY2hhbmdlZCxcclxuICAgIC8vICAgICAgICAgICAgIC8vIHNvIHN3aXRjaCB0byBjZWxsIHNlbGVjdGlvbiBtb2RlIGFuZCByZXNldCB0aGUgc3RvcmVkIHRleHRcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICAvLyAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsU2VsZWN0aW9uKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24sIHVwZGF0ZSB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQgdG8gdGhlIG5ldyB2YWx1ZVxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRleHQgPSBhY3R1YWxTZWxlY3Rpb247XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBtb2RlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgbW91c2UgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBmb2N1c2VkIGNlbGwsIGFuZCBpZiBzbywgc3dpdGNoZXMgdGhlXHJcbiAgICAqIHNlbGVjdGlvbiBtb2RlIHRvIGNlbGwgc2VsZWN0aW9uIG1vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50IC0gVGhlIG1vdXNlIGV2ZW50IHRoYXQgdHJpZ2dlcnMgdGhpcyBmdW5jdGlvbiwgdHlwaWNhbGx5IGludm9sdmluZyBtb3VzZSBtb3ZlbWVudC5cclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZyAmJiB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjZWxsUmVjdCA9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVggPSBldmVudC5jbGllbnRYO1xyXG4gICAgICAgICAgICBjb25zdCBtb3VzZVkgPSBldmVudC5jbGllbnRZO1xyXG5cclxuICAgICAgICAgICAgaWYgKCEobW91c2VYID49IGNlbGxSZWN0LmxlZnQgJiYgbW91c2VYIDw9IGNlbGxSZWN0LnJpZ2h0ICYmIG1vdXNlWSA+PSBjZWxsUmVjdC50b3AgJiYgbW91c2VZIDw9IGNlbGxSZWN0LmJvdHRvbSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGVzLkNlbGw7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50Q2VsbCkge1xyXG5cclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3Rpb25TdGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkU2VsZWN0ZWRDZWxsKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2hhbmdlIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsIG9ubHkgaWYgYXQgc2FtZSB0YWJsZVxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgY2VsbC5mb2N1cygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkQ2VsbCA9IHRoaXMuc2VsZWN0ZWRDZWxsc1t0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTZWxlY3RlZENlbGxUYWJsZSA9IGxhc3RTZWxlY3RlZENlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGxUYWJsZSA9IGNlbGwuY2xvc2VzdCgndGFibGUnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0ZWRDZWxsVGFibGUgPT09IGN1cnJlbnRDZWxsVGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZENlbGxzLmluZGV4T2YoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLnB1c2goY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSB0aGUgYWN0dWFsIGZvY3VzZWQgY2VsbCBvbmx5IGlmIGF0IHNhbWUgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gY2VsbDtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vQ2VsdWxhIGrDoSBmYXogcGFydGUgZGEgbGlzdGEgYXBlbmFzIGZvY2EgZSBjb250aW51YVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHRoaXMuaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmIChUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaWQgPT0gZGV0YWlscy50YXJnZXRJZCEpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGZvY3VzZWQgY2VsbCBmb3VuZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlc2V0QWJvcnRDb250cm9sbGVyKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2godGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8odGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCk7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpO1xyXG5cclxuICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuYWN0dWFsRm9jdXNlZENlbGwuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICBsZXQgYmxvY2tUb29sYmFyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgYmxvY2tUb29sYmFyID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIuY2xhc3NMaXN0LmFkZChcImQtbm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLnNob3coKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CbHVyLCAoKSA9PiB0aGlzLmNsZWFyQW5kSGlkZShibG9ja1Rvb2xiYXIpLCB7IHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8vIGV4ZWNDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG5cclxuICAgIC8vICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XHJcblxyXG4gICAgLy8gICAgIGlmIChhY3RpdmVDZWxsKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHRhYmxlID0gYWN0aXZlQ2VsbC5jbG9zZXN0KCd0YWJsZScpITtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGVkQ2VsbHMgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCd0ZC5zZWxlY3RlZCcpO1xyXG5cclxuICAgIC8vICAgICAgICAgc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgLy8gICAgICAgICAgICAgKGNlbGwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHZhbHVlO1xyXG4gICAgLy8gICAgICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcclxuXHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcImNlbGwgbm90IGZvdW5kXCIpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cygpIHtcclxuXHJcbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJhY2tncm91bmRDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yUmVkXSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JSZWQpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZWVuXSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmVlbik7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yQmx1ZV0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yQmx1ZSk7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yc1tDb2xvcnMuQmFja2dyb3VuZENvbG9yWWVsbG93XSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZXldID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvckdyZXkpO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhiYWNrZ3JvdW5kQ29sb3JzKS5mb3JFYWNoKChbY29sb3IsIGFjdGl2ZV0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIHJlc2V0Q2hlY2tlZENvbG9yKCkge1xyXG5cclxuICAgIC8vICAgICBjb25zdCBkcm9wZG93bkNvbG9yID0gdGhpcy5kcm9wZG93bnMuZmluZChlID0+IGUuaWQgPT0gXCJ0YWJsZUNvbG9yT3B0aW9uc01lbnVcIikhO1xyXG5cclxuICAgIC8vICAgICBkcm9wZG93bkNvbG9yLmRyb3Bkb3duTGlzdC5kcm9wZG93bkl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICBpdGVtLnJlc2V0QWN0aXZlSWNvbigpO1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkcm9wZG93bkNvbG9yLmRyb3Bkb3duTGlzdC5kcm9wZG93bkl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBjb2xvciA9IGl0ZW0uZ2V0TGVmdEljb25CYWNrZ3JvdW5kQ29sb3IoKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChjb2xvciAmJiB0aGlzLmFyZUFsbFNlbGVjdGVkQ2VsbHNTYW1lQmdDb2xvcihjb2xvcikgJiYgY29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiKSB7XHJcbiAgICAvLyAgICAgICAgICAgICBpdGVtLmNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUoKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgMDtcclxuXHJcbiAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIGVsZW1lbnRIZWlnaHQgLSAxMDtcclxuXHJcbiAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRTZWxlY3Rpb25TdGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2Rlcy5UZXh0O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRmxhZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBhbGxUYWJsZUNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGQnKTtcclxuICAgICAgICBhbGxUYWJsZUNlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQW5kSGlkZShibG9ja1Rvb2xiYXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKGJsb2NrVG9vbGJhcikge1xyXG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIuY2xhc3NMaXN0LnJlbW92ZShcImQtbm9uZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0QWJvcnRDb250cm9sbGVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBjb25zdCB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlPihcIklUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyKGZvY3VzU3RhY2ssIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IFNpemVzIH0gZnJvbSBcIkAvY29tbW9uL1NpemVzXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IENvbG9ySWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51QnV0dG9uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3QgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtVGl0bGVcIjtcclxuaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVPcGVyYXRpb25zU2VydmljZT4oXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVUb29sYmFyID0gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmREcm9wZG93bihUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRhYmxlT3B0aW9ucyh0YWJsZU9wZXJhdGlvblNlcnZpY2UpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kU2VwYXJhdG9yKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidGFibGVPcGVyYXRpb25zU2VwYXJhdG9yXCIpKTtcclxuICAgICAgICB0YWJsZVRvb2xiYXIuYXBwZW5kRHJvcGRvd24oVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50YWJsZUNvbG9yRHJvcGRvd24oKSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdGFibGVUb29sYmFyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0YWJsZU9wdGlvbnModGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCB0dXJuSW50b0Jhckxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcInRhYmxlT3B0aW9uc1NlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0JhckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJ0YWJsZU9wdGlvbnNcIiwgXCJPcHRpb25zXCIsIHR1cm5JbnRvQmFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9Ecm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0YWJsZU9wdGlvbnNNZW51XCIsIHR1cm5JbnRvQmFyQnV0dG9uLCB0dXJuSW50b0Jhckxpc3QpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgQ29sdW1uXCIpKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRleHRcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtbkxlZnQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uTGVmdCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJMZWZ0XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uUmlnaHQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQ29sdW1uUmlnaHQsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUmlnaHRcIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJJbnNlcnQgUm93XCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5Sb3dBYm92ZSwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJBYm92ZVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuUm93QmVsb3csIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiQmVsb3dcIikpO1xyXG5cclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSh0dXJuSW50b0Jhckxpc3QsIFwiUmVtb3ZlXCIpKTtcclxuXHJcbiAgICAgICAgY29uc3QgZGVsZXRlQ29sdW1uSXRlbSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZUNvbHVtbiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5kZWxldGVTd2VlcCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJDb2x1bW5cIik7XHJcbiAgICAgICAgZGVsZXRlQ29sdW1uSXRlbS5hZGRDc3NDbGFzcyhcImRhbmdlci1vcHRpb25cIik7XHJcbiAgICAgICAgLy8gZGVsZXRlQ29sdW1uSXRlbS5hdHRhY2hPbkZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuVG9tYXRvKTtcclxuICAgICAgICAvLyBkZWxldGVDb2x1bW5JdGVtLmF0dGFjaE9uTG9zZUZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuQ29sdW1uLCBDb2xvcnMuT3JpZ2luYWxUYWJsZUNvbG9yKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChkZWxldGVDb2x1bW5JdGVtKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBkZWxldGVSb3dJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnJlbW92ZVJvdywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuZGVsZXRlU3dlZXAsIFNpemVzLm1lZGl1bSkuaHRtbEVsZW1lbnQsIFwiUm93XCIpO1xyXG4gICAgICAgIGRlbGV0ZVJvd0l0ZW0uYWRkQ3NzQ2xhc3MoXCJkYW5nZXItb3B0aW9uXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGRlbGV0ZVJvd0l0ZW0uYXR0YWNoT25Gb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLlRvbWF0byk7XHJcbiAgICAgICAgLy8gZGVsZXRlUm93SXRlbS5hdHRhY2hPbkxvc2VGb2N1cyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQsIFRhYmxlU2NvcGVzLlJvdywgQ29sb3JzLk9yaWdpbmFsVGFibGVDb2xvcik7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQoZGVsZXRlUm93SXRlbSk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gdHVybkludG9Ecm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGFibGVDb2xvckRyb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd25MaXN0ID0gbmV3IERyb3Bkb3duTWVudUxpc3QoXCJjb2xvclRhYmxlT3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcImNvbG9yVGFibGVCdXR0b25cIiwgbmV3IENvbG9ySWNvbihcIndoaXRlXCIpLmh0bWxFbGVtZW50LCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0YWJsZUNvbG9yT3B0aW9uc01lbnVcIiwgY29sb3JCdXR0b24sIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuXHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKGNvbG9yRHJvcGRvd25MaXN0LCBcIkJhY2tncm91bmRcIikpO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbEJhY2tncm91bmRDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25SZWRcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclJlZC5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uR3JlZW5cIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxHcmVlbiwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbikuaHRtbEVsZW1lbnQsIFwiR3JlZW5cIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvckdyZWVuLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkJsdWVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxCbHVlLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpLmh0bWxFbGVtZW50LCBcIkJsdWVcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvckJsdWUuYWRkQ2xhc3MoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25ZZWxsb3dcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkJhY2tncm91bmRDb2xvckNlbGxZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvclllbGxvdy5hZGRDbGFzcyhcImJhY2tncm91bmRDb2xvclwiKTtcclxuICAgICAgICBcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBjZWxsQmFja2dyb3VuZENvbG9yR3JleSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25HcmV5XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JDZWxsR3JleSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KS5odG1sRWxlbWVudCwgXCJHcmV5XCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5LmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbk5vbmVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclJlZCk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbik7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VwYXJhdG9yKGlkOiBzdHJpbmcpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKGlkKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBFbWJlZFRvb2wsIEVtYmVkVHlwZXMgfSBmcm9tIFwiQC9jb3JlL0VtYmVkVG9vbFwiO1xuaW1wb3J0IHsgQ29tbW9uQ2xhc3NlcyB9IGZyb20gXCJAL2NvbW1vbi9Db21tb25DbGFzc2VzXCI7XG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcblxuZXhwb3J0IGNsYXNzIE1lZGlhSW5wdXR0ZXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xuXG4gICAgaWQ6IHN0cmluZztcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBpZCA9IFwibWVkaWFJbnB1dHRlclwiO1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBpZDogaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG5cbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGFpbmVyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLnpJbmRleCA9IFpJbmRleC5FeHRyZW1lbHlJbXBvcnRhbnQ7XG5cbiAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiKTtcbiAgICAgICAgaGVhZC5jbGFzc0xpc3QuYWRkKFwibmF2XCIsIFwibmF2LXVuZGVybGluZVwiKTtcblxuICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmNyZWF0ZU5hdkl0ZW0oXCJ1cGxvYWRUYWJcIiwgXCJVcGxvYWRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3QgZW1iZWRUYWIgPSB0aGlzLmNyZWF0ZU5hdkl0ZW0oXCJlbWJlZFRhYlwiLCBcIkVtYmVkXCIpO1xuXG4gICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQodXBsb2FkVGFiKTtcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbWJlZFRhYik7XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcInRhYi1jb250ZW50XCIpO1xuXG4gICAgICAgIGNvbnN0IHVwbG9hZENvbnRlbnQgPSB0aGlzLmNyZWF0ZVVwbG9hZENvbnRlbnQoKTtcbiAgICAgICAgY29uc3QgZW1iZWRDb250ZW50ID0gdGhpcy5jcmVhdGVFbWJlZENvbnRlbnQoKTtcblxuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKHVwbG9hZENvbnRlbnQpO1xuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVtYmVkQ29udGVudCk7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZCk7XG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcbiAgICB9XG5cbiAgICBjcmVhdGVOYXZJdGVtKGlkOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgYWN0aXZlOiBib29sZWFuID0gZmFsc2UpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xuICAgICAgICBsaS5jbGFzc0xpc3QuYWRkKFwibmF2LWl0ZW1cIik7XG4gICAgICAgIGxpLmlkID0gaWQ7XG5cbiAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICBhLmNsYXNzTGlzdC5hZGQoXCJuYXYtbGlua1wiKTtcbiAgICAgICAgYS5pbm5lclRleHQgPSB0ZXh0O1xuICAgICAgICBsaS5hcHBlbmRDaGlsZChhKTtcblxuICAgICAgICByZXR1cm4gbGk7XG4gICAgfVxuXG4gICAgY3JlYXRlVXBsb2FkQ29udGVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRpdi5pZCA9IFwidXBsb2FkQ29udGVudFwiO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcInVwbG9hZC1jb250ZW50XCIsIFwiY29udGVudC1kYXRhXCIpO1xuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XG4gICAgICAgIGxhYmVsLmlubmVyVGV4dCA9IFwiVXBsb2FkIGZpbGVcIjtcblxuICAgICAgICBjb25zdCB0ZXh0SW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRleHRJbmZvLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0LWluZm9cIik7XG4gICAgICAgIHRleHRJbmZvLmlubmVyVGV4dCA9IFwiTWF4aW11bSBmaWxlIHNpemU6IDVNQlwiO1xuXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZCh0ZXh0SW5mbyk7XG5cbiAgICAgICAgcmV0dXJuIGRpdjtcbiAgICB9XG5cbiAgICBjcmVhdGVFbWJlZENvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBkaXYuaWQgPSBcImVtYmVkQ29udGVudFwiO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcImNvbnRlbnQtZGF0YVwiLCBcImVtYmVkLWNvbnRlbnRcIik7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGlucHV0LnR5cGUgPSBcInRleHRcIjtcblxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZChcImJsdWUtYnV0dG9uXCIpO1xuICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gXCJFbWJlZFwiO1xuXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChidXR0b24pO1xuXG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKCkgPT4gdGhpcy5lbWJlZEdlbmVyaWMoaW5wdXQpKTtcblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmVtYmVkR2VuZXJpYyhpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkZvY3VzaW4sICgpID0+IHRoaXMucmVzZXRJbnB1dEJnQ29sb3IoaW5wdXQpKTtcblxuICAgICAgICByZXR1cm4gZGl2O1xuICAgIH1cblxuICAgIHJlc2V0SW5wdXRCZ0NvbG9yKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiXCI7XG4gICAgfVxuXG4gICAgYXN5bmMgZW1iZWRHZW5lcmljKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICAgICAgY29uc3Qgc3RyaW5nVVJMID0gaW5wdXQudmFsdWU7XG4gICAgICAgIGNvbnN0IGZvY3VzZWRFbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBmb2N1c2VkRWxlbWVudD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKT8uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIik7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoc3RyaW5nVVJMKTtcblxuICAgICAgICAgICAgaWYgKCFVdGlscy5pc1ZhbGlkVXJsKHVybC50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgVVJMXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWZvY3VzZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5vdCBlbGVtZW50IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENvbnRlbnRUeXBlcy5JbWFnZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IEVtYmVkVG9vbC5lbWJlZEltYWdlKHN0cmluZ1VSTCwgZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuSWZyYW1lKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZFR5cGUgPSBFbWJlZFRvb2wuZGV0ZXJtaW5lRW1iZWRUeXBlKHN0cmluZ1VSTCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGVtYmVkVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlVmlkZW86XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlVmlkZW9Bc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlUGxheWxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlUGxheWxpc3RBc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlU2hvcnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5VHJhY2s6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlQbGF5bGlzdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUFydGlzdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUVwaXNvZGU6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlTaG93OlxuICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRUb29sLmVtYmVkU3BvdGlmeUNvbnRlbnQodXJsLCBmb2N1c2VkRWxlbWVudCwgZW1iZWRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLkdpdEh1Ykdpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRHaXN0QXNTY3JpcHQodXJsLCBmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuQ29kZVBlbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZENvZGVwZW5Bc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZW1iZWRDb250ZW50IGlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYigyNTMsIDIyMiwgMjIyKVwiO1xuICAgICAgICAgICAgICAgIGlucHV0LmNsYXNzTGlzdC5hZGQoXCJzaGFrZS1hbmltYXRpb25cIik7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZShcInNoYWtlLWFuaW1hdGlvblwiKTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgc2V0IGlucHV0VmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpbnB1dFRleHQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKTtcbiAgICAgICAgaWYgKGlucHV0VGV4dCkge1xuICAgICAgICAgICAgaW5wdXRUZXh0LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJmbGV4XCI7XG4gICAgfVxuXG5cbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgdXBsb2FkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3VwbG9hZFRhYlwiKTtcbiAgICAgICAgdXBsb2FkVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoJ3VwbG9hZFRhYicsICd1cGxvYWRDb250ZW50Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpO1xuICAgICAgICBlbWJlZFRhYj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKCdlbWJlZFRhYicsICdlbWJlZENvbnRlbnQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVyS2V5ZG93bkV2ZW50cy5iaW5kKHRoaXMpKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaGFuZGxlckNsaWNrRXZlbnRzLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHN1cGVyLmF0dGFjaFVJRXZlbnQoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVyS2V5ZG93bkV2ZW50cyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZXJDbGlja0V2ZW50cyhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zdCBlbWJlZEltYWdlID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQoZXZlbnQsIFwiZW1iZWRJbWFnZVwiKTtcbiAgICAgICAgLy8gaWYgKGVtYmVkSW1hZ2UpIHtcbiAgICAgICAgLy8gICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuZW1iZWRJbWFnZShlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuaGlkZU1lZGlhSW5wdXR0ZXJPbkV4dGVybmFsQ2xpY2soZXZlbnQpXG4gICAgICAgIHRoaXMuc2hvd01lZGlhSW5wdXR0ZXJPbk1lZGlhSW5wdXR0ZXJFbGVtZW50Q2xpY2soZXZlbnQpO1xuICAgIH1cblxuXG4gICAgaGlkZU1lZGlhSW5wdXR0ZXJPbkV4dGVybmFsQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVkaWFJbnB1dHRlciA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkKGV2ZW50LCB0aGlzLmlkKTtcbiAgICAgICAgY29uc3QgY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRPbkNsaWNrKTtcbiAgICAgICAgaWYgKCFtZWRpYUlucHV0dGVyICYmICFjbGlja2VkT25FbGVtZW50V2l0aFNob3dNZWRpYUlucHV0Q2xhc3MgJiYgdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93TWVkaWFJbnB1dHRlck9uTWVkaWFJbnB1dHRlckVsZW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuXG4gICAgICAgIGNvbnN0IGNsaWNrZWRPbkVsZW1lbnRXaXRoU2hvd01lZGlhSW5wdXRDbGFzcyA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0T25DbGljayk7XG4gICAgICAgIGlmIChjbGlja2VkT25FbGVtZW50V2l0aFNob3dNZWRpYUlucHV0Q2xhc3MpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2goY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGZpbmRDbGFzc1dpdGhTdWZmaXgoZWxlbWVudDogRWxlbWVudCwgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAuKiR7c3VmZml4fSRgKTtcblxuICAgICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cbiAgICBnZXRUYWIodGFiSWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJJZCk7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250ZW50SWQpO1xuICAgIH1cblxuICAgIHNldEFjdGl2ZVRhYih0YWJJZDogc3RyaW5nLCBjb250ZW50SWQ6IHN0cmluZykge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubmF2LWl0ZW0nKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb250ZW50LWRhdGEnKS5mb3JFYWNoKGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdldFRhYih0YWJJZCk/LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gdGhpcy5nZXRDb250ZW50KGNvbnRlbnRJZCk7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIik7XG5cbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93KCk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IGxhc3RGb2N1c2VkID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcblxuICAgICAgICBjb25zdCBzaG93SW5wdXRNZWRpYSA9IGxhc3RGb2N1c2VkPy5xdWVyeVNlbGVjdG9yKGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0T25DbGlja31gKSB8fCBsYXN0Rm9jdXNlZD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2t9YCk7XG5cbiAgICAgICAgaWYgKHNob3dJbnB1dE1lZGlhKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0UGxhY2Vob2xkZXIgPSB0aGlzLmZpbmRDbGFzc1dpdGhTdWZmaXgoc2hvd0lucHV0TWVkaWEsIFwiLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIik7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0UGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0UGxhY2Vob2xkZXIodGV4dFBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xuXG4gICAgICAgICAgICBjb25zdCBhY3RpdmF0ZU1lZGlhVXBsb2FkID0gbGFzdEZvY3VzZWQucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dFVwbG9hZH1gKSB8fCBsYXN0Rm9jdXNlZC5jbG9zZXN0KGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0VXBsb2FkfWApO1xuICAgICAgICAgICAgY29uc3QgdXBsb2FkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3VwbG9hZFRhYlwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRDb250ZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3VwbG9hZENvbnRlbnRcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBlbWJlZENvbnRlbnQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZW1iZWRDb250ZW50XCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBJZiBtZWRpYSB1cGxvYWQgaXMgYWN0aXZlLCB0aGUgbWVkaWFJbnB1dHRlciB1c2VzIG1lZGlhIHVwbG9hZCBhcyB0aGUgZGVmYXVsdC5cbiAgICAgICAgICAgIGlmIChhY3RpdmF0ZU1lZGlhVXBsb2FkICYmIHVwbG9hZFRhYiAmJiB1cGxvYWRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xuXG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgZW1iZWRDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGxvYWRUYWIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgZW1iZWRDb250ZW50LmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8obGFzdEZvY3VzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIuc2hvdygpO1xuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZENvbnRlbnQgaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICAgIGlmIChpbnB1dCAmJiB0aGlzLmlzRWxlbWVudFZpc2libGUoaW5wdXQpKSB7XG5cbiAgICAgICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0SW5wdXRQbGFjZWhvbGRlcihlbWJlZDogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkQ29udGVudCBpbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgICAgIGlmIChlbWJlZCA9PSBcImltYWdlLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIikge1xuICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL2ltYWdlLmpwZ1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWJlZCA9PSBcInlvdXR1YmUtZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tLy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbWJlZCA9PSBcInNwb3RpZnktZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCBcImh0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS8uLi5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW1iZWQgPT0gXCJnaXRodWItZ2lzdC1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtYmVkID09IFwiY29kZXBlbi1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9jb2RlcGVuLmlvLy4uLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiUGFzdGUgVVJMIGhlcmUuLi5cIik7XG4gICAgfVxuXG4gICAgaXNFbGVtZW50VmlzaWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgcmV0dXJuIHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBcIlwiO1xuICAgICAgICBzdXBlci5oaWRlKCk7XG4gICAgfVxuXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldE1pZHBvaW50ID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpO1xuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gdGFyZ2V0TWlkcG9pbnQgLSAodGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aCAvIDIpO1xuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XG5cbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS50b3AgPSBgJHt0b3BQb3NpdGlvbn1weGA7XG4gICAgfVxufSIsImltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZWRpYUlucHV0dGVyQnVpbGRlciB7XHJcbiAgICBzdGF0aWMgYnVpbGQoKTogTWVkaWFJbnB1dHRlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhSW5wdXR0ZXIgPSBuZXcgTWVkaWFJbnB1dHRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWVkaWFJbnB1dHRlcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvclwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja0J1aWxkZXIgfSBmcm9tIFwiLi9BZGRCbG9ja0J1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIH0gZnJvbSBcIi4vVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWlja01lbnVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRpdGxlQnVpbGRlciB9IGZyb20gXCIuL1RpdGxlQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBDb250ZW50QnVpbGRlciB9IGZyb20gXCIuL0NvbnRlbnRCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXJCdWlsZGVyIH0gZnJvbSBcIi4vTWVkaWFJbnB1dHRlckJ1aWxkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0b3JCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogRWRpdG9yIHtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gRWRpdG9yLmdldEluc3RhbmNlKFxyXG4gICAgICAgICAgICBUaXRsZUJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQ29udGVudEJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQWRkQmxvY2tCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBRdWlja01lbnVCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgTWVkaWFJbnB1dHRlckJ1aWxkZXIuYnVpbGQoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiBlZGl0b3I7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9lZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCBpY29ucyBmcm9tIFwiLi4vYXNzZXRzL2ltZy9pY29ucy5zdmdcIjtcclxuaW1wb3J0IHsgRWRpdG9yQnVpbGRlciB9IGZyb20gXCIuL0VkaXRvckJ1aWxkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBTaW5nbGV0b24gY2xhc3MgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGFuZCBtYW5hZ2luZyB0aGUgdXNlciBpbnRlcmZhY2Ugb2YgdGhlIGVkaXRvci5cclxuICogRW5zdXJlcyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFVJQnVpbGRlciBjYW4gZXhpc3QsIG1hbmFnaW5nIHRoZSBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVJQnVpbGRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVJQnVpbGRlcjtcclxuXHJcbiAgICBwcml2YXRlIGVkaXRvcjogRWRpdG9yO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgVUlCdWlsZGVyIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgVUlCdWlsZGVyIGluc3RhbmNlIHdpdGggYSBnaXZlbiBlZGl0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VkaXRvcn0gZWRpdG9yIFRoZSBlZGl0b3IgaW5zdGFuY2UgdG8gYmUgbWFuYWdlZCBieSBVSUJ1aWxkZXIuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIGFuIGluc3RhbmNlIG9mIFVJQnVpbGRlciBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvcikge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XHJcblxyXG4gICAgICAgIFVJQnVpbGRlci5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGdldCBvciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVUlCdWlsZGVyLlxyXG4gICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgc2luZ2xldG9uIHBhdHRlcm4gYW5kIGVuc3VyZXMgdGhhdCBVSUJ1aWxkZXIgaXMgb25seSBpbnN0YW50aWF0ZWQgb25jZS5cclxuICAgICAqIEByZXR1cm5zIHtVSUJ1aWxkZXJ9IFJldHVybnMgdGhlIGV4aXN0aW5nIG9yIG5ldyBVSUJ1aWxkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBidWlsZCgpOiBVSUJ1aWxkZXIge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBVSUJ1aWxkZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFVJQnVpbGRlcihFZGl0b3JCdWlsZGVyLmJ1aWxkKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVpbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgYnkgaW5zZXJ0aW5nIG5lY2Vzc2FyeSBpY29ucyBhbmQgcmV0dXJuaW5nIHRoZSBlZGl0b3IgaW5zdGFuY2UuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHRvIHN0YXJ0IHRoZSBlZGl0b3IgYW5kIHByZXBhcmUgYWxsIFVJIGNvbXBvbmVudHMuXHJcbiAgICAgKiBAcmV0dXJucyB7RWRpdG9yfSBUaGUgaW5pdGlhbGl6ZWQgZWRpdG9yIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzdGFydCgpOiBFZGl0b3Ige1xyXG5cclxuICAgICAgICB0aGlzLmluc2VydEljb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5zZXJ0cyBhIGNvbnRhaW5lciB3aXRoIFNWRyBpY29ucyBpbnRvIHRoZSBkb2N1bWVudCBib2R5LiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXRcclxuICAgICogdGhlIGljb25zIGFyZSBvbmx5IGluc2VydGVkIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgZW50cmllcy5cclxuICAgICovXHJcbiAgICBpbnNlcnRJY29ucygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdmctaWNvbnMtY29udGFpbmVyJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ZnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgICAgICBzdmdDb250YWluZXIuaW5uZXJIVE1MID0gaWNvbnM7XHJcbiAgICAgICAgICAgIHN2Z0NvbnRhaW5lci5jbGFzc05hbWUgPSAnc3ZnLWljb25zLWNvbnRhaW5lcic7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN2Z0NvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCIuL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXNcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIENlbnRyYWwgY29tbWFuZCBkaXNwYXRjaGVyIGNsYXNzIGZvciBoYW5kbGluZyB2YXJpb3VzIGVkaXRvciBjb21tYW5kcyByZWxhdGVkIHRvIHRleHQgYW5kIGJsb2NrIG1hbmlwdWxhdGlvbi5cclxuICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG5lZWRlZCB0byBleGVjdXRlIGNvbW1hbmRzIHN1Y2ggYXMgYm9sZCwgaXRhbGljLCB1bmRlcmxpbmUsIGNvbG9yIGNoYW5nZXMsIGFuZCBzdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgdG8gY29udGVudCBibG9ja3Mgd2l0aGluIGFuIGVkaXRvci5cclxuICpcclxuICogQGNsYXNzXHJcbiAqIEBzaW5nbGV0b25cclxuICogTWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSB0cmlnZ2VyZWQgYnkgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIGZvciBjdXN0b20gZXZlbnRzIHdoaWNoIGRpY3RhdGUgdGhlIHR5cGUgb2YgY29tbWFuZCB0byBiZSBleGVjdXRlZC5cclxuICpcclxuICogRXhhbXBsZSB1c2FnZTpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjb25zdCBjb21tYW5kRGlzcGF0Y2hlciA9IENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCk7XHJcbiAqIGNvbW1hbmREaXNwYXRjaGVyLmxpc3RlbigpOyAgLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBjb21tYW5kIGFuZCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy5cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpc3BhdGNoZXIge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tYW5kRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgYXR0ZW1wdGVkIHRvIGJlIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdCB0byBpbnN0YW50aWF0ZSBzaW5nbGV0b24gYENvbW1hbmREaXNwYXRjaGVyYCBtb3JlIHRoYW4gb25jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gdGV4dE9wZXJhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgICogQHJldHVybnMge0NvbW1hbmREaXNwYXRjaGVyfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb21tYW5kRGlzcGF0Y2hlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb21tYW5kRGlzcGF0Y2hlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgdGV4dE9wZXJhdGlvblNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRleHRPcGVyYXRpb25zU2VydmljZT4oXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcblxyXG4gICAgICAgIGlmICghQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UgPSBuZXcgQ29tbWFuZERpc3BhdGNoZXIoYmxvY2tPcGVyYXRpb25zU2VydmljZSwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBsaXN0ZW5lcnMgZm9yIHZhcmlvdXMgZWRpdG9yLXJlbGF0ZWQgZXZlbnRzIHN1Y2ggYXMgY29tbWFuZCByZXF1ZXN0cyBhbmQgc2VsZWN0aW9uIGNoYW5nZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHRoaXMuaGFuZGxlQ29tbWFuZEV2ZW50IGFzIEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmZvY3VzT25GaXJzdFJlcXVlc3RlZCwgdGhpcy5oYW5kbGVGb2N1c09uRmlyc3RSZXF1ZXN0ZWRFdmVudCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMucHJlc3NlZEVudGVyT25UaXRsZSwgKCkgPT4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmNyZWF0ZUFOZXdQYXJhZ3JhcGhGcm9tVGl0bGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGNvbW1hbmQgZXZlbnRzIGRpc3BhdGNoZWQgZnJvbSBVSSBjb21wb25lbnRzIG9yIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD59IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgY29tbWFuZCwgc2hvd1VJLCB2YWx1ZSwgdGFyZ2V0QmxvY2tUeXBlLCBibG9jaywgc2NvcGUgfSA9IGV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmxpbmtSZWFkeVRvSW5zZXJ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5saW5rUmVhZHlUb0luc2VydH0gcmVxdWlyZXMgdmFsdWVgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNJbnNlcnRMaW5rKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVMaW5rOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1RvZ2dsZUxpbmsoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVCb2xkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0JvbGQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0lubGluZUNvZGUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJdGFsaWM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjSXRhbGljKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1VuZGVybGluZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVN0cmlrZVRocm91Z2g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjU3RyaWtlVGhyb3VnaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0hpbGl0ZUNvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvcmVDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IGVsZW1lbnQgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIGJsb2NrLmApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRyYW5zZm9ybUJsb2NrKHZhbHVlLCBibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuZHVwbGljYXRlQmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0R1cGxpY2F0ZUJsb2NrKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjRGVsZXRlQmxvY2soYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVBbmRGb2N1c09uTmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmZvY3VzT25OZXh0QmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvY3VzT25OZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlRm9ybWF0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjUmVtb3ZlRm9ybWF0KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkp1c3RpZnlMZWZ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5TGVmdH0gcmVxdWlyZXMgYSBibG9jayB0byBqdXN0aWZ5LmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmp1c3RpZnlMZWZ0KGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5KdXN0aWZ5Q2VudGVyOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5Q2VudGVyfSByZXF1aXJlcyBhIGJsb2NrIHRvIGp1c3RpZnkuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuanVzdGlmeUNlbnRlcihibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuSnVzdGlmeVJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5UmlnaHR9IHJlcXVpcmVzIGEgYmxvY2sgdG8ganVzdGlmeS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5qdXN0aWZ5UmlnaHQoYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZX0gcmVxdWlyZXMgYSBibG9jayB0byBjaGFuZ2UgYSBjb2RlIGJsb2NrIGxhbmd1YWdlLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2V9IHJlcXVpcmVzIGEgdmFsdWUgdG8gY2hhbmdlIGEgY29kZSBibG9jayBsYW5ndWFnZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZShibG9jaywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydE5ldzpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0luc2VydE5ldyhjb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5mb2N1c09uUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0ZvY3VzT25QcmV2aW91c0Jsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLm1lcmdlV2l0aE5leHRCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoTmV4dEJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMubWVyZ2VXaXRoUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoUHJldmlvdXNCbG9jaygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5MZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5SaWdodChibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmluc2VydFJvd0Fib3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dCZWxvdyhibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbGwgYmFja2dyb3VuZCBjb2xvci5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5leGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcjpcclxuICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcn0gcmVxdWlyZXMgYSBibG9jay5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3J9IHJlcXVpcmVzIGEgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ2hhbmdlQ2FsbG91dEJhY2tncm91bmQoYmxvY2ssIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVDb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlQ29sdW1uKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVSb3c6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlUm93OlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnJlbW92ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuY2hhbmdlVGFibGVCb3JkZXJDb2xvcihzY29wZSBhcyBUYWJsZVNjb3BlcywgdmFsdWUgYXMgQ29sb3JzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2spO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlUm93RWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZVJvd0VsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRSb3dFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm8gYWN0aW9uIGRlZmluZWQgZm9yIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBleGVjVHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlKTtcclxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNSZW1vdmVGb3JtYXQoY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5ub3JtYWxpemUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjSW5zZXJ0TmV3KGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRm9jdXNPblByZXZpb3VzQmxvY2soY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIGhhbmRsZUZvY3VzT25GaXJzdFJlcXVlc3RlZEV2ZW50ID0gKGNvbW1hbmQ6IENvbW1hbmRzKTogdm9pZCA9PiB7XHJcbiAgICAvLyAgICAgLy8gYWxlcnQoXCJmb2N1cyBvbiBmaXJzdFwiKTtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG4gICAgLy8gfVxyXG59XHJcbiIsImltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gXCIuL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMga2V5Ym9hcmQgc2hvcnRjdXQgbGlzdGVuaW5nIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbiB0byBlbnN1cmVcclxuICogdGhhdCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBpcyBjZW50cmFsaXplZCBhbmQgdGhhdCBtdWx0aXBsZSBpbnN0YW5jZXMgZG8gbm90IGR1cGxpY2F0ZSBldmVudCBsaXN0ZW5lcnMuXHJcbiAqIEl0IGludGVyY2VwdHMga2V5ZG93biBldmVudHMgYW5kIGRpc3BhdGNoZXMgY29tbWFuZHMgYmFzZWQgb24gc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucywgZW5oYW5jaW5nIHRleHQgZWRpdGluZ1xyXG4gKiBjYXBhYmlsaXRpZXMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi5cclxuICogXHJcbiAqIFRoZSBjbGFzcyBpbml0aWFsaXplcyBpdHNlbGYgdGhlIGZpcnN0IHRpbWUgYGdldEluc3RhbmNlYCBpcyBjYWxsZWQgYW5kIHN1YnNlcXVlbnRseSBtYW5hZ2VzIGFsbCBrZXlib2FyZCBzaG9ydGN1dHNcclxuICogdGhyb3VnaCBhIHNpbmdsZSBpbnN0YW5jZS5cclxuICogXHJcbiAqIFVzYWdlIG9mIHRoaXMgY2xhc3Mgb3V0c2lkZSBvZiBpdHMgc2luZ2xldG9uIHBhdHRlcm4gaXMgcmVzdHJpY3RlZCB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlcywgd2hpY2ggaXMgZW5mb3JjZWRcclxuICogYnkgdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBkaXJlY3RseSBhZnRlciBpbml0aWFsaXphdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaG9ydGN1dExpc3RlbmVycyBpbXBsZW1lbnRzIElTaG9ydGN1dExpc3RlbmVycyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIFNob3J0Y3V0TGlzdGVuZXJzLCBlbnN1cmluZyB0aGUgc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBAdHlwZSB7U2hvcnRjdXRMaXN0ZW5lcnMgfCBudWxsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFNob3J0Y3V0TGlzdGVuZXJzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvdXRzaWRlIG9mIHRoZSBzaW5nbGV0b24gY29udGV4dC4gSW5pdGlhbGl6ZXMgdGhlXHJcbiAgICAgKiBzaG9ydGN1dCBsaXN0ZW5lciBzZXR1cCBieSBjYWxsaW5nIHRoZSBgbGlzdGVuYCBtZXRob2QsIGVuc3VyaW5nIGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRpcmVjdGx5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TGlzdGVuKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibGlzdGVuaW5nIGtleWJvYXJkIHNob3J0Y3V0c1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBTaG9ydGN1dExpc3RlbmVycyBjbGFzcy4gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90XHJcbiAgICAgKiBleGlzdCwgaXQgY3JlYXRlcyBhbmQgcmV0dXJucyBpdCwgZW5zdXJpbmcgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Nob3J0Y3V0TGlzdGVuZXJzfSBUaGUgc2luZ2xlIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgU2hvcnRjdXRMaXN0ZW5lcnMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBTaG9ydGN1dExpc3RlbmVycyB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgU2hvcnRjdXRMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXR0YWNoZXMgYSBnbG9iYWwgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50IHRvIGludGVyY2VwdCBrZXlkb3duIGV2ZW50cyBhbmQgcGVyZm9ybSBzcGVjaWZpYyB0ZXh0IHRyYW5zZm9ybWF0aW9uXHJcbiAgICAqIGNvbW1hbmRzIGJhc2VkIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBrZXlzIHByZXNzZWQuIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZW5oYW5jZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzXHJcbiAgICAqIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiBieSBwcm92aWRpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciB2YXJpb3VzIHRleHQgZm9ybWF0dGluZyBhbmQgZWRpdGluZyBhY3Rpb25zLlxyXG4gICAgKlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gdXNlcyBhIGNvbWJpbmF0aW9uIG9mIEN0cmwsIEFsdCAob3IgQWx0R3JhcGgpLCBTaGlmdCwgYW5kIHNwZWNpZmljIGtleXMgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gdG8gYmVcclxuICAgICogdGFrZW4uIEl0IGhhbmRsZXMgdHJhbnNmb3JtYXRpb24gaW50byBkaWZmZXJlbnQgYmxvY2sgdHlwZXMgbGlrZSBwYXJhZ3JhcGhzLCBjaGVja2xpc3RzLCBudW1iZXJlZCBsaXN0cywgaGVhZGVycywgZXRjLixcclxuICAgICogYXMgd2VsbCBhcyBibG9jayBkdXBsaWNhdGlvbiBhbmQgZGVsZXRpb24uXHJcbiAgICAqXHJcbiAgICAqIFByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb24gYXJlIGNhbGxlZCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGtleSBhY3Rpb25zIGFuZCBidWJibGluZyBvZiBldmVudHMsIGVuc3VyaW5nIHRoYXRcclxuICAgICogb25seSB0aGUgaW50ZW5kZWQgYWN0aW9ucyBhcmUgZXhlY3V0ZWQuXHJcbiAgICAqXHJcbiAgICAqIFN1cHBvcnRlZCBTaG9ydGN1dHM6XHJcbiAgICAqIC0gQ3RybCtTaGlmdCtFbnRlcjogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgcGFyYWdyYXBoLlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrMSBvciBDdHJsK1NoaWZ0K051bXBhZDEgKE51bUxvY2sgb24pOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBjaGVja2xpc3QuXHJcbiAgICAqIC0gQ3RybCtTaGlmdCsuIDogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgYnVsbGV0ZWQgbGlzdC5cclxuICAgICogLSBDdHJsK1NoaWZ0Ky8gOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBudW1iZXJlZCBsaXN0LlxyXG4gICAgKiAtIEN0cmwrQWx0KzEgdGhyb3VnaCBDdHJsK0FsdCs2OiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gaGVhZGVycyAoSDEgdGhyb3VnaCBINikuXHJcbiAgICAqIC0gQ3RybCtEOiBEdXBsaWNhdGVzIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIFNoaWZ0K0RlbGV0ZSBvciBTaGlmdCtCYWNrc3BhY2U6IERlbGV0ZXMgdGhlIGN1cnJlbnQgYmxvY2suXHJcbiAgICAqIC0gQ3RybCtcXCA6IENsZWFycyBmb3JtYXR0aW5nIG9mIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIEN0cmwrQWx0K0RpZ2l0MTogUHJldmVudHMgY2hhcmFjdGVyIGluc2VydGlvbiB3aGVuIHVzaW5nIHRoZSB0b3Agcm93ICcxJywgc3BlY2lmaWMgdG8gbGF5b3V0IGNvbmZpZ3VyYXRpb25zLlxyXG4gICAgKlxyXG4gICAgKiBFYWNoIGFjdGlvbiBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggZGV0YWlscyBhYm91dCB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCwgd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYnlcclxuICAgICogQ29tbWFuZERpc3BhdGNoZXIuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEluaXRpYWxpemUgYW5kIGFjdGl2YXRlIHRoZSBzaG9ydGN1dHMgYWNyb3NzIHRoZSBkb2N1bWVudC5cclxuICAgICogY29uc3Qgc2hvcnRjdXRMaXN0ZW5lciA9IFNob3J0Y3V0TGlzdGVuZXJzLmdldEluc3RhbmNlKCk7XHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW4oKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgS2V5OiAke2V2ZW50LmtleX0sIENvZGU6ICR7ZXZlbnQuY29kZX0sIEN0cmw6ICR7ZXZlbnQuY3RybEtleX0sIEFsdDogJHtldmVudC5hbHRLZXl9LCBBbHRHcjogJHtldmVudC5rZXkgPT09ICdBbHRHcmFwaCd9LCBOdW1Mb2NrOiAke2V2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ051bUxvY2snKX1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTnVtUGFkID0gZXZlbnQuY29kZS5zdGFydHNXaXRoKFwiTnVtcGFkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1Mb2NrT24gPSBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTnVtTG9ja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBwYXJhZ3JhcGggd2hlbiBwcmVzc2luZyBDdHJsK1NoaWZ0K0VudGVyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LmFsdEtleSAmJiAoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIiB8fCBldmVudC5jb2RlID09PSBcIk51bXBhZDFcIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGNoZWNrbGlzdCB3aGVuIHByZXNzaW5nICBDdHJsK1NoaWZ0KzFcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSA9PT0gXCIuXCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGJ1bGxldGVkIGxpc3Qgd2hlbiBwcmVzc2luZyAgQ3RybCtTaGlmdCsuXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1RcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIChldmVudC5rZXkgPT09IFwiL1wiKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gbnVtYmVyZWQgbGlzdCB3aGVuIHByZXNzaW5nIEN0cmwrU2hpZnQrL1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQxXCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGgxIHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrMVxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MlwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMlwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoMiB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzJcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDNcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDNcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDMgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCszXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQ0XCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQ0XCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGg0IHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrNFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoNSB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzVcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDZcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDZcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDYgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCs2XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5rZXkgPT09IFwiRFwiIHx8IGV2ZW50LmtleSA9PT0gXCJkXCIpICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIC8vIER1cGxpY2F0ZSBibG9jayB3aGVuIHByZXNzaW5nIEN0cmwrRFxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kdXBsaWNhdGVCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmtleSA9PT0gXCJEZWxldGVcIiB8fCBldmVudC5rZXkgPT09IFwiQmFja3NwYWNlXCIpICYmIGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEZWxldGUgYmxvY2sgd2hlbiBwcmVzc2luZyBTaGlmdCtEZWxldGVcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJcXFxcXCIgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENsZWFyIGZvcm1hdHRpbmcgd2hlbiBwcmVzc2luZyBDdHJsK1xcXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMucmVtb3ZlRm9ybWF0LFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiBldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGNoYXJhY3RlciBpbnNlcnRpb24gd2hlbiB1c2luZyB0b3Agcm93ICcxJ1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgSVRhYmxlTGlzdGVuZXJzIH0gZnJvbSBcIi4vSVRhYmxlTGlzdGVuZXJzXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcclxuaW1wb3J0IHsgRm9jdXNTdGFjayB9IGZyb20gXCIuLi9Gb2N1c1N0YWNrXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIi4uL0lGb2N1c1N0YWNrXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiLi4vRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlTGlzdGVuZXJzIGltcGxlbWVudHMgSVRhYmxlTGlzdGVuZXJzIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGFibGVMaXN0ZW5lcnMgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuXHJcbiAgICBzaG93bkVsZW1lbnRzID0gbmV3IE1hcDxIVE1MVGFibGVDZWxsRWxlbWVudCwgSFRNTEVsZW1lbnQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaykge1xyXG5cclxuICAgICAgICBpZiAoVGFibGVMaXN0ZW5lcnMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRhYmxlRXZlbnRMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcclxuXHJcbiAgICAgICAgdGhpcy5saXN0ZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydExpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImxpc3RlbmluZyB0YWJsZSBjbGlja3NcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRhYmxlTGlzdGVuZXJzIHtcclxuXHJcbiAgICAgICAgY29uc3QgZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuICAgICAgICBpZiAoVGFibGVMaXN0ZW5lcnMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFRhYmxlTGlzdGVuZXJzLmluc3RhbmNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUxpc3RlbmVycyhmb2N1c1N0YWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxpc3RlbigpIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcGFyZW50OiBFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBOb2RlKS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gKGV2ZW50LnRhcmdldCBhcyBOb2RlKS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudD8uY2xvc2VzdChcIi5hZGQtdGFibGUtY29sdW1uXCIpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uUmlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrOiBwYXJlbnQuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyZW50Py5jbG9zZXN0KFwiLmFkZC10YWJsZS1yb3dcIikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0JlbG93LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazogcGFyZW50LmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEVuc3VyZSB0aGUgdGFyZ2V0IGlzIGEgdGFibGUgY2VsbCAodGQpIGFuZCBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAnYmxvY2snXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWNlbGwgfHwgIWNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSkgcmV0dXJuOyBcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEdldCB0aGUgYXNzb2NpYXRlZCB0YWJsZSAoYXNzdW1pbmcgYSB0YWJsZSBleGlzdHMpXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIikgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgaWYgKCF0YWJsZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gSWYgYW4gZWxlbWVudCBpcyBhbHJlYWR5IHNob3duIGZvciB0aGlzIGNlbGwsIGRvIG5vdGhpbmdcclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuc2hvd25FbGVtZW50cy5oYXMoY2VsbCkpIHJldHVybjsgLy8gUHJldmVudCBmbGlja2VyaW5nXHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiBpbiB0aGUgbGFzdCBjb2x1bW4gYW5kIGVtaXQgZXZlbnRcclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Q29sdW1uKHRhYmxlLCBjZWxsKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYmxvY2sgPSBjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudCwgYmxvY2sgfSxcclxuICAgICAgICAvLyAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuc2V0KGNlbGwsIGJsb2NrKTsgLy8gVHJhY2sgdGhlIHNob3duIGVsZW1lbnRcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgaW4gdGhlIGxhc3Qgcm93IGFuZCBlbWl0IGV2ZW50XHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdFJvdyh0YWJsZSwgY2VsbCkpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGJsb2NrID0gY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZVJvd0VsZW1lbnQsIGJsb2NrIH0sXHJcbiAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLnNldChjZWxsLCBibG9jayk7IC8vIFRyYWNrIHRoZSBzaG93biBlbGVtZW50XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gRW5zdXJlIHRoZSB0YXJnZXQgaXMgYSB0YWJsZSBjZWxsICh0ZCkgYW5kIGEgY2hpbGQgb2YgYW4gZWxlbWVudCB3aXRoIGNsYXNzICdibG9jaydcclxuICAgICAgICAvLyAgICAgY29uc3QgY2VsbCA9IHRhcmdldC5jbG9zZXN0KFwidGRcIik7XHJcbiAgICAgICAgLy8gICAgIGlmICghY2VsbCB8fCAhY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBHZXQgdGhlIGFzc29jaWF0ZWQgdGFibGUgKGFzc3VtaW5nIGEgdGFibGUgZXhpc3RzKVxyXG4gICAgICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGFibGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBsYXN0IGNvbHVtbiBjZWxsIGFuZCBub3QgZW50ZXJpbmcgdGhlIGFkZCBjb2x1bW4gYnV0dG9uXHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdENvbHVtbih0YWJsZSwgY2VsbCkgJiYgIXJlbGF0ZWRUYXJnZXQ/LmNsYXNzTGlzdC5jb250YWlucyhcImFkZC10YWJsZS1jb2x1bW5cIikpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IHNob3duRWxlbWVudCA9IHRoaXMuc2hvd25FbGVtZW50cy5nZXQoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc2hvd25FbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVDb2x1bW5FbGVtZW50LCBibG9jazogc2hvd25FbGVtZW50IH0sXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLmRlbGV0ZShjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgdGhlIG1vdXNlIGlzIGxlYXZpbmcgdGhlIGxhc3Qgcm93IGNlbGwgYW5kIG5vdCBlbnRlcmluZyB0aGUgYWRkIHJvdyBidXR0b25cclxuICAgICAgICAvLyAgICAgaWYgKFRhYmxlVXRpbHMuaXNMYXN0Um93KHRhYmxlLCBjZWxsKSAmJiAhcmVsYXRlZFRhcmdldD8uY2xhc3NMaXN0LmNvbnRhaW5zKFwiYWRkLXRhYmxlLXJvd1wiKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3Qgc2hvd25FbGVtZW50ID0gdGhpcy5zaG93bkVsZW1lbnRzLmdldChjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChzaG93bkVsZW1lbnQpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZVJvd0VsZW1lbnQsIGJsb2NrOiBzaG93bkVsZW1lbnQgfSxcclxuICAgICAgICAvLyAgICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNob3duRWxlbWVudHMuZGVsZXRlKGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCIuL0lGb2N1c1N0YWNrXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRm9jdXNTdGFjayBpbXBsZW1lbnRzIElGb2N1c1N0YWNrIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRm9jdXNTdGFjaztcclxuICAgIHByaXZhdGUgc3RhY2s6IEhUTUxFbGVtZW50W107XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcGFjaXR5OiBudW1iZXIgPSAxMDtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZvY3VzU3RhY2sge1xyXG4gICAgICAgIGlmICghRm9jdXNTdGFjay5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBGb2N1c1N0YWNrLmluc3RhbmNlID0gbmV3IEZvY3VzU3RhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEZvY3VzU3RhY2suaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHB1c2goZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggPj0gdGhpcy5jYXBhY2l0eSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RhY2sucHVzaChlbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcGVlaygpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9lbGVtZW50LWZhY3RvcnkvSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IENvbnRlbnRUeXBlcyB9IGZyb20gXCJAL2NvbW1vbi9Db250ZW50VHlwZXNcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCJAL2NvcmUvSUZvY3VzU3RhY2tcIjtcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgQ29tbW9uQ2xhc3NlcyB9IGZyb20gXCJAL2NvbW1vbi9Db21tb25DbGFzc2VzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgLy8gc3RhdGljIEJMT0NLX09QRVJBVElPTlMgPSB7XG4gICAgLy8gICAgIFRVUk5fSU5UTzogXCJ0dXJuSW50b1wiLFxuICAgIC8vICAgICBDUkVBVEVfREVGQVVMVF9CTE9DSzogXCJDcmVhdGVEZWZhdWx0QmxvY2tcIixcbiAgICAvLyAgICAgREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTOiBcIkRlbGV0ZUFuZEZvY3VzT25QcmV2aW91c1wiLFxuICAgIC8vICAgICBERUxFVEVfRk9DVVNfT05fTkVYVDogXCJEZWxldGVBbmRGb2N1c09uTmV4dFwiLFxuICAgIC8vICAgICBGT0NVU19PTl9GSVJTVDogXCJGb2N1c09uRmlyc3RcIixcbiAgICAvLyAgICAgRk9DVVNfT05fUFJFVklPVVM6IFwiRm9jdXNPblByZXZpb3VzXCIsXG4gICAgLy8gICAgIEZPQ1VTX09OX05FWFQ6IFwiRm9jdXNPbk5leHRcIixcbiAgICAvLyAgICAgREVMRVRFOiBcImRlbGV0ZVwiLFxuICAgIC8vICAgICBEVVBMSUNBVEU6IFwiZHVwbGljYXRlXCIsXG4gICAgLy8gICAgIENPUFk6IFwiY29weVwiLFxuICAgIC8vICAgICBQQVNURTogXCJwYXRlc1wiLFxuICAgIC8vICAgICBDVVQ6IFwiY3V0XCIsXG4gICAgLy8gICAgIFJFTU9WRV9GT1JNQVQ6IFwicmVtb3ZlRm9ybWF0XCIsXG4gICAgLy8gICAgIFRSQU5TRk9STV9CTE9DSzogXCJ0cmFuc2Zvcm1CbG9ja1wiXG4gICAgLy8gfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcbiAgICAgICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2ssXG4gICAgICAgIG1lbWVudG86IElNZW1lbnRvKSB7XG5cbiAgICAgICAgaWYgKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xuXG4gICAgICAgIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VJOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5jb3B5U2VsZWN0ZWQpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvcGllZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjb3BpZWRFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjb3B5IHRleHQnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmN1dFNlbGVjdGVkKSB7XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRTZWxlY3Rpb24gJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWxldGVGcm9tRG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoICdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gY3V0IHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucGFzdCkge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCkge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKS50aGVuKChwYXN0ZWRUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXN0ZWRUZXh0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0VXBkYXRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRleHQgc2VsZWN0ZWQgb3IgY2xpcGJvYXJkIGVtcHR5LicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gcGFzdGluZyB0ZXh0OiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaykge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQmxvY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucmVtb3ZlRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoQ29tbWFuZHMucmVtb3ZlRm9ybWF0LCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5kZWxldGVCbG9jaykge1xuXG4gICAgICAgIC8vICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCB7XG4gICAgICAgIC8vICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmNyZWF0ZURlZmF1bHRCbG9jaykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0QmxvY2soZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmZvY3VzT25GaXJzdEJsb2NrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlRm9jdXNPblByZXZpb3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhlbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRVUk5fSU5UTykge1xuXG4gICAgICAgIC8vICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIC8vICAgICB9XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybWF0QmxvY2soZWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBlbGVtZW50RmFjdG9yeVNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUVsZW1lbnRGYWN0b3J5U2VydmljZT4oXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIpO1xuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKGVsZW1lbnRGYWN0b3J5U2VydmljZSwgZm9jdXNTdGFjaywgbWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RHJhZ2dhYmxlRWxlbWVudEZyb21TZWxlY3Rpb24oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0b3JuYXIgbnVsbCBzZSBuZW5odW1hIHNlbGXDp8OjbyB2w6FsaWRhIGZvciBlbmNvbnRyYWRhIG91IG5lbmh1bSBlbGVtZW50byBjb3JyZXNwb25kZW50ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0VGFnTmFtZUJ5Q29tbWFuZE5hbWUoY29tbWFuZE5hbWU6IHN0cmluZykge1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmROYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9QYXJhZ3JhcGhcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJwXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgxXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgyXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IM1wiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgzXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INFwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg0XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg1XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg2XCI7XG5cbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuXG4gICAgZXhlY01lcmdlV2l0aFByZXZpb3VzQmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNDb250ZW50RWRpdGFibGUgPSBET01VdGlscy5nZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZShjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCA9IHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCArIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5jbG9zZXN0KFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2FyZXRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhckluZGV4OiBjYXJldFBvc2l0aW9uLmNoYXJJbmRleCArIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLnRleHRDb250ZW50IS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3M6IGNhcmV0UG9zaXRpb24uaG9yaXpvbnRhbFBvc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlLCBhZGp1c3RlZENhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNNZXJnZVdpdGhOZXh0QmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dENvbnRlbnRFZGl0YWJsZSA9IERPTVV0aWxzLmdldE5leHRDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIGlmICghbmV4dENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKG5leHRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGN1cnJlbnRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gRE9NVXRpbHMuc2F2ZUNhcmV0UG9zaXRpb24yZChjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5pbm5lckhUTUwgKyBuZXh0Q29udGVudEVkaXRhYmxlLmlubmVySFRNTDtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCJsaVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbSA9IG5leHRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBuZXh0Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKGN1cnJlbnRDb250ZW50RWRpdGFibGUsIGNhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNEdXBsaWNhdGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gKHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IGJsb2NrLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjbHVkZS1mcm9tLWNsb25lJykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBibG9jay5uZXh0U2libGluZztcbiAgICAgICAgYmxvY2sucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGNsb25lLCBuZXh0RWxlbWVudCk7XG5cbiAgICAgICAgY2xvbmUuaWQgPSBgYi0ke1V0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKX1gO1xuXG4gICAgICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tDbG9uZWQsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgYmxvY2sgPSAodGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IERPTVV0aWxzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNPbk5leHQoYmxvY2spO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGJsb2NrKTtcblxuICAgICAgICBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmJsb2NrRGVsZXRlZCwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPblByZXZpb3VzKCk7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyBhcHBseVNlbGVjdGVkQmxvY2tUeXBlKGRyYWdnYWJsZUJsb2NrOiBIVE1MRWxlbWVudCwgbmV3QmxvY2tUeXBlOiBzdHJpbmcpIHtcblxuICAgIC8vICAgICAvLyBjb25zdCBkcmFnZ2FibGVCbG9jayA9IHJlYWxGb2N1c2VkRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcbiAgICAvLyAgICAgLy8gY29uc3QgbmV3QmxvY2tUeXBlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5vcHRpb24nKSA/XG4gICAgLy8gICAgIC8vICAgICBldmVudC50YXJnZXQuY2xvc2VzdCgnLm9wdGlvbicpLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgOlxuICAgIC8vICAgICAvLyAgICAgY3VycmVudEZha2VGb2N1c2VkT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XG5cbiAgICAvLyAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0Lmxhc3RJbmRleE9mKCcvJyk7XG4gICAgLy8gICAgIHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQgPSBsYXN0U2xhc2hJbmRleCAhPT0gLTEgPyByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0LnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KSA6IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQ7XG5cblxuICAgIC8vICAgICB0cmFuc2Zvcm1CbG9jayhkcmFnZ2FibGVCbG9jaywgbmV3QmxvY2tUeXBlKTtcblxuICAgIC8vICAgICBoaWRlQW5kQ2xlYXJCbG9ja09wdGlvbnMoKTtcbiAgICAvLyAgICAgaGlkZUFsbERlcGVuZGVudEJveCgpO1xuICAgIC8vICAgICBoaWRlZmxvYXRpbmdUb29sYmFyKCk7XG4gICAgLy8gfVxuXG4gICAgLy8gZm9ybWF0QmxvY2soZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbnRlbnRUeXBlOiBzdHJpbmcpXG4gICAgdHJhbnNmb3JtQmxvY2sodHlwZTogc3RyaW5nLCBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG5cbiAgICAgICAgbGV0IGJsb2NrRWxlbWVudDogRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmNsb3Nlc3QoXCIuYmxvY2tcIikgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwiLmJsb2NrXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRlbnRFbGVtZW50ID0gYmxvY2tFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCcuc3dpdHRhYmxlJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcblxuICAgICAgICBET01VdGlscy5yZW1vdmVGaWx0ZXJUZXh0KCk7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW1lbnQ/LmlubmVyVGV4dDtcblxuICAgICAgICBsZXQgZm9jdXNTdGFja1RvQWRkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG5cbiAgICAgICAgbGV0IG5ld0NvbnRlbnRCbG9jaztcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBIOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNvbnRlbnQgPSBET01VdGlscy5xdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZihjb250ZW50RWxlbWVudCwgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJIVE1MID0gZWRpdGFibGVDb250ZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzE6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzEpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yKTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMzoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMyk7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQ6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81OiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81KTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNik7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERToge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URToge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1Q6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU0VQQVJBVE9SOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNFUEFSQVRPUik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEU6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwiLCxcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSU1BR0U6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSU1BR0UsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5WSURFTzoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5WSURFTywgY29udGVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFja1RvQWRkID0gbmV3Q29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNQT1RJRlk6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU1BPVElGWSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFja1RvQWRkID0gbmV3Q29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVEhVQl9HSVNUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVEhVQl9HSVNULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUTEFCX1NOSVBQRVQ6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUTEFCX1NOSVBQRVQsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFUEVOOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREVQRU4sIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DQUxMT1VUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbG91dCA9IG5ld0NvbnRlbnRCbG9jay5xdWVyeVNlbGVjdG9yKFwiLmNhbGxvdXQtdGV4dFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNvbnRlbnQgPSBET01VdGlscy5xdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZihjb250ZW50RWxlbWVudCwgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxvdXQgJiYgZWRpdGFibGVDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxvdXQuaW5uZXJIVE1MID0gZWRpdGFibGVDb250ZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgdHlwZScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmV3Q29udGVudEJsb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBibG9ja0VsZW1lbnQhLnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3Q29udGVudEJsb2NrLmNsb3Nlc3QoJy5mb2N1c2FibGUnKSB8fCBibG9ja0VsZW1lbnQhLnF1ZXJ5U2VsZWN0b3IoJy5mb2N1c2FibGUnKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChmb2N1c1N0YWNrVG9BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTdGFjay5wdXNoKChmb2N1c1N0YWNrVG9BZGQgYXMgSFRNTEVsZW1lbnQpISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PSBcImltYWdlXCIgfHwgdHlwZSA9PSBcInZpZGVvXCIgfHwgdHlwZSA9PSBcInNwb3RpZnlcIiB8fCB0eXBlID09IFwiZ2l0aHViLWdpc3RcIiB8fCB0eXBlID09IFwiZ2l0bGFiLXNuaXBwZXRcIiB8fCB0eXBlID09IFwiY29kZXBlblwiKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZm9jdXNTdGFja1RvQWRkPy5xdWVyeVNlbGVjdG9yKFwiLmNvbnRlbnQtcGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChwbGFjZWhvbGRlciBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dFbGVtZW50RXZlbnQoXCJtZWRpYUlucHV0dGVyXCIpO1xuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXIgPSBibG9ja0VsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuYmxvY2stdG9vbGJhci13cmFwcGVyXCIpO1xuICAgICAgICBpZiAoYmxvY2tUb29sYmFyKSB7XG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSA9PSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xuICAgICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5jcmVhdGVEZWZhdWx0QmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgLy8ncmVxdWVzdEhpZGVGbG9hdGluZ1Rvb2xiYXInXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5ibG9ja1R5cGVDaGFuZ2VkLCB7XG4gICAgICAgIC8vICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAvLyAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNlbGVjdGlvbkV2ZW50KTtcbiAgICB9XG5cbiAgICAvL05PVyBUSEUgZm9ybWF0QmxvY2sgQU5EIHRyYW5zZm9ybUJsb2NrIElTIFRIRSBTQU1FLiBmb3JtYXRCbG9jayBJUyBERVBSRUNFVEVEIFVTRSB0cmFuc2Zvcm1CbG9jayBJTlNURURcbiAgICAvLyBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50LmlubmVyVGV4dDtcblxuICAgIC8vICAgICBsZXQgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKGNvbnRlbnRUeXBlLCBjb250ZW50KTtcblxuICAgIC8vICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgIC8vICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgLy8gICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNhYmxlKTtcbiAgICAvLyB9XG5cblxuXG4gICAgY3JlYXRlTmV3RWxlbWVudChldmVudDogRXZlbnQpIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50ICYmIGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUxpc3RJdGVtKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEJsb2NrKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUxpc3RJdGVtKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBuZXdDb250ZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveC1saXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwiY2hlY2tib3hJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShcImxpc3RJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgcGFyZW50QmxvY2sgPSBudWxsO1xuXG4gICAgICAgIC8vIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuXG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGNvbnRlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGFjdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vICAgICBpZiAodGV4dENvbnRlbnQgPT09ICcnKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gY3JlYXRlTmV3RHJhZ2dhYmxlUGFyYWdyYXBoRWxlbWVudCgpO1xuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdDb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmxpc3QtaXRlbScpO1xuICAgICAgICAvLyAgICAgICAgIGFjdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcGFyZW50QmxvY2sgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIC8vICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50QmxvY2submV4dFNpYmxpbmcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyZW50QmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Q29udGVudEVsZW1lbnQsIHBhcmVudEJsb2NrLm5leHRTaWJsaW5nKTtcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBlbGVtZW50IChwYXJhZ3JhcGggb3IgbGlzdCBpdGVtKSBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGFjY29yZGluZ2x5LlxuICAgICogVGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgcHJlc3NpbmcgJ0VudGVyJyBpbiBhbiBlZGl0YWJsZSBjb250ZW50IGFyZWEsIGZhY2lsaXRhdGluZyBkeW5hbWljIGNvbnRlbnQgY3JlYXRpb24gYW5kIG9yZ2FuaXphdGlvblxuICAgICogd2l0aGluIHRoZSBkb2N1bWVudC4gSXQgc3VwcG9ydHMgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMgaW5jbHVkaW5nIGNoZWNrbGlzdHMsIGJ1bGxldGVkIGxpc3RzLCBudW1iZXJlZCBsaXN0cywgYW5kIGdlbmVyYWwgdGV4dCBibG9ja3MuXG4gICAgKlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBleGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhdGggdGFrZW4uXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFR5cGljYWxseSBjYWxsZWQgd2l0aGluIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGtleXByZXNzIGV2ZW50c1xuICAgICogZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAqICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgKiAgICAgICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTtcbiAgICAqICAgICB9XG4gICAgKiB9KTtcbiAgICAqXG4gICAgKiBAZGVzY3JpcHRpb25cbiAgICAqIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyB1bmRlciBzZXZlcmFsIGNvbmRpdGlvbnMgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZTpcbiAgICAqIC0gRm9yIGxpc3QgaXRlbXMgKGNoZWNrbGlzdCwgYnVsbGV0ZWQsIGFuZCBudW1iZXJlZCk6XG4gICAgKiAgIDEuIEZpbmRzIHRoZSBjbG9zZXN0IGxpc3QgaXRlbSBhbmNlc3RvciBvZiB0aGUgYWN0aXZlIGVsZW1lbnQuXG4gICAgKiAgIDIuIElmIHRoZSBsaXN0IGl0ZW0gY29udGFpbnMgdGV4dCwgaXQgY2xvbmVzIHRoaXMgaXRlbSBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgY2xvbmUuXG4gICAgKiAgIDMuIElmIHRoZSBsaXN0IGl0ZW0gaXMgZW1wdHkgYW5kIGlzIHRoZSBvbmx5IGl0ZW0sIGl0IHJlbW92ZXMgdGhlIGVudGlyZSBibG9jayBhZnRlciBjcmVhdGluZyBhIG5ldyBwYXJhZ3JhcGguXG4gICAgKiAtIEZvciBvdGhlciBibG9ja3MgKGxpa2UgcGFyYWdyYXBocyk6XG4gICAgKiAgIDEuIENsb25lcyB0aGUgY3VycmVudCBibG9jayBhbmQgcmVhcnJhbmdlcyBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgbmV3IGNsb25lLlxuICAgICogICAyLiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgc3RhcnQgb2YgdGhlIG5ldyBlbGVtZW50IHRvIGNvbnRpbnVlIGVkaXRpbmcuXG4gICAgKlxuICAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgcmVtYWlucyBjb2hlcmVudCB3aGlsZSBwcm92aWRpbmcgYSBzZWFtbGVzcyB1c2VyIGV4cGVyaWVuY2UgaW4gdGV4dCBlZGl0aW5nIGVudmlyb25tZW50cy5cbiAgICAqL1xuICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gRE9NVXRpbHMuZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuVGFibGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gSnVtcCB0byB0aGUgbmV4dCBsaW5lIGlmIGV4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkNoZWNrTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkJ1bGxldGVkTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwibGlzdC1pdGVtXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgRE9NVXRpbHMuaGFzVGV4dENvbnRlbnQoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50Q2xvbmUgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5yZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdChjb250ZW50Q3VycmVudCwgY29udGVudENsb25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCbG9jayA9IGN1cnJlbnRJdGVtLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHBhcmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubGlzdC1pdGVtXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCBwYXJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld1BhcmFncmFwaCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcInBcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkQmxvY2sgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENsb25lID0gY2xvbmVkQmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY29udGVudEN1cnJlbnQsIGNvbnRlbnRDbG9uZSk7XG5cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgsIGNsb25lZEJsb2NrKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IChjbG9uZWRCbG9jayBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNhYmxlIGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cbiAgICBjcmVhdGVBTmV3UGFyYWdyYXBoRnJvbVRpdGxlKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLnRpdGxlIGgxXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNsb25lZFRpdGxlID0gRE9NVXRpbHMuY2xvbmVBbmRJbnNlcnRBZnRlcih0aXRsZSk7XG4gICAgICAgIGlmIChjbG9uZWRUaXRsZSkge1xuICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQodGl0bGUgYXMgTm9kZSwgY2xvbmVkVGl0bGUgYXMgTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CTE9DS19QQVJBR1JBUEgsIFwiXCIpO1xuICAgICAgICBjb25zdCBwID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gY2xvbmVkVGl0bGU/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnRcIik7XG5cbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHJlcGVuZChuZXdCbG9jayk7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3QmxvY2sgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXCIuZm9jdXNhYmxlXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmVkVGl0bGU/LnJlbW92ZSgpO1xuICAgIH1cblxuXG5cblxuXG4gICAgLy8gc3BsaXRDb250ZW50QXRDdXJzb3IoKTogdm9pZCB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcblxuICAgIC8vICAgICAvLyBDcmlhbmRvIHJhbmdlIHBhcmEgbyBjb250ZcO6ZG8gYW50ZXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgcmFuZ2VCZWZvcmUuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRhaW5lcik7XG4gICAgLy8gICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xuXG4gICAgLy8gICAgIC8vIENyaWFuZG8gcmFuZ2UgcGFyYSBvIGNvbnRlw7pkbyBkZXBvaXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQWZ0ZXIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhjb250YWluZXIpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcblxuICAgIC8vICAgICAvLyBFeGVtcGxvOiBJc29sYW5kbyBvIHRleHRvIGRlIGNhZGEgcGFydGVcbiAgICAvLyAgICAgY29uc3QgdGV4dEJlZm9yZSA9IHJhbmdlQmVmb3JlLnRvU3RyaW5nKCk7XG4gICAgLy8gICAgIGNvbnN0IHRleHRBZnRlciA9IHJhbmdlQWZ0ZXIudG9TdHJpbmcoKTtcblxuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gYW50ZXMgZG8gY3Vyc29yOicsIHRleHRCZWZvcmUpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gZGVwb2lzIGRvIGN1cnNvcjonLCB0ZXh0QWZ0ZXIpO1xuXG4gICAgLy8gICAgIC8vIEFxdWkgdm9jw6ogcG9kZSBtYW5pcHVsYXIgbyBET00gY29tbyBuZWNlc3PDoXJpbywgcG9yIGV4ZW1wbG86XG4gICAgLy8gICAgIC8vIGluc2VyaXIgbm92b3MgZWxlbWVudG9zLCBtb2RpZmljYXIgbyB0ZXh0bywgZXRjLlxuICAgIC8vIH1cblxuXG4gICAgY3JlYXRlRGVmYXVsdEJsb2NrKGV2ZW50UGFyYWdyYXBoOiBFbGVtZW50IHwgbnVsbCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCwgXCJcIik7XG5cbiAgICAgICAgaWYgKGV2ZW50UGFyYWdyYXBoICYmIGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpKSB7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gZXZlbnRQYXJhZ3JhcGguY2xvc2VzdCgnLmJsb2NrJykhO1xuICAgICAgICAgICAgc2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3QmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudFwiKSEuYXBwZW5kQ2hpbGQobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcignLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2gobmV3QmxvY2spO1xuXG4gICAgICAgIHJldHVybiBuZXdCbG9jaztcblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzYWJsZSk7XG4gICAgfVxuXG4gICAgZXhlY0ZvY3VzT25OZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgfHwgRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE7XG5cbiAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBleGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRBY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uUHJldmlvdXMoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQgPSBhY3R1YWxFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGlmICghcHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgJiYgcHJldmlvdXNFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IHByZXZpb3VzRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhFbmRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzW2ZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoIC0gMV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmV2aW91c0ZvY3VzYWJsZUVsZW1lbnQoYWN0dWFsRWxlbWVudDogRWxlbWVudCk6IEVsZW1lbnQgfCBudWxsIHtcblxuICAgICAgICBsZXQgdGFnID0gYWN0dWFsRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGxldCBmb2N1c2VkRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gJ0xJJykge1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKCFwcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpYmxpbmcgPSBwYXJlbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggLSAxXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uTmV4dChhY3R1YWxFbGVtZW50OiBFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFjdHVhbEVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknIC8qIGZvY3VzYWJsZSBTUEFOIGluc2lkZSBMSSovKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJ2xpJyk/Lm5leHRFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGdldE5leHRGb2N1c2FibGVFbGVtZW50KGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ubmV4dEVsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0RWxlbWVudCAmJiBuZXh0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBuZXh0RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuXG4gICAgLy8gICAgICAgICBsZXQgbGFzdENoaWxkID0gY29udGVudEJsb2NrO1xuXG4gICAgLy8gICAgICAgICB3aGlsZSAobGFzdENoaWxkLmxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAobGFzdENoaWxkLmxhc3RDaGlsZCkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Q2hpbGQsIGxhc3RDaGlsZC50ZXh0Q29udGVudCEubGVuZ3RoKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0sIDEwKTtcbiAgICAvLyB9XG5cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cblxuICAgIGp1c3RpZnlMZWZ0KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICB0aGlzLnJlbW92ZUp1c3RpZnkoYmxvY2spO1xuICAgICAgICBibG9jay5jbGFzc0xpc3QuYWRkKFwianVzdGlmeS1sZWZ0XCIpO1xuICAgIH1cblxuICAgIGp1c3RpZnlDZW50ZXIoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LWNlbnRlclwiKTtcbiAgICB9XG5cbiAgICBqdXN0aWZ5UmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LXJpZ2h0XCIpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlKGJsb2NrOiBIVE1MRWxlbWVudCwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjb2RlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcImNvZGVcIik7XG5cbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIERPTVV0aWxzLnJlbW92ZUNsYXNzZXNXaXRoUHJlZml4KGNvZGUgYXMgRWxlbWVudCwgXCJsYW5ndWFnZS1cIik7XG4gICAgICAgICAgICBjb2RlLmNsYXNzTGlzdC5hZGQoYGxhbmd1YWdlLSR7dmFsdWV9YCk7XG4gICAgICAgICAgICBjb2RlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaGlnaGxpZ2h0ZWRcIik7XG5cbiAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudChcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiLCBibG9jay5pZCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVKdXN0aWZ5KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChcImp1c3RpZnktXCIpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIGV4ZWNDaGFuZ2VDYWxsb3V0QmFja2dyb3VuZChibG9jazogSFRNTEVsZW1lbnQsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBjYWxsb3V0RGl2ID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0ID4gZGl2XCIpO1xuXG4gICAgICAgIGlmIChjYWxsb3V0RGl2KSB7XG4gICAgICAgICAgICBET01VdGlscy5yZW1vdmVDbGFzc2VzV2l0aFByZWZpeChjYWxsb3V0RGl2IGFzIEVsZW1lbnQsIFwiY2FsbG91dC1iYWNrZ3JvdW5kLVwiKTtcbiAgICAgICAgICAgIGNhbGxvdXREaXYuY2xhc3NMaXN0LmFkZChjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XG5pbXBvcnQgeyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIkAvY29yZS9JTWVtZW50b1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBCdXR0b25JRHMgfSBmcm9tIFwiQC9jb3JlL0J1dHRvbklEc1wiO1xuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcblxudHlwZSBUYXJnZXROb2RlID0ge1xuICAgIG5vZGVUeXBlOiBzdHJpbmc7XG4gICAgY2xhc3Nlcz86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFRleHRPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElUZXh0T3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRleHRPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgbWVtZW50bzogSU1lbWVudG87XG5cbiAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogYW55O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihtZW1lbnRvOiBJTWVtZW50bykge1xuICAgICAgICBpZiAoVGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGV4dE9wZXJhdGlvblNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUZXh0T3BlcmF0aW9uc1NlcnZpY2UobWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBleGVjSW5zZXJ0TGluayh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjcmVhdGVMaW5rXCIsIGZhbHNlLCB1cmwpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5MaW5rLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmNob3JzKCk7XG4gICAgICAgIH0sIDUwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vcm1hbGl6ZUFuY2hvcnMoKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50IGFcIik7XG5cbiAgICAgICAgYW5jaG9ycy5mb3JFYWNoKGFuY2hvciA9PiB7XG4gICAgICAgICAgICBpZiAoIWFuY2hvci5oYXNBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcbiAgICAgICAgICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKCd0aXRsZScsIChhbmNob3IgYXMgSFRNTEFuY2hvckVsZW1lbnQpLmhyZWYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhbmNob3Iubm9ybWFsaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgZXhlY1RvZ2dsZUxpbmsoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5xdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dFbGVtZW50RXZlbnQoXCJsaW5rQm94XCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3VubGluaycsIGZhbHNlKTtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChcImxpbmtCdXR0b25cIiwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0JvbGQoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImJvbGRcIikpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShcImJvbGRcIikpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkJvbGQsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuQm9sZCwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0lubGluZUNvZGUoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZUlubGluZUNvZGUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlKCkpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLklubGluZUNvZGUsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuSW5saW5lQ29kZSwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdG9nZ2xlSW5saW5lQ29kZSgpOiBib29sZWFuIHtcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHJhbmdlLmV4dHJhY3RDb250ZW50cygpO1xuXG4gICAgLy8gICAgIGlmIChzZWxlY3Rpb24uYW5jaG9yTm9kZT8ucGFyZW50RWxlbWVudD8udGFnTmFtZSA9PT0gXCJDT0RFXCIpIHtcbiAgICAvLyAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2VsZWN0ZWRDb250ZW50LnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgY29uc3QgY29kZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY29kZVwiKTtcbiAgICAvLyAgICAgICAgIGNvZGVFbGVtZW50LmFwcGVuZENoaWxkKHNlbGVjdGVkQ29udGVudCk7XG4gICAgLy8gICAgICAgICByYW5nZS5pbnNlcnROb2RlKGNvZGVFbGVtZW50KTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAvLyAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB9XG5cbiAgICB0b2dnbGVJbmxpbmVDb2RlKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkQ29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IEhUTUxTcGFuRWxlbWVudCA9IHJhbmdlLmV4dHJhY3RDb250ZW50cygpO1xuXG4gICAgICAgIGxldCBpc0NvZGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY29udGFpbnNDb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBjb250YWluc0NvZGUuYXBwZW5kQ2hpbGQoc2VsZWN0ZWRDb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5zQ29kZS5xdWVyeVNlbGVjdG9yKCdjb2RlJykpIHtcbiAgICAgICAgICAgIGlzQ29kZSA9IHRydWU7XG4gICAgICAgICAgICBjb250YWluc0NvZGUucXVlcnlTZWxlY3RvckFsbCgnY29kZScpLmZvckVhY2goY29kZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2RlLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgICAgICAgICAgICBjb2RlLnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZCh0ZXh0Tm9kZSwgY29kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGVjdGVkQ29udGVudCA9IGNvbnRhaW5zQ29kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJlbnRDb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRDb2RlICYmIHBhcmVudENvZGUubm9kZU5hbWUgIT09IFwiQ09ERVwiICYmIHBhcmVudENvZGUubm9kZU5hbWUgIT09IFwiQk9EWVwiKSB7XG4gICAgICAgICAgICBwYXJlbnRDb2RlID0gcGFyZW50Q29kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudENvZGUgJiYgcGFyZW50Q29kZS5ub2RlTmFtZSA9PT0gXCJDT0RFXCIpIHtcbiAgICAgICAgICAgIGlzQ29kZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHBhcmVudENvZGUudGV4dENvbnRlbnQgfHwgJycpO1xuICAgICAgICAgICAgcGFyZW50Q29kZS5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQodGV4dE5vZGUsIHBhcmVudENvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0NvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNvZGVcIik7XG4gICAgICAgICAgICBjb2RlRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RlZENvbnRlbnQpO1xuICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjb2RlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKGNvbnRhaW5zQ29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjb250ZW50Lm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgICAgICBET01VdGlscy5tZXJnZUlubGluZUVsZW1lbnRzKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZXhlY0l0YWxpYygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaXRhbGljXCIpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJpdGFsaWNcIikpIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkl0YWxpYywgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5JdGFsaWMsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNTdHJpa2VUaHJvdWdoKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJzdHJpa2VUaHJvdWdoXCIpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJzdHJpa2VUaHJvdWdoXCIpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlN0cmlrZXRocm91Z2gsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNVbmRlcmxpbmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJ1bmRlcmxpbmVcIikpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShcInVuZGVybGluZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlVuZGVybGluZSwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLlVuZGVybGluZSwgQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaGlsaXRlQ29sb3JcIiwgZmFsc2UsIHZhbHVlKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjRm9yZUNvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIik7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiZm9yZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVMaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT09IENvbW1hbmRzLnRvZ2dsZVVuZGVybGluZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlIaWxpdGVDb2xvcih2YWx1ZSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT09IENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlGb3JlQ29sb3IodmFsdWUhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeUlubGluZUNvZGVDb21tYW5kU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKTtcbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIHF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgLy8gICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgLy8gICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIC8vIFZlcmlmaWNhIHNlIGFsZ3VtIG7DsyBwYWkgw6kgdW1hIMOibmNvcmFcbiAgICAvLyAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAvLyAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdBJykge1xuICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEEgc2VsZcOnw6NvIGVzdMOhIGRlbnRybyBkZSB1bWEgw6JuY29yYVxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbG9zZXN0KCdhJykpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIHNlbGXDp8OjbyBlc3TDoSBkZW50cm8gZGUgYWxnbyBxdWUgZXN0w6EgZGVudHJvIGRlIHVtYSDDom5jb3JhXG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIC8vIFZlcmlmaWNhIHNlIGEgc2VsZcOnw6NvIGNvbnTDqW0gdW1hIMOibmNvcmEgY29tcGxldGFcbiAgICAvLyAgICAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyID09PSByYW5nZS5lbmRDb250YWluZXIpIHtcbiAgICAvLyAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lci5jaGlsZE5vZGVzKTtcbiAgICAvLyAgICAgICAgIGxldCBzZWxlY3RlZEFuY2hvcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgLy8gICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoY2hpbGQgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUgPT09ICdBJykge1xuICAgIC8vICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUoY2hpbGQpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEFuY2hvciA9IGNoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgLy8gICAgICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRBbmNob3IgJiYgcmFuZ2UudG9TdHJpbmcoKSA9PT0gc2VsZWN0ZWRBbmNob3IudGV4dENvbnRlbnQpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIEEgc2VsZcOnw6NvIMOpIGV4YXRhbWVudGUgbyB0ZXh0byBkZSB1bWEgw6JuY29yYVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIH1cblxuXG4gICAgLy9PUklHSU5BTFxuICAgIC8vIHByaXZhdGUgcXVlcnlBbmNob3JDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAvLyAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgLy8gICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgIC8vICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ2EnKSkge1xuICAgIC8vICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cbiAgICAvLyBtdWx0aXBsZXMgZWxlbWVudHNcbiAgICBwcml2YXRlIHF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q29udGFpbmVyID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XG4gICAgICAgIGNvbnN0IGVuZENvbnRhaW5lciA9IHJhbmdlLmVuZENvbnRhaW5lcjtcblxuICAgICAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBpZiBhIG5vZGUgb3IgaXRzIHBhcmVudHMgYXJlIGFuIDxhPiBlbGVtZW50XG4gICAgICAgIGNvbnN0IGlzTm9kZUluc2lkZUFuY2hvciA9IChub2RlOiBOb2RlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzIHdpdGhpbiBhbiA8YT4gZWxlbWVudFxuICAgICAgICBpZiAoaXNOb2RlSW5zaWRlQW5jaG9yKHN0YXJ0Q29udGFpbmVyKSB8fCBpc05vZGVJbnNpZGVBbmNob3IoZW5kQ29udGFpbmVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBhbGwgZWxlbWVudHMgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGlmIG5lY2Vzc2FyeVxuICAgICAgICBjb25zdCBub2Rlc0luUmFuZ2UgPSByYW5nZS5jbG9uZUNvbnRlbnRzKCkucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgICByZXR1cm4gbm9kZXNJblJhbmdlLmxlbmd0aCA+IDA7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHF1ZXJ5SW5saW5lQ29kZUNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnY29kZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBxdWVyeVVuZGVybGluZUNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgndScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHF1ZXJ5Rm9yZUNvbG9yKGV4cGVjdGVkQ29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9udENvbG9yID0gKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJmb250W2NvbG9yXVwiKTtcbiAgICAgICAgaWYgKCFmb250Q29sb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGZvbnRDb2xvcik7XG4gICAgICAgIGNvbnN0IHJnYkNvbG9yID0gc3R5bGUuY29sb3I7XG5cbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBVdGlscy5yZ2JUb0hleChyZ2JDb2xvcik7XG5cbiAgICAgICAgcmV0dXJuIGhleENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IGV4cGVjdGVkQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBxdWVyeUhpbGl0ZUNvbG9yKGV4cGVjdGVkQ29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGFuV2l0aEJhY2tncm91bmQgPVxuICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJzcGFuW3N0eWxlKj0nYmFja2dyb3VuZC1jb2xvciddXCIpIHx8XG4gICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcImZvbnRbc3R5bGUqPSdiYWNrZ3JvdW5kLWNvbG9yJ11cIik7XG5cbiAgICAgICAgaWYgKCFzcGFuV2l0aEJhY2tncm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNwYW5XaXRoQmFja2dyb3VuZCk7XG4gICAgICAgIGNvbnN0IHJnYkNvbG9yID0gc3R5bGUuYmFja2dyb3VuZENvbG9yO1xuXG4gICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpO1xuXG4gICAgICAgIHJldHVybiBoZXhDb2xvci50b1VwcGVyQ2FzZSgpID09PSBleHBlY3RlZENvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0VGFyZ2V0RWxlbWVudE1hcChjb21tYW5kOiBzdHJpbmcpOiBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcblxuICAgICAgICAgICAgY2FzZSBcInN0cm9uZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImJvbGRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdzdHJvbmcnO1xuXG4gICAgICAgICAgICBjYXNlIFwiaXRhbGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiaVwiOlxuICAgICAgICAgICAgY2FzZSBcImVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZW1cIjtcblxuICAgICAgICAgICAgY2FzZSBcInVuZGVybGluZVwiOlxuICAgICAgICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ1XCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJpa2V0aHJvdWdoXCI6XG4gICAgICAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAncyc7XG5cbiAgICAgICAgICAgIGNhc2UgXCJiYWNrZ3JvdW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBjYXNlIFwiY29sb3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuXCI7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0U2VsZWN0ZWRIVE1MRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIGdldFNlbGVjdGVkVGV4dE5vZGVzKCk6IE5vZGVbXSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHROb2RlczogTm9kZVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ucmFuZ2VDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUl0ZXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKFxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX1JFSkVDVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKChub2RlID0gbm9kZUl0ZXJhdG9yLm5leHROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLkVORF9UT19TVEFSVCwgbm9kZVJhbmdlKSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19FTkQsIG5vZGVSYW5nZSkgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XG4gICAgfVxuXG4gICAgZmluZENsb3Nlc3RNYXRjaGluZ1BhcmVudChlbGVtZW50OiBOb2RlIHwgbnVsbCwgdGFyZ2V0OiBUYXJnZXROb2RlKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YXJnZXQubm9kZVR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5jbGFzc2VzIHx8IHRhcmdldC5jbGFzc2VzLmV2ZXJ5KGNscyA9PiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGV4dHJhY3RTZWxlY3RlZFRleHQodGV4dE5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAgICAgICBpZiAodGV4dE5vZGUubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcblxuICAgICAgICBsZXQgc3RhcnQgPSAwO1xuICAgICAgICBsZXQgZW5kID0gdGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAgIGlmICghcmFuZ2UuaW50ZXJzZWN0c05vZGUodGV4dE5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UuZW5kQ29udGFpbmVyID09PSB0ZXh0Tm9kZSkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UuZW5kT2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmVuZENvbnRhaW5lci5jb250YWlucyh0ZXh0Tm9kZSkpIHtcbiAgICAgICAgICAgIGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVGFibGVVdGlsc1wiO1xuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9JVGFibGVPcGVyYXRpb25zU2VydmljZVwiO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiQC9jb3JlL0lGb2N1c1N0YWNrXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIi4vVGFibGVTY29wZXNcIjtcbmltcG9ydCB7IERPTUVsZW1lbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RPTUVsZW1lbnRzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xuaW1wb3J0IHsgVG9vbGJhcklEcyB9IGZyb20gXCJAL2NvcmUvVG9vbGJhcklEc1wiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcbiAgICBwcml2YXRlIG1lbWVudG86IElNZW1lbnRvO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrLFxuICAgICAgICBtZW1lbnRvOiBJTWVtZW50bykge1xuICAgICAgICBpZiAoVGFibGVPcGVyYXRpb25zU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrID0gZm9jdXNTdGFjaztcbiAgICAgICAgdGhpcy5tZW1lbnRvID0gbWVtZW50bztcbiAgICB9XG5cbiAgICBpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICB9XG5cbiAgICByZW1vdmVDb2x1bW4oKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xuXG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgIH1cblxuICAgIHJlbW92ZVJvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xuXG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBUYWJsZVV0aWxzLnJlbW92ZVJvd0J5Q2VsbChjZWxsIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgIH1cblxuXG4gICAgZXhlY0NlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcblxuICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gVGFibGVVdGlscy5nZXRBY3RpdmVUYWJsZUNlbGwoKTtcblxuICAgICAgICBpZiAoYWN0aXZlQ2VsbCkge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBhY3RpdmVDZWxsLmNsb3Nlc3QoJ3RhYmxlJykhO1xuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcblxuICAgICAgICAgICAgc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICBzdGF0aWMgaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50LCB0YXJnZXRIZXhDb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghY2VsbCB8fCBjZWxsLnRhZ05hbWUgIT09ICdURCcgfHwgIWNlbGwuaGFzQXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcbiAgICAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xuXG4gICAgICAgIGNvbnN0IGhleEJhY2tncm91bmRDb2xvciA9IFV0aWxzLnJnYlRvSGV4KGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IpO1xuXG4gICAgICAgIHJldHVybiBoZXhCYWNrZ3JvdW5kQ29sb3IudG9VcHBlckNhc2UoKSA9PT0gdGFyZ2V0SGV4Q29sb3IudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBxdWVyeVN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3QgY2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XG5cbiAgICAgICAgaWYgKGNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcblxuICAgICAgICAgICAgY29uc3QgaGV4QmFja2dyb3VuZENvbG9yID0gVXRpbHMucmdiVG9IZXgoY3VycmVudEJhY2tncm91bmRDb2xvcik7XG5cbiAgICAgICAgICAgIHJldHVybiBoZXhCYWNrZ3JvdW5kQ29sb3IudG9VcHBlckNhc2UoKSA9PT0gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBjb25zdCBhID0gRE9NVXRpbHMuXG5cbiAgICAgICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICAvLyBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiKTtcblxuICAgICAgICAvLyBjb25zdCBhY3RpdmVDZWxsID0gVGFibGVVdGlscy5nZXRBY3RpdmVUYWJsZUNlbGwoKTtcblxuICAgICAgICAvLyBpZiAoYWN0aXZlQ2VsbCkge1xuICAgICAgICAvLyAgICAgY29uc3QgdGFibGUgPSBhY3RpdmVDZWxsLmNsb3Nlc3QoJ3RhYmxlJykhO1xuXG4gICAgICAgIC8vICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcblxuICAgICAgICAvLyAgICAgc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4ge1xuICAgICAgICAvLyAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICAgICAgLy8gICAgIH0pO1xuXG4gICAgICAgIC8vICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG5cbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIHF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKGVsZW1lbnRzOiBIVE1MVGFibGVDZWxsRWxlbWVudFtdLCBjb2xvcjogQ29sb3JzKTogYm9vbGVhbiB7XG5cbiAgICAgICAgbGV0IGlzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY29sb3IgPT0gQ29sb3JzLkJhY2tncm91bmRDb2xvck5vbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goY2VsbCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XG4gICAgICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBVdGlscy5yZ2JUb0hleChyZ2JDb2xvcikudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChoZXhDb2xvciAhPT0gY29sb3IudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGlzID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpcztcbiAgICB9XG5cblxuICAgIC8vIGV4ZWNIaWxpdGVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgLy8gICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImhpbGl0ZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAvLyAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuICAgIC8vICAgICB9ZWxzZXtcbiAgICAvLyAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCB2YWx1ZSwgXCJoaWRlXCIpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uge1xuXG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XG4gICAgICAgIGNvbnN0IG1lbWVudG8gPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SU1lbWVudG8+KFwiSU1lbWVudG9cIik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UoZm9jdXNTdGFjaywgbWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBpbnNlcnRSb3dBYm92ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpOyAvLyBBZ29yYSwgYGNlbGxgIMOpIGEgYHRkYCBkaXJldGFtZW50ZVxuICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQ7IC8vIE9idGVtIGEgbGluaGEgKGB0cmApIHBhaSBkYSBjw6lsdWxhXG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcm93IGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5jbG9zZXN0KFwidGFibGVcIik7IC8vIEVuY29udHJhIGEgdGFiZWxhIHF1ZSBjb250w6ltIGEgbGluaGFcbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpIHx8IHRhYmxlOyAvLyBBc3N1bWUgdGFibGUgc2UgdGJvZHkgbsOjbyBleGlzdGlyXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0Ym9keS5jaGlsZHJlbikuaW5kZXhPZihyb3cpOyAvLyBFbmNvbnRyYSBvIMOtbmRpY2UgZGEgbGluaGEgZGVudHJvIGRvIHRib2R5IG91IGRhIHRhYmVsYVxuXG4gICAgICAgIGlmIChyb3dJbmRleCA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSb3cgaW5kZXggbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgVGFibGVVdGlscy5hZGRSb3codGFibGUsIHJvd0luZGV4KTsgLy8gSW5zZXJlIHVtYSBub3ZhIGxpbmhhIG5vIMOtbmRpY2UgZW5jb250cmFkb1xuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICB9XG5cbiAgICBpbnNlcnRSb3dCZWxvdyhibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwidGFibGVcIik7XG4gICAgICAgICAgICBpZiAodGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKFwidHI6bGFzdC1jaGlsZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0YWJsZS5jaGlsZHJlblswXS5jaGlsZHJlbikuaW5kZXhPZihyb3cpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgVGFibGVVdGlscy5hZGRSb3codGFibGUsIHJvd0luZGV4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gcm93cyBpbiB0aGUgdGFibGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBmb2N1c2VkIGVsZW1lbnQgYXZhaWxhYmxlXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGVsZW1lbnQuY2xvc2VzdChcInRkXCIpO1xuICAgICAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGNlbGwucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gQXJyYXkuZnJvbSh0YWJsZS5jaGlsZHJlblswXS5jaGlsZHJlbikuaW5kZXhPZihyb3cpICsgMTtcbiAgICAgICAgICAgICAgICBUYWJsZVV0aWxzLmFkZFJvdyh0YWJsZSwgcm93SW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGluc2VydENvbHVtbihkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCcpOiB2b2lkIHtcbiAgICAvLyAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpOyAgLy8gU2FsdmEgbyBlc3RhZG8gYXR1YWwgcGFyYSBwb3Nzw612ZWwgZGVzZmF6aW1lbnRvXG5cbiAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7ICAvLyBQZWdhIG8gZWxlbWVudG8gYXR1YWxtZW50ZSBmb2NhZG9cbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAvLyAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTsgIC8vIEVuY29udHJhIGEgY8OpbHVsYSBmb2NhZGEgZGVudHJvIGRhIHRhYmVsYVxuICAgIC8vICAgICBpZiAoIWNlbGwpIHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpOyAgLy8gRW5jb250cmEgYSB0YWJlbGEgY29udGVuZG8gYSBjw6lsdWxhXG4gICAgLy8gICAgIGlmICghdGFibGUpIHtcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAvLyAgICAgICAgIHJldHVybjtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gQXJyYXkuZnJvbShjZWxsLnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pLmluZGV4T2YoY2VsbCk7ICAvLyBEZXRlcm1pbmEgbyDDrW5kaWNlIGRhIGNvbHVuYSBhdHVhbFxuICAgIC8vICAgICBpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcpIHtcbiAgICAvLyAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCk7ICAvLyBBZGljaW9uYSBjb2x1bmEgw6AgZXNxdWVyZGFcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCArIDEpOyAgLy8gQWRpY2lvbmEgY29sdW5hIMOgIGRpcmVpdGFcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIGluc2VydENvbHVtbkxlZnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcbiAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRhYmxlIGRvZXMgbm90IGV4aXN0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBBcnJheS5mcm9tKGNlbGwucGFyZW50RWxlbWVudCEuY2hpbGRyZW4pLmluZGV4T2YoY2VsbCk7XG4gICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XG5cbiAgICB9XG5cbiAgICBpbnNlcnRDb2x1bW5SaWdodChibG9jazogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gQXJyYXkuZnJvbShjZWxsLnBhcmVudEVsZW1lbnQhLmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpO1xuICAgICAgICAgICAgVGFibGVVdGlscy5hZGRDb2x1bW4odGFibGUsIGNvbHVtbkluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtcm93XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcbiAgICB9XG5cbiAgICBzaG93SW5zZXJ0Q29sdW1uRWxlbWVudChibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaW5zZXJ0TGluZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgfVxuXG4gICAgaGlkZUluc2VydFJvd0VsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1yb3dcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgfVxuXG4gICAgaGlkZUluc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1jb2x1bW5cIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgfVxuXG4gICAgLy8gaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyAgICAgcmV0dXJuIFRhYmxlVXRpbHMuaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlKTtcbiAgICAvLyB9XG5cbiAgICAvLyBlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50ID0gKHNjb3BlOiBUYWJsZVNjb3BlcywgY29sb3I6IENvbG9ycyk6IHZvaWQgPT4ge1xuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudChDb21tYW5kcy4sIHtcbiAgICAvLyAgICAgICAgIGRldGFpbDogeyBzY29wZTogc2NvcGUgfVxuICAgIC8vICAgICB9KTtcblxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcbiAgICAvLyB9XG5cblxuICAgIGNoYW5nZVRhYmxlQm9yZGVyQ29sb3Ioc2NvcGU6IFRhYmxlU2NvcGVzLCBjb2xvcjogQ29sb3JzKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpPy5jbG9zZXN0KERPTUVsZW1lbnRzLlRBQkxFKTtcblxuICAgICAgICBpZiAodGFibGUpIHtcbiAgICAgICAgICAgIFRhYmxlVXRpbHMuY2hhbmdlQ2VsbEJvcmRlckNvbG9yKHRhYmxlLCBzY29wZSwgY29sb3IpXG4gICAgICAgIH1cbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBDb21tb25DbGFzc2VzIH0gZnJvbSBcIkAvY29tbW9uL0NvbW1vbkNsYXNzZXNcIjtcclxuaW1wb3J0IHsgSU1lbWVudG8gfSBmcm9tIFwiLi9JTWVtZW50b1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZW1lbnRvIGltcGxlbWVudHMgSU1lbWVudG8ge1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBxdWVyeTogc3RyaW5nID0gXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnQtd3JhcHBlclwiO1xyXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBNZW1lbnRvO1xyXG5cclxuICBwcml2YXRlIHVuZG9TdGFjazogeyBodG1sOiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9IH1bXSA9IFtdO1xyXG4gIHByaXZhdGUgcmVkb1N0YWNrOiB7IGh0bWw6IHN0cmluZywgY2FyZXRQb3NpdGlvbjogeyBjaGFySW5kZXg6IG51bWJlciwgaG9yaXpvbnRhbFBvczogbnVtYmVyLCB2ZXJ0aWNhbFBvczogbnVtYmVyIH0gfVtdID0gW107XHJcblxyXG4gIHByaXZhdGUgZ2V0IGNvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoTWVtZW50by5xdWVyeSkhO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGlmIChNZW1lbnRvLmluc3RhbmNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBNZW1lbnRvLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICBjb25zdCBjbG9uZSA9IHRoaXMuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gRE9NVXRpbHMuc2F2ZUNhcmV0UG9zaXRpb24zZCh0aGlzLmNvbnRlbnQpO1xyXG5cclxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKGAuJHtDb21tb25DbGFzc2VzLkVkaXRvck9ubHl9YCkuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XHJcblxyXG4gICAgICAgIHRoaXMudW5kb1N0YWNrLnB1c2goeyBodG1sOiBjbG9uZS5pbm5lckhUTUwsIGNhcmV0UG9zaXRpb24gfSk7XHJcbiAgICAgICAgdGhpcy5yZWRvU3RhY2sgPSBbXTtcclxuICAgICAgfSwgMTApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMudW5kb1N0YWNrLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5yZWRvU3RhY2sucHVzaCh7IGh0bWw6IHRoaXMuY29udGVudC5pbm5lckhUTUwsIGNhcmV0UG9zaXRpb246IERPTVV0aWxzLnNhdmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50KSB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlVG9SZXN0b3JlID0gdGhpcy51bmRvU3RhY2sucG9wKCk7XHJcbiAgICAgIGlmIChzdGF0ZVRvUmVzdG9yZSkge1xyXG4gICAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvUmVzdG9yZS5odG1sO1xyXG4gICAgICAgIERPTVV0aWxzLnJlc3RvcmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50LCBzdGF0ZVRvUmVzdG9yZS5jYXJldFBvc2l0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWRvKCkge1xyXG4gICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy51bmRvU3RhY2sucHVzaCh7IGh0bWw6IHRoaXMuY29udGVudC5pbm5lckhUTUwsIGNhcmV0UG9zaXRpb246IERPTVV0aWxzLnNhdmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50KSB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXRlVG9BcHBseSA9IHRoaXMucmVkb1N0YWNrLnBvcCgpO1xyXG4gICAgICBpZiAoc3RhdGVUb0FwcGx5KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50LmlubmVySFRNTCA9IHN0YXRlVG9BcHBseS5odG1sO1xyXG4gICAgICAgIERPTVV0aWxzLnJlc3RvcmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50LCBzdGF0ZVRvQXBwbHkuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF0dGFjaEV2ZW50cygpIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd6Jykge1xyXG4gICAgICAgIHRoaXMudW5kbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICd5Jykge1xyXG4gICAgICAgIHRoaXMucmVkbygpO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAvLyAgIGNvbnN0IGlucHV0RXZlbnQgPSBldmVudCBhcyBJbnB1dEV2ZW50O1xyXG4gICAgLy8gICBpZiAoIWlucHV0RXZlbnQuaXNDb21wb3NpbmcgJiYgIWlucHV0RXZlbnQuaW5wdXRUeXBlLnN0YXJ0c1dpdGgoXCJkZWxldGVcIikpIHtcclxuICAgIC8vICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZGVib3VuY2VUaW1lcik7XHJcbiAgICAvLyAgICAgdGhpcy5kZWJvdW5jZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5zYXZlU3RhdGUoKTtcclxuICAgIC8vICAgICB9LCB0aGlzLmRlYm91bmNlRGVsYXkpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5dXAsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5TcGFjZSkge1xyXG4gICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBNZW1lbnRvIHtcclxuICAgIGlmICghTWVtZW50by5pbnN0YW5jZSkge1xyXG4gICAgICBNZW1lbnRvLmluc3RhbmNlID0gbmV3IE1lbWVudG8oKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWVtZW50by5pbnN0YW5jZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcbmltcG9ydCB7IElFZGl0YWJsZU5hdmlnYXRpb24gfSBmcm9tIFwiLi9JRWRpdGFibGVOYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBEaXJlY3Rpb25zIH0gZnJvbSBcIkAvY29tbW9uL0RpcmVjdGlvbnNcIjtcbmltcG9ydCB7IEJvdW5kYXJpZXMgfSBmcm9tIFwiQC9jb21tb24vQm91bmRhcmllc1wiO1xuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSBcIkAvY29tcG9uZW50cy9xdWljay1tZW51L0lRdWlja01lbnVcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiLi9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBoYW5kbGVzIGtleWJvYXJkIGV2ZW50cyB0byBuYXZpZ2F0ZSBiZXR3ZWVuIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50cyB1c2luZyBhcnJvdyBrZXlzLFxuICogYW5kIGVuc3VyZXMgZm9jdXMgbWFuYWdlbWVudCBhbmQgY2FyZXQgcGxhY2VtZW50IHdpdGhpbiB0aGVzZSBlbGVtZW50cy5cbiAqIEl0IGltcGxlbWVudHMgdGhlIGBJRWRpdGFibGVOYXZpZ2F0aW9uYCBpbnRlcmZhY2UgYW5kIHVzZXMgYSBzaW5nbGV0b24gcGF0dGVybiB0byBtYW5hZ2UgaXRzIGluc3RhbmNlLlxuICovXG5leHBvcnQgY2xhc3MgRWRpdGFibGVOYXZpZ2F0aW9uIGltcGxlbWVudHMgSUVkaXRhYmxlTmF2aWdhdGlvbiB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRWRpdGFibGVOYXZpZ2F0aW9uO1xuXG4gICAgcXVpY2tNZW51OiBJUXVpY2tNZW51O1xuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGV4dGVybmFsIGluc3RhbnRpYXRpb24uXG4gICAgICogSXQgYmluZHMgdGhlIGBoYW5kbGVBcnJvd0tleXNgIG1ldGhvZCB0byBrZXlib2FyZCBldmVudHMgb24gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocXVpY2tNZW51OiBJUXVpY2tNZW51KSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUFycm93S2V5cy5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLnF1aWNrTWVudSA9IHF1aWNrTWVudTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3RzIGFzIGEgdHJpZ2dlciB3aXRoaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbnRhaW5lciB0byBlbnN1cmUgaW5zdGFudGlhdGlvbiBvZiB0aGlzIHNpbmdsZXRvbiBjbGFzcy5cbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIGFueSBvcGVyYXRpb25zIGl0c2VsZiBidXQgZW5zdXJlcyB0aGF0IGFuIGluc3RhbmNlIG9mIEVkaXRhYmxlTmF2aWdhdGlvblxuICAgICAqIGlzIGNyZWF0ZWQgYW5kIHJlYWR5IHRvIGxpc3RlbiB0byBrZXlib2FyZCBldmVudHMuIFRoaXMgaXMgY3J1Y2lhbCBmb3Igc2V0dGluZyB1cCB0aGUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogdGhhdCBtYW5hZ2UgbmF2aWdhdGlvbiB3aXRoaW4gZWRpdGFibGUgY29udGVudCBhcmVhcywgYXMgaXQgdHJpZ2dlcnMgdGhlIG5lY2Vzc2FyeSBiaW5kaW5ncyB1cG9uIGluc3RhbnRpYXRpb24uXG4gICAgICovXG4gICAgbGlzdGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkVkaXRhYmxlTmF2aWdhdGlvbiBpcyBub3cgbGlzdGVuaW5nIGZvciBrZXkgZXZlbnRzLlwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWRpdGFibGVOYXZpZ2F0aW9uIGNsYXNzLlxuICAgICAqIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCwgaXQgY3JlYXRlcyBhIG5ldyBvbmUuXG4gICAgICogQHJldHVybnMge0VkaXRhYmxlTmF2aWdhdGlvbn0gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWRpdGFibGVOYXZpZ2F0aW9uIGNsYXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogRWRpdGFibGVOYXZpZ2F0aW9uIHtcblxuICAgICAgICBpZiAoIUVkaXRhYmxlTmF2aWdhdGlvbi5pbnN0YW5jZSkge1xuXG4gICAgICAgICAgICBjb25zdCBxdWlja01lbnUgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVF1aWNrTWVudT4oXCJJUXVpY2tNZW51XCIpO1xuXG4gICAgICAgICAgICBFZGl0YWJsZU5hdmlnYXRpb24uaW5zdGFuY2UgPSBuZXcgRWRpdGFibGVOYXZpZ2F0aW9uKHF1aWNrTWVudSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVkaXRhYmxlTmF2aWdhdGlvbi5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUFycm93S2V5cyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuXG4gICAgICAgIGlmICghdGhpcy5xdWlja01lbnUuaXNWaXNpYmxlICYmIGV2ZW50LmtleS5zdGFydHNXaXRoKCdBcnJvdycpICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudEVkaXRhYmxlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFZGl0YWJsZSAmJiBjdXJyZW50RWRpdGFibGUuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRTd2l0Y2hFZGl0YWJsZShjdXJyZW50RWRpdGFibGUsIGV2ZW50LmtleSBhcyBEaXJlY3Rpb25zKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFZGl0YWJsZSA9IHRoaXMuZmluZE5leHRFZGl0YWJsZShjdXJyZW50RWRpdGFibGUsIGV2ZW50LmtleSBhcyBEaXJlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRFZGl0YWJsZSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd1VwIHx8IGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93RG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VDYXJldEluU2ltaWxhclBvc2l0aW9uKGN1cnJlbnRFZGl0YWJsZSwgbmV4dEVkaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93TGVmdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChuZXh0RWRpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KG5leHRFZGl0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBEZXRlcm1pbmVzIGlmIG5hdmlnYXRpb24gc2hvdWxkIHN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGVkaXRhYmxlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGFycm93IGRpcmVjdGlvbiBhbmQgY2FyZXQgcG9zaXRpb24uXG4gICAgKiBJdCBjaGVja3MgaWYgdGhlIGNhcmV0IGlzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGV2YWx1YXRlcyBib3VuZGFyeSBjb25kaXRpb25zIGZvciB2ZXJ0aWNhbCBuYXZpZ2F0aW9uLlxuICAgICogXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGN1cnJlbnQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgYmVpbmcgZXZhbHVhdGVkLlxuICAgICogQHBhcmFtIHtEaXJlY3Rpb25zfSBkaXJlY3Rpb24gLSBUaGUgbmF2aWdhdGlvbiBkaXJlY3Rpb24gaW5kaWNhdGVkIGJ5IHRoZSBhcnJvdyBrZXkgcHJlc3MuXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBuYXZpZ2F0aW9uIHNob3VsZCBtb3ZlIHRvIGFub3RoZXIgZWxlbWVudCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICovXG4gICAgcHJpdmF0ZSBzaG91bGRTd2l0Y2hFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogYm9vbGVhbiB7XG5cbiAgICAgICAgLy8gRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICAvLyBJZiBoYXMgc2VsZWN0aW9uIGlnbm9yZSBuYXZpZ2F0aW9uIFxuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZW5kT2Zmc2V0ICE9IHJhbmdlLnN0YXJ0T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgYXRTdGFydCwgYXRFbmQgfSA9IERPTVV0aWxzLmdldFNlbGVjdGlvblRleHRJbmZvKGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNBdEZpcnN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkZpcnN0KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRMYXN0TGluZSA9IHRoaXMuaXNBdExpbmVCb3VuZGFyeShlbGVtZW50LCBCb3VuZGFyaWVzLkxhc3QpO1xuXG4gICAgICAgICAgICBpZiAoKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQgJiYgYXRTdGFydCkgfHwgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0ICYmIGF0RW5kKSB8fFxuICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCAmJiAoYXRTdGFydCB8fCBpc0F0Rmlyc3RMaW5lKSkgfHxcbiAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93RG93biAmJiAoYXRFbmQgfHwgaXNBdExhc3RMaW5lKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBdExpbmVCb3VuZGFyeShlbGVtZW50OiBIVE1MRWxlbWVudCwgYm91bmRhcnk6IEJvdW5kYXJpZXMpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBoYXNUZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gXCJcIjtcblxuICAgICAgICBpZiAoIWhhc1RleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKVswXTtcblxuICAgICAgICBpZiAoIXJlY3QpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gMTE7XG5cbiAgICAgICAgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkZpcnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocmVjdC50b3AgLSBlbGVtZW50UmVjdC50b3ApIDwgdG9sZXJhbmNlO1xuICAgICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5ID09PSBCb3VuZGFyaWVzLkxhc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhyZWN0LmJvdHRvbSAtIGVsZW1lbnRSZWN0LmJvdHRvbSkgPCB0b2xlcmFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBMb2NhdGVzIHRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlvbiBkaXJlY3Rpb24uXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGludG8gYWNjb3VudCBib3RoIGhvcml6b250YWwgKGxlZnQvcmlnaHQpIGFuZCB2ZXJ0aWNhbCAodXAvZG93bikgZGlyZWN0aW9ucyBhbmQgaGFuZGxlcyB0YWJsZSBjZWxsIGJvdW5kYXJpZXMuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudCBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiB0aGUgYXJyb3cga2V5IG5hdmlnYXRpb24uXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiB0aGUgZGVzaXJlZCBkaXJlY3Rpb24gb3IgbnVsbCBpZiBubyBzdWl0YWJsZSBlbGVtZW50IGlzIGZvdW5kLlxuICAgICovXG4gICAgcHJpdmF0ZSBmaW5kTmV4dEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBhbGxFZGl0YWJsZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuXG4gICAgICAgIC8vIFRoZSB0YWJsZSBuYXZpZ2F0aW9uIGJlaGF2aW9yIGlzIGEgbGl0dGxlIGRpZmZlcmVudFxuICAgICAgICBpZiAoY3VycmVudC5jbG9zZXN0KFwidGRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY3VycmVudC5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICAgICAgICBjb25zdCBjZWxsID0gY3VycmVudC5jbG9zZXN0KFwidGRcIik7XG4gICAgICAgICAgICBpZiAodGFibGUgJiYgY2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5laWdoYm9yQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0TmVpZ2hib3JDZWxsKHRhYmxlLCBjZWxsLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGlmIChuZWlnaGJvckNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5laWdoYm9yQ2VsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV4dEluZGV4ID0gLTE7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dMZWZ0IHx8IGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1JpZ2h0KSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dMZWZ0ID8gY3VycmVudEluZGV4IC0gMSA6IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0SW5kZXggPSB0aGlzLmZpbmRWZXJ0aWNhbEVkaXRhYmxlSW5kZXgoY3VycmVudCwgYWxsRWRpdGFibGVzLCBkaXJlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IDAgfHwgbmV4dEluZGV4ID49IGFsbEVkaXRhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFsbEVkaXRhYmxlc1tuZXh0SW5kZXhdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBGaW5kcyB0aGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiBhIHZlcnRpY2FsIGRpcmVjdGlvbiAodXAgb3IgZG93bikgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAgICAqIEl0IGNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgZWRpdGFibGUgZWxlbWVudCBiYXNlZCBvbiB2ZXJ0aWNhbCBkaXN0YW5jZSBhbmQgbWluaW1hbCBob3Jpem9udGFsIHNoaWZ0LCBmYXZvcmluZyBlbGVtZW50cyBkaXJlY3RseSBhYm92ZSBvciBiZWxvdy5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY3VycmVudCAtIFRoZSBjdXJyZW50bHkgZm9jdXNlZCBjb250ZW50ZWRpdGFibGUgZWxlbWVudC5cbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gYWxsRWRpdGFibGVzIC0gQW4gYXJyYXkgb2YgYWxsIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50cy5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBvZiBuYXZpZ2F0aW9uLCBlaXRoZXIgdXAgb3IgZG93bi5cbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCB2ZXJ0aWNhbCBlZGl0YWJsZSBlbGVtZW50IG9yIHRoZSBjdXJyZW50IGluZGV4IGlmIG5vbmUgYXJlIGNsb3Nlci5cbiAgICAqL1xuICAgIC8vIHByaXZhdGUgZmluZFZlcnRpY2FsRWRpdGFibGUoY3VycmVudDogSFRNTEVsZW1lbnQsIGFsbEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogbnVtYmVyIHtcbiAgICAvLyAgICAgY29uc3QgY3VycmVudEluZGV4ID0gYWxsRWRpdGFibGVzLmluZGV4T2YoY3VycmVudCk7XG4gICAgLy8gICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgbGV0IGNsb3Nlc3RJbmRleCA9IC0xO1xuICAgIC8vICAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAvLyAgICAgYWxsRWRpdGFibGVzLmZvckVhY2goKGVkaXRhYmxlLCBpbmRleCkgPT4ge1xuICAgIC8vICAgICAgICAgaWYgKGVkaXRhYmxlICE9PSBjdXJyZW50KSB7XG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVkaXRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsRGlzdGFuY2UgPSBkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCA/IGN1cnJlbnRSZWN0LnRvcCAtIHJlY3QuYm90dG9tIDogcmVjdC50b3AgLSBjdXJyZW50UmVjdC5ib3R0b207XG4gICAgLy8gICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbERpc3RhbmNlID0gTWF0aC5hYnMoY3VycmVudFJlY3QubGVmdCAtIHJlY3QubGVmdCk7XG5cbiAgICAvLyAgICAgICAgICAgICBpZiAodmVydGljYWxEaXN0YW5jZSA+IDAgJiYgKHZlcnRpY2FsRGlzdGFuY2UgKyBob3Jpem9udGFsRGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IHZlcnRpY2FsRGlzdGFuY2UgKyBob3Jpem9udGFsRGlzdGFuY2U7XG4gICAgLy8gICAgICAgICAgICAgICAgIGNsb3Nlc3RJbmRleCA9IGluZGV4O1xuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfSk7XG5cbiAgICAvLyAgICAgcmV0dXJuIGNsb3Nlc3RJbmRleCA9PT0gLTEgPyBjdXJyZW50SW5kZXggOiBjbG9zZXN0SW5kZXg7XG4gICAgLy8gfVxuICAgIHByaXZhdGUgZmluZFZlcnRpY2FsRWRpdGFibGVJbmRleChjdXJyZW50OiBIVE1MRWxlbWVudCwgYWxsRWRpdGFibGVzOiBIVE1MRWxlbWVudFtdLCBkaXJlY3Rpb246IERpcmVjdGlvbnMpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBhbGxFZGl0YWJsZXMuaW5kZXhPZihjdXJyZW50KTtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleDtcbiAgICBcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd1VwKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgtLTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dEb3duKSB7XG4gICAgICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBpZiAobmV4dEluZGV4ID49IDAgJiYgbmV4dEluZGV4IDwgYWxsRWRpdGFibGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHRJbmRleDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBQbGFjZXMgdGhlIGNhcmV0IGluIGEgcG9zaXRpb24gd2l0aGluIHRoZSBuZXh0IGVsZW1lbnQgdGhhdCBjbG9zZWx5IG1hdGNoZXMgaXRzIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIG1vdmluZyBmb2N1cyBiZXR3ZWVuIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50cyB0byBtYWludGFpbiBhIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlLlxuICAgICogXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjdXJyZW50IC0gVGhlIGN1cnJlbnQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgd2hlcmUgdGhlIGNhcmV0IGlzIGxvY2F0ZWQuXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBuZXh0IC0gVGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGNhcmV0IHdpbGwgbW92ZS5cbiAgICAqL1xuICAgIHByaXZhdGUgcGxhY2VDYXJldEluU2ltaWxhclBvc2l0aW9uKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBuZXh0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBjdXJyZW50UmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblxuICAgICAgICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihuZXh0LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgbGV0IGJlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgICAgIGxldCBiZXN0T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgICAgICAgICAgaWYgKGJlc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUgfHwgIW5vZGUubm9kZVZhbHVlKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKHRlc3RSZWN0LmxlZnQgLSByZWN0LmxlZnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGhvcml6b250YWxEaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9mZnNldCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpO1xuXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYmVzdE5vZGUsIGJlc3RPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhuZXh0KTtcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59IiwiaW1wb3J0ICcuL2Fzc2V0cy9jc3MvbWFpbi5jc3MnO1xyXG5pbXBvcnQgeyBVSUJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXJzL1VJQnVpbGRlcic7XHJcbmltcG9ydCB7IENvbW1hbmREaXNwYXRjaGVyIH0gZnJvbSAnLi9jb21tYW5kcy9Db21tYW5kRGlzcGF0Y2hlcic7XHJcbmltcG9ydCB7IFNob3J0Y3V0TGlzdGVuZXJzIH0gZnJvbSAnLi9jb3JlL1Nob3J0Y3V0TGlzdGVuZXJzJztcclxuaW1wb3J0IHsgVGFibGVMaXN0ZW5lcnMgfSBmcm9tICcuL2NvcmUvbGlzdGVuZXJzL1RhYmxlTGlzdGVuZXJzJztcclxuaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSAnLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51JztcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gJy4vY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyJztcclxuaW1wb3J0IHsgRm9jdXNTdGFjayB9IGZyb20gJy4vY29yZS9Gb2N1c1N0YWNrJztcclxuaW1wb3J0IHsgQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlJztcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlJztcclxuaW1wb3J0IHsgVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvVGV4dE9wZXJhdGlvbnNTZXJ2aWNlJztcclxuaW1wb3J0IHsgVGFibGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZU9wZXJhdGlvbnNTZXJ2aWNlJztcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSAnLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyJztcclxuaW1wb3J0IHsgTWVtZW50byB9IGZyb20gJy4vY29yZS9NZW1lbnRvJztcclxuaW1wb3J0IHsgRWRpdGFibGVOYXZpZ2F0aW9uIH0gZnJvbSAnLi9jb3JlL0VkaXRhYmxlTmF2aWdhdGlvbic7XHJcbmltcG9ydCB7IEJsb2NrVG9vbGJveCB9IGZyb20gJy4vY29tcG9uZW50cy9ibG9jay10b29sYm94L0Jsb2NrVG9vbGJveCc7XHJcblxyXG4vKipcclxuICogVGhpcyBzY3JpcHQgaW5pdGlhbGl6ZXMgdGhlIGVkaXRvciBhbmQgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMgb25jZSB0aGUgRE9NIGNvbnRlbnQgaGFzIGZ1bGx5IGxvYWRlZC5cclxuICogSXQgaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB1c2VyIGludGVyZmFjZSBhbmQgc3RhcnRpbmcgdGhlIGV2ZW50IGxpc3RlbmluZyBwcm9jZXNzIHRvIGhhbmRsZSBjb21tYW5kcy5cclxuICpcclxuICogVGhlIGBET01Db250ZW50TG9hZGVkYCBldmVudCBlbnN1cmVzIHRoYXQgYWxsIHRoZSBET00gY29udGVudCBoYXMgYmVlbiBmdWxseSBwYXJzZWQgYW5kIGxvYWRlZCBiZWZvcmUgdGhlIGluaXRpYWxpemF0aW9uIGJlZ2lucy5cclxuICogYFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7YCBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhbmQgYWN0aXZhdGUgdGhlIHVzZXIgaW50ZXJmYWNlLlxyXG4gKiBgQ29tbWFuZERpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5saXN0ZW4oKTtgIHJldHJpZXZlcyBhbiBpbnN0YW5jZSBvZiB0aGUgQ29tbWFuZERpc3BhdGNoZXIgYW5kIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIGV2ZW50cy5cclxuICovXHJcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklNZW1lbnRvXCIsICgpID0+IE1lbWVudG8uZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVNob3J0Y3V0TGlzdGVuZXJzXCIsICgpID0+IFNob3J0Y3V0TGlzdGVuZXJzLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklUYWJsZUxpc3RlbmVyc1wiLCAoKSA9PiBUYWJsZUxpc3RlbmVycy5nZXRJbnN0YW5jZSgpKTtcclxuXHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUZvY3VzU3RhY2tcIiwgKCkgPT4gRm9jdXNTdGFjay5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIsICgpID0+IEVsZW1lbnRGYWN0b3J5U2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIsICgpID0+IFRleHRPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGFibGVPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIsICgpID0+IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgLy9Vc2VySW50ZXJmYWNlXHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVF1aWNrTWVudVwiLCAoKSA9PiBRdWlja01lbnUuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhclwiLCAoKSA9PiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUVkaXRhYmxlTmF2aWdhdGlvblwiLCAoKSA9PiBFZGl0YWJsZU5hdmlnYXRpb24uZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgVUlCdWlsZGVyLmJ1aWxkKCkuc3RhcnQoKTtcclxuXHJcbiAgICBDb21tYW5kRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLmxpc3RlbigpO1xyXG4gICAgRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkubGlzdGVuKCk7XHJcbiAgICBCbG9ja1Rvb2xib3guZ2V0SW5zdGFuY2UoKS5saXN0ZW4oKTtcclxuXHJcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIlRleHRFZGl0b3JMb2FkZWRcIikpO1xyXG5cclxufSk7Il0sIm5hbWVzIjpbIl9fX0NTU19MT0FERVJfRVhQT1JUX19fIiwicHVzaCIsIm1vZHVsZSIsImlkIiwiZXhwb3J0cyIsImNzc1dpdGhNYXBwaW5nVG9TdHJpbmciLCJsaXN0IiwidG9TdHJpbmciLCJ0aGlzIiwibWFwIiwiaXRlbSIsImNvbnRlbnQiLCJuZWVkTGF5ZXIiLCJjb25jYXQiLCJsZW5ndGgiLCJqb2luIiwiaSIsIm1vZHVsZXMiLCJtZWRpYSIsImRlZHVwZSIsInN1cHBvcnRzIiwibGF5ZXIiLCJ1bmRlZmluZWQiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwiayIsIl9rIiwiY3NzTWFwcGluZyIsImJ0b2EiLCJiYXNlNjQiLCJ1bmVzY2FwZSIsImVuY29kZVVSSUNvbXBvbmVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJkYXRhIiwic291cmNlTWFwcGluZyIsInN0eWxlc0luRE9NIiwiZ2V0SW5kZXhCeUlkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwicmVzdWx0IiwibW9kdWxlc1RvRG9tIiwib3B0aW9ucyIsImlkQ291bnRNYXAiLCJpZGVudGlmaWVycyIsImJhc2UiLCJjb3VudCIsImluZGV4QnlJZGVudGlmaWVyIiwib2JqIiwiY3NzIiwic291cmNlTWFwIiwicmVmZXJlbmNlcyIsInVwZGF0ZXIiLCJhZGRFbGVtZW50U3R5bGUiLCJieUluZGV4Iiwic3BsaWNlIiwiYXBpIiwiZG9tQVBJIiwidXBkYXRlIiwibmV3T2JqIiwicmVtb3ZlIiwibGFzdElkZW50aWZpZXJzIiwibmV3TGlzdCIsImluZGV4IiwibmV3TGFzdElkZW50aWZpZXJzIiwiX2kiLCJfaW5kZXgiLCJtZW1vIiwiaW5zZXJ0Iiwic3R5bGUiLCJ0YXJnZXQiLCJzdHlsZVRhcmdldCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsIndpbmRvdyIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudERvY3VtZW50IiwiaGVhZCIsImUiLCJnZXRUYXJnZXQiLCJFcnJvciIsImFwcGVuZENoaWxkIiwiZWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsInN0eWxlRWxlbWVudCIsIm5vbmNlIiwic2V0QXR0cmlidXRlIiwiaW5zZXJ0U3R5bGVFbGVtZW50Iiwic3R5bGVUYWdUcmFuc2Zvcm0iLCJhcHBseSIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsInJlbW92ZVN0eWxlRWxlbWVudCIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwiZmlyc3RDaGlsZCIsImNyZWF0ZVRleHROb2RlIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm4iLCJnZXR0ZXIiLCJfX2VzTW9kdWxlIiwiZCIsImEiLCJkZWZpbml0aW9uIiwia2V5IiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJuYyIsIkNvbnRlbnRUeXBlcyIsIkljb25zIiwiVG9vbGJveE9wdGlvbnMiLCJDb21tb25DbGFzc2VzIiwiQ3VzdG9tVUlFdmVudHMiLCJEZWZhdWx0SlNFdmVudHMiLCJDdXN0b21FdmVudHMiLCJaSW5kZXgiLCJDb2xvcnMiLCJDb2xvcnNOYW1lcyIsIkNvbW1hbmRzIiwiQnV0dG9uSURzIiwiS2V5Ym9hcmRLZXlzIiwiRHJvcGRvd25JdGVtSURzIiwiRE9NRWxlbWVudHMiLCJEcm9wZG93bkxpc3RJRHMiLCJEcm9wZG93bk1lbnVJRHMiLCJsb2NhbHMiLCJVdGlscyIsImdlbmVyYXRlVW5pcXVlSWQiLCJ0aW1lUGFydCIsIkRhdGUiLCJub3ciLCJyYW5kb21BcnJheSIsIlVpbnQzMkFycmF5IiwiY3J5cHRvIiwiZ2V0UmFuZG9tVmFsdWVzIiwicmdiVG9IZXgiLCJyZ2IiLCJtYXRjaCIsIk51bWJlciIsIngiLCJoZXgiLCJpc1ZhbGlkVXJsIiwidXJsIiwicGF0dGVybiIsIlJlZ0V4cCIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ0ZXN0IiwiRWxlbWVudEZhY3RvcnlTZXJ2aWNlIiwiY3JlYXRvcnMiLCJzdGF0aWMiLCJCTE9DS19QQVJBR1JBUEgiLCJQQVJBR1JBUEgiLCJDSEVDS0JPWF9JVEVNIiwiTElTVF9JVEVNIiwiQ09ERSIsIlFVT1RFIiwiQlVMTEVURURfTElTVCIsIk5VTUJFUkVEX0xJU1QiLCJDSEVDS19MSVNUIiwiSEVBREVSXzEiLCJIRUFERVJfMiIsIkhFQURFUl8zIiwiSEVBREVSXzQiLCJIRUFERVJfNSIsIkhFQURFUl82IiwiRFJBR19IQU5ETEVfQlVUVE9OIiwiVEFCTEUiLCJJTUFHRSIsIlZJREVPIiwiU1BPVElGWSIsIkdJVEhVQl9HSVNUIiwiR0lUTEFCX1NOSVBQRVQiLCJDT0RFUEVOIiwiQ0FMTE9VVCIsIlNFUEFSQVRPUiIsIl9pbnN0YW5jZSIsInJlZ2lzdGVyIiwiRUxFTUVOVF9UWVBFUyIsImJsb2NrUGFyYWdyYXBoQ3JlYXRvciIsInBhcmFncmFwaENyZWF0b3IiLCJjaGVja2JveEl0ZW1DcmVhdG9yIiwibGlzdEl0ZW1DcmVhdG9yIiwiY29kZUNyZWF0b3IiLCJxdW90ZUNyZWF0b3IiLCJjaGVja0xpc3RDcmVhdG9yIiwiYnVsbGV0ZWRMaXN0Q3JlYXRvciIsIm51bWJlcmVkTGlzdENyZWF0b3IiLCJoZWFkaW5nQ3JlYXRvciIsImRyYWdIYW5kbGVCdXR0b25DcmVhdG9yIiwidGFibGVDcmVhdG9yIiwicGxhY2Vob2xkZXJDcmVhdG9yIiwiSW1hZ2UiLCJJbWFnZTIiLCJTaG93TWVkaWFJbnB1dFVwbG9hZCIsIlNob3dNZWRpYUlucHV0RW1iZWQiLCJJZnJhbWUiLCJZb3VUdWJlIiwiU3BvdGlmeSIsIkdpdEh1YiIsIkNvZGVQZW4iLCJjYWxsb3V0Q3JlYXRvciIsInNlcGFyYXRvckNyZWF0b3IiLCJnZXRJbnN0YW5jZSIsInR5cGUiLCJjcmVhdG9yIiwiY3JlYXRlIiwiVHlwZUVycm9yIiwiYmxvY2tQYXJhZ3JhcGgiLCJwYXJhZ3JhcGgiLCJsZXZlbCIsImhlYWRpbmciLCJjaGVja2JveEl0ZW0iLCJsaXN0SXRlbV8yIiwiZHJhZ0hhbmRsZUJ1dHRvbiIsImNvbnRhaW5lciIsImNsYXNzTGlzdCIsImFkZCIsImNvZGVCbG9jayIsInByZSIsIkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcyIsIkxhbmd1YWdlU2VsZWN0aW9uVG9vbENsYXNzIiwiRXh0cmFPcHRpb25zQ2xhc3MiLCJjb2RlIiwiY29udGVudEVkaXRhYmxlIiwidGV4dENvbnRlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlQXR0cmlidXRlIiwiaGxqcyIsImhpZ2hsaWdodEVsZW1lbnQiLCJjb250ZW50RWxlbWVudCIsImJsb2NrcXVvdGUiLCJnZXRSYW5kb21RdW90ZSIsInF1b3RhdGlvbnMiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJ1bCIsIkNoZWNrTGlzdCIsImluaXRpYWxJdGVtIiwiQnVsbGV0ZWRMaXN0IiwiTnVtYmVyZWRMaXN0IiwidGFibGVTaGVsbCIsInRhYmxlQ29udHJvbGxlciIsInRhYmxlV3JhcHBlciIsInRhYmxlIiwiQWxpZ25Ub29sQ2xhc3MiLCJUYWJsZSIsInRib2R5Iiwicm93RGF0YSIsInNwbGl0Iiwicm93IiwiZm9yRWFjaCIsImNlbGxDb250ZW50IiwiY2VsbCIsImFkZFJvdyIsImlubmVySFRNTCIsImFkZENvbHVtbiIsImNvbnRlbnRUeXBlIiwiaWNvbiIsInRleHQiLCJjbGFzc2VzIiwiQ29udGVudEVsZW1lbnQiLCJwbGFjZWhvbGRlciIsIlNob3dNZWRpYUlucHV0T25DbGljayIsInBsYWNlaG9sZGVySWNvbiIsImNyZWF0ZUljb24iLCJwbGFjZWhvbGRlclRleHQiLCJpbm5lclRleHQiLCJqb2hhbm5lc0NhbGxvdXQiLCJDb2xvclRvb2xDbGFzcyIsImNhbGxvdXRXcmFwcGVyIiwidGV4dEFyZWEiLCJ3cmFwcGVyIiwic2VwYXJhdG9yIiwicCIsIlBhcmFncmFwaCIsImgiLCJjaGVja2JveCIsInNwYW4iLCJkaXYiLCJuZXdEaXYiLCJuZXdFbGVtZW50IiwiZHJhZ0hhbmRsZXJXcmFwcGVyIiwiRWRpdG9yT25seSIsImJ1dHRvbiIsImRyYWdnYWJsZSIsImljb25JZCIsIkJhc2VVSUNvbXBvbmVudCIsIl9jYW5IaWRlIiwicHJvcHMiLCJodG1sRWxlbWVudCIsInBhcmVudCIsImNvbnN0cnVjdG9yIiwiaW5pdCIsImRpc3BsYXkiLCJzZXRJZCIsImFkZENzc0NsYXNzIiwidG9rZW5zIiwiYXBwZW5kVG8iLCJpc1Zpc2libGUiLCJ2aXNpYmlsaXR5IiwiY29udGFpbnMiLCJnZXRDb21wdXRlZFN0eWxlIiwicGFyZW50RWxlbWVudCIsInNob3ciLCJoaWRlIiwibG9ja0hpZGUiLCJ1bmxvY2tIaWRlIiwiY2FuSGlkZSIsInZhbHVlIiwiZm9jdXMiLCJjaGFuZ2VDb2xvciIsImNvbG9yIiwicmVtb3ZlQ29sb3IiLCJjaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlIiwiY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuIiwiZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbiIsIm9yaWdpbmFsRGlzcGxheSIsIm9yaWdpbmFsVmlzaWJpbGl0eSIsIm9yaWdpbmFsUG9zaXRpb24iLCJwb3NpdGlvbiIsImVsZW1lbnRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic2NyZWVuV2lkdGgiLCJpbm5lcldpZHRoIiwicmlnaHQiLCJsZWZ0IiwiZW5zdXJlVmlzaWJsZSIsImNsb3Nlc3QiLCJzY3JvbGxJbnRvVmlldyIsImJlaGF2aW9yIiwiYmxvY2siLCJpbmxpbmUiLCJjb25zb2xlIiwid2FybiIsImhhbmRsZUNsb3NlRWxlbWVudEV2ZW50IiwiZXZlbnQiLCJkZXRhaWxzIiwiZGV0YWlsIiwidGFyZ2V0SWQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJoYW5kbGVTaG93RWxlbWVudEV2ZW50IiwiYXR0YWNoVUlFdmVudCIsIkNsb3NlRWxlbWVudCIsImJpbmQiLCJTaG93RWxlbWVudCIsIkRlcGVuZGVuY3lDb250YWluZXIiLCJkZXBlbmRlbmNpZXMiLCJJbnN0YW5jZSIsImluc3RhbmNlIiwicmVzb2x2ZSIsIkRPTVV0aWxzIiwiaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJhbmdlQ291bnQiLCJub2RlIiwiYW5jaG9yTm9kZSIsIm5vZGVUeXBlIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsInRhZ05hbWUiLCJnZXRTZWxlY3Rpb25UZXh0SW5mbyIsImVsIiwic2VsUmFuZ2UiLCJ0ZXN0UmFuZ2UiLCJhdFN0YXJ0IiwiYXRFbmQiLCJzZWwiLCJnZXRSYW5nZUF0IiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJzZXRFbmQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0Iiwic2V0U3RhcnQiLCJlbmRDb250YWluZXIiLCJlbmRPZmZzZXQiLCJpbnNlcnRBZnRlciIsIm5ld05vZGUiLCJyZWZlcmVuY2VOb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJoYXNUZXh0Q29udGVudCIsInRyaW0iLCJoYXNDaGlsZE5vZGVzIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGROb2RlcyIsInNvbWUiLCJjaGlsZE5vZGUiLCJjbG9uZUFuZEluc2VydEFmdGVyIiwiY2xvbmVkRWxlbWVudCIsImNsb25lTm9kZSIsInByZWZpeCIsImZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzIiwiY2xhc3NOYW1lIiwiYWN0aXZlRWxlbWVudCIsImN1cnJlbnRFbGVtZW50IiwiZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyIsImNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIiwiVEVYVF9OT0RFIiwicmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQiLCJjdXJyZW50Tm9kZSIsImN1cnNvclBvc2l0aW9uIiwiZ2V0Q3Vyc29yUG9zaXRpb24iLCJyYW5nZXMxIiwic3BsaXRDb250ZW50QXRDdXJzb3JTZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsImRlbGV0ZUZyb21Eb2N1bWVudCIsInNldEN1cnNvclBvc2l0aW9uIiwicmFuZ2VzMiIsInJhbmdlIiwiaW50ZXJzZWN0c05vZGUiLCJ0cmVlV2Fsa2VyIiwiY3JlYXRlVHJlZVdhbGtlciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJhY2NlcHROb2RlIiwiRklMVEVSX0FDQ0VQVCIsImNoYXJDb3VudCIsIm5leHROb2RlIiwiY3VycmVudFBvcyIsInRleHRMZW5ndGgiLCJjb2xsYXBzZSIsImdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQiLCJnZXRDdXJyZW50QWN0aXZlQmxvY2siLCJnZXRBdHRyaWJ1dGUiLCJyb290Tm9kZSIsInJhbmdlcyIsInJhbmdlQmVmb3JlIiwicmFuZ2VBZnRlciIsImxhc3RDaGlsZCIsInNldEVuZEFmdGVyIiwicGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQiLCJlZGl0YWJsZUVsZW1lbnQiLCJzZXRUaW1lb3V0IiwiaXNDb250ZW50RWRpdGFibGUiLCJwbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQiLCJjb250ZW50QmxvY2siLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJsYXN0Tm9kZSIsImlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mIiwicGFyZW50U2VsZWN0b3IiLCJyZW1vdmVGaWx0ZXJUZXh0IiwibGFzdFNsYXNoUG9zaXRpb24iLCJvZmZzZXQiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImRlbGV0ZUNvbnRlbnRzIiwiZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5RGF0YUNvbnRlbnRUeXBlIiwiZGF0YUNvbnRlbnRUeXBlIiwiY2xpY2tlZEVsZW1lbnQiLCJkYXRhc2V0IiwiZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5SWQiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlDbGFzcyIsImNsYXNzS2V5IiwiaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZiIsInNlbGVjdG9yIiwiRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsIm1hdGNoZXMiLCJnZXRQYXJlbnRUYXJnZXRCeVNlbGVjdG9yIiwiZ2V0UGFyZW50RnJvbVNlbGVjdGlvbiIsInJlbW92ZUNsYXNzZXNXaXRoUHJlZml4IiwiZmlsdGVyIiwiY2xzIiwic3RhcnRzV2l0aCIsImlzVGFyZ2V0RGVzY2VuZGFudE9mU2VsZWN0b3IiLCJIVE1MRWxlbWVudCIsIlRleHQiLCJxdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZiIsInNhbml0aXplQ29udGVudEVkaXRhYmxlIiwic2hvdWxkUmVzdG9yZUNhcmV0IiwiY2FyZXRQb3MiLCJlbmRzV2l0aCIsIm5vZGVOYW1lIiwiUmFuZ2UiLCJ0ZXh0Tm9kZXMiLCJnZXRUZXh0Tm9kZXNJbiIsInRleHROb2RlIiwibm9kZUxlbmd0aCIsImNoaWxkcmVuIiwiZ2V0UHJldmlvdXNDb250ZW50RWRpdGFibGUiLCJhbGxDb250ZW50RWRpdGFibGVzIiwicXVlcnlTZWxlY3RvckFsbCIsImluZGV4T2YiLCJnZXROZXh0Q29udGVudEVkaXRhYmxlIiwiZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlIiwiZmluZENvbnRlbnRFZGl0YWJsZUluRGVzY2VuZGFudHMiLCJjaGlsZCIsInNhdmVDYXJldFBvc2l0aW9uMmQiLCJyZWN0IiwiY2hhckluZGV4Iiwic2xpY2UiLCJhbmNob3JPZmZzZXQiLCJob3Jpem9udGFsUG9zIiwicmVzdG9yZUNhcmV0UG9zaXRpb24yZCIsIndhbGtlciIsImJlc3ROb2RlIiwiYmVzdE9mZnNldCIsImJlc3REaXN0YW5jZSIsIkluZmluaXR5Iiwibm9kZVZhbHVlIiwidGVzdFJlY3QiLCJob3Jpem9udGFsRGlzdGFuY2UiLCJhYnMiLCJzYXZlQ2FyZXRQb3NpdGlvbjNkIiwidmVydGljYWxQb3MiLCJ0b3AiLCJyZXN0b3JlQ2FyZXRQb3NpdGlvbjNkIiwidmVydGljYWxEaXN0YW5jZSIsInRvdGFsRGlzdGFuY2UiLCJzcXJ0IiwibWVyZ2VJbmxpbmVFbGVtZW50cyIsIm5vcm1hbGl6ZSIsImNoaWxkRWxlbWVudCIsIkZsb2F0aW5nVG9vbGJhciIsImRyb3Bkb3ducyIsInNlcGFyYXRvcnMiLCJjdXJyZW50U2VsZWN0aW9uUmFuZ2UiLCJodG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Iiwic3VwZXIiLCJ6SW5kZXgiLCJTbGlnaHRseUltcG9ydGFudCIsInNlbGVjdFdyYXBwZXIiLCJhbnlEcm9wZG93blZpc2libGUiLCJoaWRlQWxsRHJvcGRvd25WaXNpYmxlIiwiYXBwZW5kRHJvcGRvd24iLCJkcm9wZG93biIsImFwcGVuZEJ1dHRvbkdyb3VwIiwiYnV0dG9uR3JvdXAiLCJhcHBlbmRTZXBhcmF0b3IiLCJhcHBlbmRUZXh0VG9vbGJhciIsImRyb3Bkb3duTGlzdCIsImF0dGFjaEV2ZW50cyIsIkNsaWNrIiwicHJldmVudERlZmF1bHQiLCJNb3VzZWRvd24iLCJyZXN0b3JlUmFuZ2VTZWxlY3Rpb24iLCJibG9ja0RlbGV0ZWQiLCJibG9ja1R5cGVDaGFuZ2VkIiwiaXNTZWxlY3Rpb25FbXB0eSIsIkNoYW5nZUNvbG9yIiwiU2hvd0hpZGVBY3RpdmVCdXR0b24iLCJpbnRlbnRpb24iLCJSZXNldEFjdGl2ZUJ1dHRvbnMiLCJDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSIsImxhbmd1YWdlIiwiYmxvY2tJZCIsIkV2ZW50RW1pdHRlciIsImVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudCIsInRhcmdldENsYXNzIiwiY3VzdG9tRXZlbnQiLCJDdXN0b21FdmVudCIsImFjdGlvbiIsImRpc3BhdGNoRXZlbnQiLCJlbWl0U2hvd0VsZW1lbnRFdmVudCIsImVtaXRDbG9zZUVsZW1lbnRFdmVudCIsImVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50IiwiQ29sb3JDaGFuZ2VSZXF1ZXN0IiwiZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50IiwiaW50ZW5zaW9uIiwiSGlsaXRlQ29sb3JOb25lIiwiRm9yZUNvbG9ySW5pdGlhbCIsIkJhY2tncm91bmRDb2xvck5vbmUiLCJlbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50IiwiZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCIsInNjb3BlIiwiZW1pdHRlZENvbW1hbmQiLCJjb21tYW5kIiwiY2hhbmdlVGFibGVCb3JkZXJDb2xvciIsIlRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwidGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwiaW5pdGlhbFJlY3QiLCJsb2NrZWRIaWRlIiwiZGVib3VuY2VUaW1lciIsIlZlcnlJbXBvcnRhbnQiLCJwcm9jZXNzU2VsZWN0aW9uQ2hhbmdlRWZmZWN0cyIsImlzTGluayIsInF1ZXJ5Q29tbWFuZFN0YXRlIiwiaXNCb2xkIiwiaXNJdGFsaWMiLCJpc1VuZGVybGluZSIsImlzSW5saW5lQ29kZSIsImlzU3RyaWtlVGhyb3VnaCIsImhpbGl0ZUNvbG9ycyIsIkhpbGl0ZUNvbG9yUmVkIiwicXVlcnlIaWxpdGVDb2xvciIsIkhpbGl0ZUNvbG9yR3JlZW4iLCJIaWxpdGVDb2xvckJsdWUiLCJIaWxpdGVDb2xvclllbGxvdyIsIkhpbGl0ZUNvbG9yR3JleSIsImZvcmVDb2xvcnMiLCJGb3JlQ29sb3JSZWQiLCJxdWVyeUZvcmVDb2xvciIsIkZvcmVDb2xvckdyZWVuIiwiRm9yZUNvbG9yQmx1ZSIsIkZvcmVDb2xvclllbGxvdyIsIkZvcmVDb2xvckdyZXkiLCJlbnRyaWVzIiwiYWN0aXZlIiwiTGluayIsIkJvbGQiLCJJdGFsaWMiLCJJbmxpbmVDb2RlIiwiVW5kZXJsaW5lIiwiU3RyaWtldGhyb3VnaCIsIkljb25BY3RpdmVCbHVlIiwiSWNvbkRlZmF1bHRCbGFjayIsInByb2Nlc3NBZnRlckNoYW5nZSIsImlzQ29sbGFwc2VkIiwiaXNTZWxlY3RpbmciLCJNb3VzZXVwIiwiQmJsQ2xpY2siLCJTZWxlY3Rpb25DaGFuZ2UiLCJLZXlkb3duIiwic2hpZnRLZXkiLCJLZXl1cCIsIlNoaWZ0Iiwic2hvd0hpZGUiLCJjbGVhclRpbWVvdXQiLCJFc2NhcGUiLCJzaG91bGRVcGRhdGVQb3NpdGlvbiIsImN1cnJlbnRSZWN0IiwiaGFzQ29udGVudCIsImhhc1NlbGVjdGlvbiIsImNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbiIsImVycm9yIiwicmVjdHMiLCJnZXRDbGllbnRSZWN0cyIsImZpcnN0UmVjdCIsImNfZmlyc3RSZWN0TGVmdCIsImNfZmlyc3RSZWN0VG9wIiwiY19maXJzdFJlY3RCb3R0b20iLCJib3R0b20iLCJlbGVtZW50V2lkdGgiLCJvZmZzZXRXaWR0aCIsImxlZnRQb3NpdGlvbiIsInNjcm9sbFgiLCJlbGVtZW50SGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0IiwidG9wUG9zaXRpb24iLCJzY3JvbGxZIiwiaGlkZVR1cm5JbnRvRHJvcGRvd25JZkluQ2VsbCIsImlzQ2VsbCIsInVwZGF0ZVBvc2l0aW9uIiwic2V0UG9zaXRpb24iLCJJbnB1dExpbmtCb3giLCJwYXJlbnRXcmFwcGVyIiwic2V0UGFyZW50V3JhcHBlciIsIklucHV0TGlua0JveFdyYXBwZXIiLCJpbnB1dExpbmtCb3giLCJoaWdobGlnaHRzIiwidGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIiLCJhdHRhY2hFdmVudCIsImhlYWRlciIsInNoZWxsIiwiQ29udHJvbCIsImJvZHkiLCJFbnRlciIsImluc2VydExpbmsiLCJjdHJsS2V5IiwiaHJlZiIsIm9wZW4iLCJ1cmxXaXRoUHJvdG9jb2wiLCJsaW5rUmVhZHlUb0luc2VydCIsImlucHV0IiwiYmFja2dyb3VuZENvbG9yIiwicG9zaXRpb25MaW5rQ29tcG9uZW50QmVsb3dTZWxlY3Rpb24iLCJoaWdobGlnaHRTZWxlY3RlZFRleHQiLCJyZW1vdmVIaWdobGlnaHRzIiwiaGlnaGxpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJvcGFjaXR5IiwicG9pbnRlckV2ZW50cyIsIkVkaXRvciIsImVsZW1lbnRGYWN0b3J5U2VydmljZSIsIm1lbWVudG8iLCJ0aXRsZSIsImFkZEJsb2NrIiwidGV4dEZsb2F0aW5nVG9vbGJhciIsInF1aWNrTWVudSIsInRhYmxlQ29udGV4dFRvb2xiYXIiLCJtZWRpYUlucHV0dGVyIiwiaW5wdXRMaW5rQm94V3JhcHBlciIsImJsb2NrT3BlcmF0aW9uc1NlcnZpY2UiLCJmbG9hdGluZ1Rvb2xiYXIiLCJ0YWJsZVRvb2xiYXIiLCJzYXZlU3RhdGUiLCJnZXRFbGVtZW50QnlJZCIsImVkaXRvcklkIiwiY29udGVudFdyYXBwZXIiLCJlZGl0b3JDb25maWciLCJ0YWJsZUZsb2F0aW5nVG9vbGJhciIsImJsb2NrRWxlbWVudCIsImFwcGVuZERyYWdIYW5kbGVyIiwicmVhZHlTdGF0ZSIsImZpcnN0UGFyYWdyYXBoIiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJpbnNlcnRUZXh0QXRDdXJzb3IiLCJhdHRhY2hEcmFnSGFuZGxlciIsImluc2VydE5vZGUiLCJzZXRTdGFydEFmdGVyIiwiZHJhZ0hhbmRsZXIiLCJwcmVwZW5kIiwicmVtb3ZlRHJhZ0hhbmRsZXIiLCJleHRyYWN0Q29udGVudCIsImRyYWdnZWRJdGVtIiwiZHJvcExpbmUiLCJib3VuZGluZyIsInkiLCJjbGllbnRZIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50IiwicHJldmlvdXNFbGVtZW50U2libGluZyIsIkFkZEJsb2NrQnV0dG9uIiwiZXhlY0NvbW1hbmQiLCJjcmVhdGVEZWZhdWx0QmxvY2siLCJBZGRCbG9ja1dyYXBwZXIiLCJTaXplcyIsIlNWR0ljb24iLCJ1c2VFbGVtZW50Iiwic2l6ZSIsImNyZWF0ZUVsZW1lbnROUyIsInVzZSIsInNldEF0dHJpYnV0ZU5TIiwiY2xvbmUiLCJzaXplcyIsInNldFVzZVRvIiwiQWRkQmxvY2tCdWlsZGVyIiwiYnVpbGQiLCJQbHVzIiwibWVkaXVtIiwiRHJvcGRvd25NZW51IiwiZHJvcGRvd25CdXR0b24iLCJwcmVmaXhJZCIsImNsYXNzZXNLZXkiLCJCYXNlRG91Ymx5TGlua2VkTGlzdCIsInRhaWwiLCJnZXRGaXJzdCIsImdldExhc3QiLCJTeW1ib2wiLCJpdGVyYXRvciIsImN1cnJlbnQiLCJjYWxsYmFjayIsImFueSIsInByZWRpY2F0ZSIsImZpbmRGaXJzdCIsImZpbmRMYXN0IiwicHJldmlvdXNOb2RlIiwiZmluZCIsIkpOb2RlIiwicGFyZW50TGlzdCIsInNldE5leHQiLCJzZXRQcmV2aW91cyIsImdldE5leHRTYXRpc2Z5aW5nIiwic3RhcnROb2RlIiwiZ2V0UHJldmlvdXNTYXRpc2Z5aW5nIiwiQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0IiwiYXBwZW5kIiwiRHJvcGRvd25NZW51TGlzdEl0ZW0iLCJhY3RpdmVJY29uIiwibGVmdEljb24iLCJvbkZvY3VzRnVuY3Rpb25MaXN0Iiwib25Mb3NlRm9jdXNGdW5jdGlvbkxpc3QiLCJwYXJlbnREcm9wZG93bk1lbnVMaXN0Iiwic2hvcnRjdXQiLCJhZGRDbGFzcyIsImF0dGFjaE9uRm9jdXMiLCJmdW5jIiwiYXJncyIsImF0dGFjaE9uTG9zZUZvY3VzIiwicmVtb3ZlRm9jdXMiLCJ0YWJJbmRleCIsInRleHRPcHRpb24iLCJzaG9ydEN1dCIsImVtaXRDb21tYW5kRXZlbnQiLCJNb3VzZW1vdmUiLCJhc3luYyIsImRyb3Bkb3duSXRlbXMiLCJzd2l0Y2hWaXN1YWxGb2N1cyIsImhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQiLCJldmVudFZhbHVlcyIsImhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQiLCJoYW5kbGVSZXNldEFjdGl2ZUJ1dHRvbnNFdmVudCIsImV2ZW50Q29sb3IiLCJEcm9wZG93bk1lbnVMaXN0IiwicGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24iLCJjdXJyZW50Rm9jdXNlZE1lbnVJdGVtIiwibWF4SGVpZ2h0Iiwib3ZlcmZsb3dZIiwiRXh0cmVtZWx5SW1wb3J0YW50IiwiZHJvcGRvd25JdGVtIiwic2V0UGFyZW50RHJvcGRvd25NZW51QnV0dG9uIiwiZHJvcGRvd25QYXJlbnRCdXR0b24iLCJjbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZSIsImtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlIiwiZm9jdXNOZXh0VmlzaWJsZUl0ZW0iLCJmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0iLCJoYW5kbGVyS2V5RG93bkV2ZW50IiwiYmxvY2tDbG9uZWQiLCJhbHRLZXkiLCJtZXRhS2V5IiwiQmFja3NwYWNlIiwiYXBwbHlGaWx0ZXIiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsInN2Z0ljb24iLCJuZXh0VmlzaWJsZUl0ZW0iLCJwcmV2aW91c1Zpc2libGVJdGVtIiwiRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yIiwiYm9yZGVyUmlnaHQiLCJtYXJnaW4iLCJCdXR0b25Hcm91cCIsIkJ1dHRvbkdyb3VwSXRlbSIsInNob3dVSSIsInRvZ2dsZUxpbmsiLCJDb2xvckljb24iLCJib3JkZXJSYWRpdXMiLCJib3JkZXIiLCJib3hTaXppbmciLCJEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIiwiY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSIsImdldExlZnRJY29uQmFja2dyb3VuZENvbG9yIiwicmVzZXRBY3RpdmVJY29uIiwiQmxvY2tUb29sYm94QnVpbGRlciIsImFsaWduVG9vbCIsImdyb3VwQnV0dG9uIiwiSnVzdGlmeUxlZnQiLCJKdXN0aWZ5U3RhcnQiLCJsYXJnZSIsIkp1c3RpZnlDZW50ZXIiLCJKdXN0aWZ5UmlnaHQiLCJKdXN0aWZ5RW5kIiwiY29sb3JUb29sIiwiY29sb3JEcm9wZG93bkxpc3QiLCJjb2xvckJ1dHRvbiIsIkRyb3Bkb3duTWVudUJ1dHRvbiIsImNvbG9yRHJvcGRvd24iLCJiYWNrZ3JvdW5kQ29sb3JSZWQiLCJCYWNrZ3JvdW5kT3B0aW9uUmVkIiwiY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciIsIkNhbGxvdXRCYWNrZ3JvdW5kUmVkIiwiYmFja2dyb3VuZENvbG9yR3JlZW4iLCJCYWNrZ3JvdW5kT3B0aW9uR3JlZW4iLCJDYWxsb3V0QmFja2dyb3VuZEdyZWVuIiwiYmFja2dyb3VuZENvbG9yQmx1ZSIsIkJhY2tncm91bmRPcHRpb25CbHVlIiwiQ2FsbG91dEJhY2tncm91bmRCbHVlIiwiYmFja2dyb3VuZENvbG9yWWVsbG93IiwiQmFja2dyb3VuZE9wdGlvblllbGxvdyIsIkNhbGxvdXRCYWNrZ3JvdW5kWWVsbG93IiwiYmFja2dyb3VuZENvbG9yR3JleSIsIkJhY2tncm91bmRPcHRpb25HcmV5IiwiQ2FsbG91dEJhY2tncm91bmRHcmV5IiwiYmFja2dyb3VuZENvbG9yTm9uZSIsIkJhY2tncm91bmRPcHRpb25Ob25lIiwiQ2FsbG91dEJhY2tncm91bmROb25lIiwibGFuZ3VhZ2VTZWxlY3Rpb25Ub29sIiwic2VsZWN0IiwibWVudSIsIkJsb2NrVG9vbGJveCIsImxhbmd1YWdlTWFwIiwic29ydCIsImIiLCJsb2NhbGVDb21wYXJlIiwibmFtZSIsImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlIiwiZXh0cmFPcHRpb25zIiwiZHVwbGljYXRlQmxvY2siLCJEdXBsaWNhdGUiLCJkZWxldGVJdGVtIiwiZGVsZXRlQmxvY2siLCJUcmFzaCIsImxpc3RlbiIsImxvZyIsIk1vdXNlb3ZlciIsImluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlIiwiRm9jdXNpbiIsImhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luIiwiRm9jdXNvdXQiLCJoYW5kbGVUYWJsZUJlaGF2aW9yRm9jdXNPdXQiLCJoYW5kbGVDbGlja0V2ZW50IiwidGFyZ2V0RWxlbWVudCIsInRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlciIsImZvcmNlSGlkZUVsZW1lbnQiLCJvcHRpb25zV3JhcHBlciIsImluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wiLCJpbmNsdWRlQWxpZ25Ub29sIiwiaW5jbHVkZUNvbG9yVG9vbCIsImluY2x1ZGVFeHRyYU9wdGlvbnMiLCJ0b29sYm94V3JhcHBlciIsImNyZWF0ZVRvb2xib3giLCJNb3VzZWVudGVyIiwicmVzZXRUb29sYm94IiwiYmxvY2tUb29sYmFySWQiLCJ0b29sYmFyIiwiaGlkZUJsb2NrVG9vbGJveCIsIk1vdXNlbGVhdmUiLCJpZnJhbWUiLCJjaGFuZ2VUb29sYmFyQ29sb3IiLCJjb2xvckludGVyYWN0aXZlQnV0dG9uIiwiYm9yZGVyQ29sb3IiLCJpc0FueURlcGVuZGVudEJveFZpc2libGUiLCJkZXBlbmRlbnRCb3hlcyIsImJveCIsImJsb2NrVG9vbGJhciIsIm1vcmUiLCJodG1sRWxlbWVudFdyYXBwZXIiLCJpbmNsdWRlQ2hldnJvbkljb24iLCJyb2xlIiwiY2hhbmdlVGl0bGUiLCJUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJmbG9hdGluZ0JhciIsInR1cm5JbnRvRHJvcGRvd24iLCJtb3JlT3B0aW9uc0Ryb3Bkb3duIiwidHVybkludG9CYXJMaXN0IiwidHVybkludG9CYXJCdXR0b24iLCJ0cmFuc2Zvcm1CbG9jayIsIlNWR0ljb25zIiwidG9kb19saXN0IiwiYl9saXN0Iiwibl9saXN0IiwicXVvdGUiLCJoZWFkMiIsImhlYWQzIiwiaGVhZDQiLCJsaW5rIiwiYm9sZCIsInRvZ2dsZUJvbGQiLCJpdGFsaWMiLCJ0b2dnbGVJdGFsaWMiLCJ1bmRlcmxpbmUiLCJ0b2dnbGVVbmRlcmxpbmUiLCJpbmxpbmVDb2RlIiwidG9nZ2xlSW5saW5lQ29kZSIsInN0cmlrZXRocm91Z2giLCJ0b2dnbGVTdHJpa2VUaHJvdWdoIiwiU3RyaWtlVGhyb3VnaCIsIkNvbG9yVGV4dE9wdGlvblNlbGVjdCIsIkNvbG9yVGV4dE9wdGlvbnNNZW51IiwiaGlsaXRlQ29sb3JSZWQiLCJ0b2dnbGVIaWxpdGVDb2xvciIsImhpbGl0ZUNvbG9yR3JlZW4iLCJoaWxpdGVDb2xvckJsdWUiLCJoaWxpdGVDb2xvclllbGxvdyIsImhpbGl0ZUNvbG9yR3JleSIsImhpbGl0ZUNvbG9yTm9uZSIsImZvcmVDb2xvclJlZCIsInRvZ2dsZUZvcmVDb2xvciIsImZvcmVDb2xvckdyZWVuIiwiZm9yZUNvbG9yQmx1ZSIsImZvcmVDb2xvclllbGxvdyIsImZvcmVDb2xvckdyZXkiLCJmb3JlQ29sb3JOb25lIiwibW9yZU9wdGlvbnNMaXN0IiwibW9yZU9wdGlvbnNCdXR0b24iLCJjb3B5U2VsZWN0ZWQiLCJjb3B5IiwiY3V0U2VsZWN0ZWQiLCJjdXQiLCJwYXN0IiwicGFzdGUiLCJkdXBsaWNhdGUiLCJyZW1vdmVGb3JtYXQiLCJlcmFzZXIiLCJkZWxldGUiLCJoZWFkMSIsImhlYWQ1IiwiaGVhZDYiLCJRdWlja01lbnVFbXB0eSIsImh0bWxFbXB0eUluZGljYXRvciIsInBhZGRpbmciLCJRdWlja01lbnUiLCJtZW51U2VjdGlvbnMiLCJxdWlja01lbnVFbXB0eSIsImZpbHRlcklucHV0IiwiZm9jdXNTdGFjayIsImJsb2NrT3B0aW9ucyIsIm1lbnVJdGVtIiwicGVlayIsImZvY3VzT25UaGVGaXJzdFZpc2libGVJdGVtIiwiZmlyc3RTZWN0aW9uTm9kZSIsImN1cnJlbnRTZWN0aW9uTm9kZSIsIml0ZW1Ob2RlIiwibWVudUl0ZW1zIiwicHJldmlvdXNWaXNpYmxlU2VjdGlvbk5vZGUiLCJpbW1lZGlhdGVQYXJlbnQiLCJzZWN0aW9uIiwibGFzdFZpc2libGVTZWN0aW9uTm9kZSIsIm5leHRWaXNpYmxlU2VjdGlvbk5vZGUiLCJmaXJzdFZpc2libGVTZWN0aW9uTm9kZSIsImZpbHRlckl0ZW1zIiwiZmlsdGVyU2VjdGlvbiIsInJlc3RvcmUiLCJyZW1vdmVMYXN0RmlsdGVySW5wdXRDaGFyYWN0ZXIiLCJjb25jYXRGaWx0ZXJJbnB1dCIsInN0b3BQcm9wYWdhdGlvbiIsImJsb2NrVHlwZSIsInRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUiLCJzdGciLCJEb3VibHlMaW5rZWRMaXN0IiwiUXVpY2tNZW51U2VjdGlvbiIsInF1aWNrTWVudUluc3RhbmNlIiwiYXBwZW5kUXVpY2tNZW51SXRlbXMiLCJhcHBlbmRRdWlja01lbnVJdGVtIiwiZmlsdGVyVmFsdWUiLCJRdWlja01lbnVJdGVtIiwiX2Jsb2NrVHlwZSIsIl9maWx0ZXJWYWx1ZSIsIl9pbW1lZGlhdGVQYXJlbnQiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbkltYWdlIiwic3ZnIiwib3B0aW9uVGV4dCIsImJsb2NrVGl0bGUiLCJibG9ja0Rlc2NyaXB0aW9uIiwiUXVpY2tNZW51QnVpbGRlciIsImJhc2ljQmxvY2tzU2VjdGlvbiIsIkNhbGxvdXQiLCJtZWRpYUJsb2Nrc1NlY3Rpb24iLCJoZWFkaW5nQmxvY2tzU2VjdGlvbiIsImxpc3RCbG9ja3NTZWN0aW9uIiwiZW1iZWRTZWN0aW9uIiwiVGl0bGUiLCJoMSIsIlRpdGxlQnVpbGRlciIsIkRpcmVjdGlvbnMiLCJUYWJsZVNjb3BlcyIsIlNlbGVjdGlvbk1vZGVzIiwiRW1iZWRUeXBlcyIsIlRvb2xiYXJJRHMiLCJCb3VuZGFyaWVzIiwiVGFibGVVdGlscyIsImluc2VydFBvc2l0aW9uIiwicm93cyIsIm5ld1JvdyIsImluc2VydFJvdyIsIm51bUNvbHVtbnMiLCJyZWR1Y2UiLCJtYXgiLCJjZWxscyIsImFmZmVjdGVkQ2VsbHMiLCJpbnNlcnRDZWxsIiwiaXNMYXN0Q29sdW1uIiwiY2VsbFJvdyIsImlzTGFzdFJvdyIsInJlbW92ZUNvbHVtbkJ5Q2VsbCIsImNvbHVtbkluZGV4IiwiY2VsbEluZGV4IiwiZGVsZXRlQ2VsbCIsInJlbW92ZVJvd0J5Q2VsbCIsImRlbGV0ZVJvdyIsInJvd0luZGV4IiwiZ2V0QWN0aXZlVGFibGVDZWxsIiwiZ2V0TGFzdFRhYmxlQ2VsbCIsImoiLCJnZXRGaXJzdFRhYmxlQ2VsbCIsImdldE5laWdoYm9yQ2VsbCIsImRpcmVjdGlvbiIsIkFycm93UmlnaHQiLCJBcnJvd0xlZnQiLCJBcnJvd1VwIiwiQXJyb3dEb3duIiwiY2hhbmdlQ2VsbEJvcmRlckNvbG9yIiwiY2VsbHNUb0NoYW5nZSIsIkNvbHVtbiIsIlJvdyIsInNlbGVjdGVkQ2VsbCIsIkNlbGwiLCJTZWxlY3RlZENlbGxzIiwibW92ZUZvY3VzVG9CZWxvd0NlbGwiLCJuZXh0Um93IiwiYmVsb3dDZWxsIiwiQ29udGVudCIsIm1hcmdpblRvcCIsImNsZWFyU2VsZWN0aW9uT25EcmFnIiwicmVSZW5kZXJQbGFjZWhvbGRlciIsInNlbGVjdGVkIiwicGFyZW50QmxvY2siLCJCbHVyIiwiY29weUVsZW1lbnRJdGVtIiwiZWRpdG9yIiwiYmxvY2tzIiwicHJlc3NlZEVudGVyT25UaXRsZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzIiwic2VsZWN0ZWRDb250ZW50IiwibWVyZ2VXaXRoUHJldmlvdXNCbG9jayIsIkRlbGV0ZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQiLCJtZXJnZVdpdGhOZXh0QmxvY2siLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsInRhYkNoYXJhY3RlciIsImFjdGl2ZUNlbGwiLCJmb2N1c09uTmV4dEJsb2NrIiwiaW5zZXJ0TmV3Iiwic2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyIiwiSW5wdXQiLCJoYXNBdHRyaWJ1dGUiLCJjdXN0b21QbGFjZWhvbGRlciIsImZvY3VzYWJsZVBhcmVudCIsImVuZE5vZGUiLCJjb2xsYXBzZWQiLCJpc0F0Rmlyc3RWaXNpYmxlTGluZSIsImNsb25lUmFuZ2UiLCJpc0F0TGFzdFZpc2libGVMaW5lIiwiZGlkQ3Vyc29yTW92ZSIsIlByb21pc2UiLCJvcmlnaW5hbFJlY3QiLCJuZXdSZWN0IiwiZGlkTW92ZSIsIkNvbnRlbnRCdWlsZGVyIiwiVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwic2VsZWN0ZWRDZWxscyIsImFjdHVhbEZvY3VzZWRDZWxsIiwidGFibGVPcGVyYXRpb25zU2VydmljZSIsImNvbnRyb2xsZXIiLCJzZWxlY3Rpb25Nb2RlIiwic2VsZWN0aW9uRmxhZyIsInNlbGVjdGVkVGV4dCIsImNsZWFyQW5kSGlkZSIsIk1vZGVyYXRlbHlJbXBvcnRhbnQiLCJBYm9ydENvbnRyb2xsZXIiLCJoYW5kbGVNb3VzZURvd24iLCJoYW5kbGVNb3VzZU1vdmUiLCJoYW5kbGVNb3VzZVVwIiwiaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duIiwiaGFuZGxlQ2VsbFNlbGVjdGlvbkNvbnRpbnVhdGlvbk9uS2V5RG93biIsImhhbmRsZUtleURvd24iLCJoYW5kbGVLZXlVcCIsIlREIiwiYWJvcnQiLCJjbGVhckFsbCIsImFkZFNlbGVjdGVkQ2VsbCIsInVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQiLCJyZXNldFNlbGVjdGlvblN0YXRlIiwiY3VycmVudENlbGwiLCJyZXBlYXQiLCJuZXh0Q2VsbCIsIm5vcm1hbGl6ZVRleHQiLCJyZXBsYWNlIiwidXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlIiwiYWN0dWFsU2VsZWN0aW9uIiwiY3VycmVudENlbGxUZXh0IiwiY2VsbFJlY3QiLCJtb3VzZVgiLCJjbGllbnRYIiwibW91c2VZIiwicmVzZXRBYm9ydENvbnRyb2xsZXIiLCJjaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8iLCJzaWduYWwiLCJiYWNrZ3JvdW5kQ29sb3JzIiwiQmFja2dyb3VuZENvbG9yUmVkIiwicXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJCYWNrZ3JvdW5kQ29sb3JHcmVlbiIsIkJhY2tncm91bmRDb2xvckJsdWUiLCJCYWNrZ3JvdW5kQ29sb3JZZWxsb3ciLCJCYWNrZ3JvdW5kQ29sb3JHcmV5IiwiVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlciIsInRhYmxlT3BlcmF0aW9uU2VydmljZSIsInRhYmxlT3B0aW9ucyIsInRhYmxlQ29sb3JEcm9wZG93biIsImluc2VydFRhYmxlQ29sdW1uTGVmdCIsIkNvbHVtbkxlZnQiLCJpbnNlcnRUYWJsZUNvbHVtblJpZ2h0IiwiQ29sdW1uUmlnaHQiLCJpbnNlcnRUYWJsZVJvd0Fib3ZlIiwiUm93QWJvdmUiLCJpbnNlcnRUYWJsZVJvd0JlbG93IiwiUm93QmVsb3ciLCJkZWxldGVDb2x1bW5JdGVtIiwicmVtb3ZlQ29sdW1uIiwiZGVsZXRlU3dlZXAiLCJkZWxldGVSb3dJdGVtIiwicmVtb3ZlUm93IiwiY2VsbEJhY2tncm91bmRDb2xvclJlZCIsInRvZ2dsZUNlbGxIaWxpdGVDb2xvciIsIkJhY2tncm91bmRDb2xvckNlbGxSZWQiLCJjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4iLCJCYWNrZ3JvdW5kQ29sb3JDZWxsR3JlZW4iLCJjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSIsIkJhY2tncm91bmRDb2xvckNlbGxCbHVlIiwiY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyIsIkJhY2tncm91bmRDb2xvckNlbGxZZWxsb3ciLCJjZWxsQmFja2dyb3VuZENvbG9yR3JleSIsIkJhY2tncm91bmRDb2xvckNlbGxHcmV5IiwiY2VsbEJhY2tncm91bmRDb2xvck5vbmUiLCJFbWJlZFRvb2wiLCJlbWJlZEltYWdlIiwidXJsT2JqIiwibGFzdEZvY3VzZWRFbGVtZW50IiwiVVJMIiwidmFsaWRhdGVJbWFnZSIsImNyZWF0ZUVtYmVkQ29udGFpbmVyIiwiaW1hZ2UiLCJzcmMiLCJhbHQiLCJtYXhXaWR0aCIsImZpbmFsaXplRW1iZWQiLCJ1cmxUb0NoZWNrIiwicmVqZWN0Iiwib25sb2FkIiwib25lcnJvciIsImVtYmVkR29vZ2xlU2hlZXQiLCJzaGVldElkIiwicGF0aG5hbWUiLCJzYWZlU2hlZXRJZCIsImZyYW1lQm9yZGVyIiwiYWxsb3dGdWxsc2NyZWVuIiwiZW1iZWRZb3VUdWJlVmlkZW9Bc0lmcmFtZSIsInZpZGVvSWQiLCJzZWFyY2hQYXJhbXMiLCJzYWZlVmlkZW9JZCIsImFsbG93IiwiZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSIsInBhdGhTZWdtZW50cyIsInNob3J0SWQiLCJzYWZlU2hvcnRJZElkIiwiZW1iZWRZb3VUdWJlUGxheWxpc3RBc0lmcmFtZSIsImxpc3RJZCIsInNhZmVMaXN0SWQiLCJlbWJlZFNwb3RpZnlDb250ZW50IiwiY29udGVudElkIiwicG9wIiwic2FmZUNvbnRlbnRJZCIsIlNwb3RpZnlUcmFjayIsIlNwb3RpZnlQbGF5bGlzdCIsIlNwb3RpZnlTaG93IiwiU3BvdGlmeUVwaXNvZGUiLCJTcG90aWZ5QXJ0aXN0IiwiZW1iZWRHaXN0QXNTY3JpcHQiLCJnaXN0SWQiLCJzaGFkb3dFbGVtZW50IiwibWluSGVpZ2h0Iiwic2hhZG93Um9vdCIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJzY3JpcHRTcmMiLCJzY3JpcHQiLCJvcmlnaW5hbFdyaXRlIiwid3JpdGUiLCJzY3JpcHRPdXRwdXQiLCJ0ZW1wRGl2IiwiZW1iZWRDb2RlcGVuQXNJZnJhbWUiLCJwYXJ0cyIsInVzZXIiLCJwZW4iLCJzYWZlVXNlciIsInNhZmVQZW4iLCJvdmVyZmxvdyIsInJlc2l6ZU9ic2VydmVyIiwiUmVzaXplT2JzZXJ2ZXIiLCJlbnRyeSIsImNvbnRlbnRSZWN0Iiwib2JzZXJ2ZSIsImZpZ3VyZSIsImNvbnRlbnRFbGVtZW50Q2xhc3NlcyIsInRvb2xiYXJXcmFwcGVyIiwiZGV0ZXJtaW5lRW1iZWRUeXBlIiwiZG9tYWluIiwiaG9zdG5hbWUiLCJwYXRoIiwiaGFzIiwiWW91VHViZVBsYXlsaXN0IiwiWW91VHViZVZpZGVvIiwiWW91VHViZVNob3J0IiwiVmltZW9WaWRlbyIsIkdvb2dsZVNoZWV0IiwiVHdlZXQiLCJHb29nbGVNYXAiLCJHaXRIdWJHaXN0IiwiR2l0TGFiU25pcHBldCIsIk1lZGlhSW5wdXR0ZXIiLCJ1cGxvYWRUYWIiLCJjcmVhdGVOYXZJdGVtIiwiZW1iZWRUYWIiLCJ1cGxvYWRDb250ZW50IiwiY3JlYXRlVXBsb2FkQ29udGVudCIsImVtYmVkQ29udGVudCIsImNyZWF0ZUVtYmVkQ29udGVudCIsImxpIiwibGFiZWwiLCJ0ZXh0SW5mbyIsImVtYmVkR2VuZXJpYyIsInJlc2V0SW5wdXRCZ0NvbG9yIiwic3RyaW5nVVJMIiwiZm9jdXNlZEVsZW1lbnQiLCJlbWJlZFR5cGUiLCJpbnB1dFZhbHVlIiwiaW5wdXRUZXh0Iiwic2V0QWN0aXZlVGFiIiwiaGFuZGxlcktleWRvd25FdmVudHMiLCJoYW5kbGVyQ2xpY2tFdmVudHMiLCJoaWRlTWVkaWFJbnB1dHRlck9uRXh0ZXJuYWxDbGljayIsInNob3dNZWRpYUlucHV0dGVyT25NZWRpYUlucHV0dGVyRWxlbWVudENsaWNrIiwiY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzIiwiZmluZENsYXNzV2l0aFN1ZmZpeCIsInN1ZmZpeCIsInJlZ2V4IiwiZ2V0VGFiIiwidGFiSWQiLCJnZXRDb250ZW50IiwibGFzdEZvY3VzZWQiLCJzaG93SW5wdXRNZWRpYSIsInRleHRQbGFjZWhvbGRlciIsInNldElucHV0UGxhY2Vob2xkZXIiLCJhY3RpdmF0ZU1lZGlhVXBsb2FkIiwiaXNFbGVtZW50VmlzaWJsZSIsImVtYmVkIiwib2Zmc2V0UGFyZW50IiwiTWVkaWFJbnB1dHRlckJ1aWxkZXIiLCJFZGl0b3JCdWlsZGVyIiwiVUlCdWlsZGVyIiwic3RhcnQiLCJpbnNlcnRJY29ucyIsInN2Z0NvbnRhaW5lciIsIkNvbW1hbmREaXNwYXRjaGVyIiwidGV4dE9wZXJhdGlvblNlcnZpY2UiLCJoYW5kbGVDb21tYW5kRXZlbnQiLCJjcmVhdGVBTmV3UGFyYWdyYXBoRnJvbVRpdGxlIiwidGFyZ2V0QmxvY2tUeXBlIiwiZXhlY0luc2VydExpbmsiLCJleGVjVG9nZ2xlTGluayIsImV4ZWNCb2xkIiwiZXhlY0lubGluZUNvZGUiLCJleGVjSXRhbGljIiwiZXhlY1VuZGVybGluZSIsImV4ZWNTdHJpa2VUaHJvdWdoIiwiZXhlY0hpbGl0ZUNvbG9yIiwiZXhlY0ZvcmVDb2xvciIsImV4ZWNEdXBsaWNhdGVCbG9jayIsImV4ZWNEZWxldGVCbG9jayIsImV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMiLCJleGVjRGVsZXRlQW5kRm9jdXNPbk5leHQiLCJleGVjRm9jdXNPbk5leHQiLCJleGVjUmVtb3ZlRm9ybWF0IiwianVzdGlmeUxlZnQiLCJqdXN0aWZ5Q2VudGVyIiwianVzdGlmeVJpZ2h0IiwiZXhlY0NyZWF0ZURlZmF1bHRCbG9jayIsImV4ZWNJbnNlcnROZXciLCJmb2N1c09uUHJldmlvdXNCbG9jayIsImV4ZWNGb2N1c09uUHJldmlvdXNCbG9jayIsImV4ZWNNZXJnZVdpdGhOZXh0QmxvY2siLCJleGVjTWVyZ2VXaXRoUHJldmlvdXNCbG9jayIsImluc2VydENvbHVtbkxlZnQiLCJpbnNlcnRDb2x1bW5SaWdodCIsImluc2VydFJvd0Fib3ZlIiwiaW5zZXJ0Um93QmVsb3ciLCJleGVjQ2VsbEJhY2tncm91bmRDb2xvciIsImV4ZWNDaGFuZ2VDYWxsb3V0QmFja2dyb3VuZCIsImZvcm1hdCIsImNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQiLCJTaG9ydGN1dExpc3RlbmVycyIsInN0YXJ0TGlzdGVuIiwiaXNOdW1QYWQiLCJudW1Mb2NrT24iLCJnZXRNb2RpZmllclN0YXRlIiwiVGFibGVMaXN0ZW5lcnMiLCJzaG93bkVsZW1lbnRzIiwiTWFwIiwiRm9jdXNTdGFjayIsInN0YWNrIiwiY2FwYWNpdHkiLCJzaGlmdCIsImNsZWFyIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInRoZW4iLCJjb3BpZWRFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY2F0Y2giLCJlcnIiLCJyZWFkVGV4dCIsInBhc3RlZFRleHQiLCJzZWxlY3Rpb25FdmVudCIsImdldEN1cnJlbnRTZWxlY3RlZEJsb2NrIiwiZm9jdXNPbkZpcnN0QmxvY2siLCJnZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbiIsImN1cnJlbnRDb250ZW50RWRpdGFibGUiLCJwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSIsImNhcmV0UG9zaXRpb24iLCJsaXN0SXRlbSIsImFkanVzdGVkQ2FyZXRQb3NpdGlvbiIsIm5leHRDb250ZW50RWRpdGFibGUiLCJuZXh0RWxlbWVudCIsImhpZGVFdmVudCIsImZvY3VzT25OZXh0IiwiZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkiLCJuZXdDb250ZW50QmxvY2siLCJmb2N1c1N0YWNrVG9BZGQiLCJlZGl0YWJsZUNvbnRlbnQiLCJjYWxsb3V0IiwicmVwbGFjZUNoaWxkIiwiZm9jdXNhYmxlIiwiY3JlYXRlTmV3RWxlbWVudCIsImNyZWF0ZUxpc3RJdGVtIiwibmV3Q29udGVudEVsZW1lbnQiLCJjdXJyZW50SXRlbSIsImNvbnRlbnRDdXJyZW50IiwiY29udGVudENsb25lIiwiY291bnRlciIsIm5ld1BhcmFncmFwaCIsImN1cnJlbnRCbG9jayIsImNsb25lZEJsb2NrIiwiY2xvbmVkVGl0bGUiLCJuZXdCbG9jayIsImV2ZW50UGFyYWdyYXBoIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJmb2N1c09uUHJldmlvdXMiLCJhY3R1YWxFbGVtZW50IiwidG9VcHBlckNhc2UiLCJwcmV2aW91c0VsZW1lbnQiLCJhcHBseUN1cnNvclhFbmRQb3NpdGlvbiIsInNpYmxpbmciLCJmb2N1c2FibGVDYW5kaWRhdGVzIiwiZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50IiwiYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbiIsImdldE5leHRGb2N1c2FibGVFbGVtZW50IiwiYWN0dWFsIiwieFBvc2l0aW9uIiwiYWRqdXN0Q3Vyc29yT2Zmc2V0IiwicHJldmlvdXNTaWJsaW5nIiwiY2xvc2VzdE5vZGUiLCJjbG9zZXN0T2Zmc2V0IiwiY2xvc2VzdERpZmYiLCJsZWZ0RGlmZiIsInJpZ2h0RGlmZiIsIm1pbiIsImdldEN1cnJlbnRTZWxlY3RlZEZvY3VzYWJsZSIsInJlbW92ZUp1c3RpZnkiLCJjYWxsb3V0RGl2IiwiVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwibm9ybWFsaXplQW5jaG9ycyIsImFuY2hvciIsInF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlIiwicXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlIiwiZXh0cmFjdENvbnRlbnRzIiwiaXNDb2RlIiwiY29udGFpbnNDb2RlIiwicGFyZW50Q29kZSIsImNvZGVFbGVtZW50IiwicXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUiLCJpc05vZGVJbnNpZGVBbmNob3IiLCJjbG9uZUNvbnRlbnRzIiwiZXhwZWN0ZWRDb2xvciIsImZvbnRDb2xvciIsInJnYkNvbG9yIiwic3BhbldpdGhCYWNrZ3JvdW5kIiwiZ2V0VGFyZ2V0RWxlbWVudE1hcCIsImdldFNlbGVjdGVkSFRNTEVsZW1lbnQiLCJnZXRTZWxlY3RlZFRleHROb2RlcyIsIm5vZGVJdGVyYXRvciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJFTkRfVE9fU1RBUlQiLCJTVEFSVF9UT19FTkQiLCJmaW5kQ2xvc2VzdE1hdGNoaW5nUGFyZW50IiwiZWxlbSIsImV2ZXJ5IiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsImVuZCIsIlRhYmxlT3BlcmF0aW9uc1NlcnZpY2UiLCJpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJUYWJsZVRvb2xiYXIiLCJpc0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJ0YXJnZXRIZXhDb2xvciIsImN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJlbGVtZW50cyIsImlzIiwic2hvd0luc2VydExpbmVFbGVtZW50Iiwic2hvd0luc2VydENvbHVtbkVsZW1lbnQiLCJoaWRlSW5zZXJ0Um93RWxlbWVudCIsImhpZGVJbnNlcnRDb2x1bW5FbGVtZW50IiwiTWVtZW50byIsInVuZG9TdGFjayIsInJlZG9TdGFjayIsInF1ZXJ5IiwiaHRtbCIsInVuZG8iLCJzdGF0ZVRvUmVzdG9yZSIsInJlZG8iLCJzdGF0ZVRvQXBwbHkiLCJTcGFjZSIsIkVkaXRhYmxlTmF2aWdhdGlvbiIsImhhbmRsZUFycm93S2V5cyIsImN1cnJlbnRFZGl0YWJsZSIsInNob3VsZFN3aXRjaEVkaXRhYmxlIiwibmV4dEVkaXRhYmxlIiwiZmluZE5leHRFZGl0YWJsZSIsInBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbiIsImlzQXRGaXJzdExpbmUiLCJpc0F0TGluZUJvdW5kYXJ5IiwiRmlyc3QiLCJpc0F0TGFzdExpbmUiLCJMYXN0IiwiYm91bmRhcnkiLCJhbGxFZGl0YWJsZXMiLCJjdXJyZW50SW5kZXgiLCJuZWlnaGJvckNlbGwiLCJuZXh0SW5kZXgiLCJmaW5kVmVydGljYWxFZGl0YWJsZUluZGV4IiwibmV4dCIsIkV2ZW50Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/demo/assets/index.html b/demo/assets/index.html index 41c791c..bb2eab4 100644 --- a/demo/assets/index.html +++ b/demo/assets/index.html @@ -5,6 +5,7 @@ includeHeader: true, includeFirstParagraph: true, enableTitle: true, + enableThumbnail: true, title: undefined }; diff --git a/demo/bundle.js b/demo/bundle.js deleted file mode 100644 index a6dab1f..0000000 --- a/demo/bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e={282:(e,t,n)=>{n.d(t,{A:()=>s});var o=n(354),i=n.n(o),r=n(314),l=n.n(r)()(i());l.push([e.id,'/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n}\n\n.list-item-checkable input {\n /* width: 18px; */\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n/* .block:hover .block-toolbar {\n visibility: visible;\n} */\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n/* pre {\n width: 100%;\n} */\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n /* min-height: 2000px; */\n background-color: white;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n /* background-color: white; */\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n ;\n padding: 10px 20px;\n /* font-size: 0.75rem; */\n /* color: rgba(55, 53, 47, 0.6); */\n font-size: 0.86rem;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n\n\n/* #linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n\n border: 1px solid #949494;\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n} */\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n/* code:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n} */\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n/* #deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n} */\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #FDDEDE;\n border-color: #e4c8c8;\n}\n\n.callout-background-green {\n background-color: #D7F7DC;\n border-color: #c2dec6;\n}\n\n.callout-background-blue {\n background-color: #D9EDF6;\n border-color: #c3d5dd;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #fbf5d6;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #e7e6e6;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n\n\n\n\n\n\n\n\n\n/* .embed-container {\n position: relative;\n}\n\n.more-options-button {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 999999;\n background-color: red;\n\n}\n\n.context-menu {\n position: absolute;\n top: 20px;\n right: 0;\n background-color: #fff;\n border: 1px solid #ccc;\n padding: 5px;\n z-index: 10;\n display: none;\n}\n\n.more-options-button:active + .context-menu,\n.more-options-button:focus + .context-menu {\n display: block;\n}\n\n\n.bbbuton{\n background-color: red;\n top: 0;\n left: 0;\n} */\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n \n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n color: inherit;\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: "#2383e2";\n color: "white";\n border: "none";\n padding: "3px";\n border-radius: "5px";\n font-weight: "500";\n}\n\n\n.block-selected {\n /* border: 2px dashed red; */\n}\n\n.separator {\n /* padding: 10px 0; */\n}\n\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n /* height: 50px; */\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n/* .separator::before,\n.separator::after {\n content: "";\n flex-grow: 1;\n} */\n\n\n\n.separator-wrapper hr {\n /* Outros estilos */\n outline: none !important;\n /* Remova esta linha se estiver presente */\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n /* outline: 2px solid blue; */\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n\n.separator-selected hr {\n /* outline: 2px solid blue; */\n /* border: 1px solid white !important; */\n\n /* background-color: hsl(210 75% 50% / 1); */\n color: white !important;\n border-color: white !important;\n\n\n}',"",{version:3,sources:["webpack://./src/assets/css/main.css"],names:[],mappings:"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",sourcesContent:['/** cursor style */\n[contenteditable="true"] {\n cursor: text !important;\n white-space: pre-wrap !important;\n}\n\n\n\n/** CSS reset */\n\n.button-reset {\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: normal;\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n -webkit-appearance: none;\n}\n\n\n\n/** add block */\n.add-block {\n margin: 0;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #000;\n background-color: white;\n transition: all 0.3s ease;\n box-sizing: border-box;\n margin-left: 1.3rem;\n}\n\n.add-block-wrapper {\n width: 100%;\n height: 3.125rem;\n}\n\n.add-block-wrapper:hover .add-block {\n display: flex;\n}\n\n/** and add block */\n\n\n\n/** List **/\n.list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n}\n\n.list-item-checkable input {\n margin-top: 0.5rem;\n}\n\n.list li div {\n display: inline-block !important;\n min-width: 100px;\n line-height: 1;\n}\n\nol.johannes-content-element,\nul.johannes-content-element {\n padding-left: 1rem !important;\n}\n\n.johannes-content-element li>button {\n /* display: none; */\n display: none;\n position: absolute;\n margin-left: 10px;\n top: 0;\n\n flex-direction: row;\n align-items: start;\n justify-content: start;\n\n}\n\n.johannes-content-element li {\n position: relative;\n\n}\n\n.johannes-content-element li::before {\n margin-left: 0.3125rem;\n}\n\n.johannes-content-element li:hover>button {\n /* display: inline-block; */\n display: inline-flex;\n\n}\n\np.johannes-content-element {\n display: inline-block;\n line-height: 1;\n margin: 0;\n padding: 0;\n}\n\n.johannes-content-element .checkbox-list {\n list-style-type: none;\n padding-left: 0 !important;\n}\n\n\n.johannes-content-element .checkbox-list li {\n display: flex;\n flex-direction: row;\n justify-content: left;\n}\n\n\n.johannes-content-element ul.checkbox-list input[type="checkbox"]:checked+span {\n text-decoration: line-through;\n}\n\n/* ul.johannes-content-element:not(.checkbox-list),\nol.johannes-content-element:not(.checkbox-list) {\n padding-left: 1.5rem !important;\n} */\n\n/** Add line through text decoration to checked checkboxes text div */\n.block input[type="checkbox"]:checked+div {\n text-decoration: line-through;\n}\n\n/** Remove the default list style and replace by another that works with display flex */\n.block ol,\n.block ul {\n list-style: none;\n}\n\n.block ul .list-item,\n.block ol .list-item {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n}\n\n.block ol li {\n counter-increment: item;\n}\n\n.block ol li::before {\n content: counter(item) ".";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n justify-content: flex-start;\n}\n\n.block ul li:not(.no-list-style)::before {\n content: "•";\n margin-right: 0.3125rem;\n display: flex;\n /* width: 18px; */\n}\n\n.list-item-checkable input {\n /* width: 18px; */\n margin-right: 0.3125rem;\n}\n\n\n/** and list **/\n\n\n\n.drag-handler {\n color: #84888d;\n visibility: hidden;\n cursor: grab;\n align-self: start;\n padding-top: 0.33rem;\n position: absolute;\n}\n\n.drag-handler-wrapper {\n position: relative;\n height: 0;\n width: 0;\n}\n\n\n\n.drag-handler svg {\n /* background-color: red; */\n}\n\n.drag-handler svg use {\n /* background-color: blue; */\n}\n\n.drag-handler:active {\n cursor: grabbing;\n}\n\n.block {\n display: flex;\n flex-direction: row;\n margin-bottom: 1rem;\n position: relative;\n max-width: 100%;\n}\n\n.block>*:not(.editor-only) {\n padding-left: 1.25rem !important;\n}\n\n.block:hover .drag-handler {\n visibility: visible;\n vertical-align: top;\n justify-content: start;\n transition: visibility 0.2s;\n}\n\n/* .block:hover .block-toolbar {\n visibility: visible;\n} */\n\n.drop-line {\n height: 1rem;\n background-color: #84888d;\n width: 100%;\n}\n\n\n.title h1 {\n margin-left: 1.3rem;\n line-height: 3rem;\n}\n\n\n[contenteditable="true"]:empty:focus {\n content: attr(data-placeholder);\n color: #84888d;\n pointer-events: none;\n}\n\nh1[data-placeholder]:empty:before {\n content: attr(data-placeholder);\n color: #84888d !important;\n display: block;\n}\n\nh1[data-placeholder]:focus:before {}\n\n\n*[contenteditable="true"]:not(h1):empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: none;\n}\n\n*[contenteditable="true"]:not(h1):empty:hover:before {\n display: block;\n}\n\ncite[contenteditable="true"]:empty:before {\n display: block;\n}\n\n*[contenteditable="true"]:not(h1)[data-placeholder]:empty:focus:before {\n content: attr(data-placeholder);\n color: #84888acd !important;\n display: block;\n}\n\nli.div[contenteditable="true"]:empty:hover:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block;\n}\n\n\n\nh1 {\n font-size: 2.5rem;\n font-weight: bolder !important;\n}\n\n.johannes-editor {\n width: 100%;\n\n}\n\n.content {\n width: 100%;\n box-sizing: border-box;\n /* background-color: red; */\n}\n\n.content .block .table-wrapper {\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n\n/* pre {\n width: 100%;\n} */\n\n[contenteditable] {\n outline: none;\n}\n\nbody {\n /* min-height: 2000px; */\n background-color: white;\n\n font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n}\n\n\n\n.editor {\n display: flex;\n margin-top: 80px;\n}\n\np {\n color: #242424;\n}\n\n\n.block,\n.block * {\n user-select: text;\n}\n\n\n.johannes-content-element {\n width: 100%;\n padding: 0;\n margin: 0;\n /* background-color: green; */\n}\n\n\n#johannesEditor {\n width: 60%;\n margin-left: auto;\n margin-right: auto;\n}\n\n.johannes-editor hr {\n width: 100%;\n height: 2px;\n visibility: visible;\n border: none;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n}\n\n\n\n.johannes-editor blockquote {\n margin: 0.5rem 0;\n padding-left: 20px;\n border-left: 4px solid rgb(55, 53, 47);\n font-style: italic;\n display: block;\n}\n\n.johannes-editor cite {\n padding-top: 1rem !important;\n display: inline-block;\n}\n\n\n.johannes-editor cite::before {\n content: \'— \';\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#linkBox {\n z-index: 999999;\n width: fit-content;\n /* background-color: white; */\n background-color: white;\n}\n\n#linkBox .header {\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n ;\n padding: 10px 20px;\n /* font-size: 0.75rem; */\n /* color: rgba(55, 53, 47, 0.6); */\n font-size: 0.86rem;\n}\n\n#linkBox .link-box-shell {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 20px;\n}\n\n\n#linkBox .link-box-shell input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.ctrl-active .johannes-content-element a {\n cursor: pointer;\n}\n\n\n\n\n/* #linkBox {\n border-radius: 2px;\n padding: 20px;\n background-color: #f9f9f9;\n\n\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(0, 0, 0, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n\n border: 1px solid #d0d0d0;\n width: fit-content;\n z-index: 999999;\n color: rgb(120, 119, 116);\n border-radius: none;\n}\n\n\n#linkBox input {\n width: 316px;\n padding: 8px 40px 8px 16px;\n\n border: 1px solid #949494;\n height: 24px;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n\n#linkBox input::selection,\n#linkBox input:focus {\n border-radius: none;\n} */\n\n/** soft-box-shadow class */\n.soft-box-shadow {\n margin: 0;\n padding: 0;\n border-radius: 2px;\n box-shadow:\n 0 4px 6px rgba(0, 0, 0, 0.1),\n 0 -2px 4px rgba(216, 196, 196, 0.02),\n -2px 0 4px rgba(0, 0, 0, 0.02),\n 2px 0 4px rgba(0, 0, 0, 0.02);\n\n border: 1px solid #d0d0d0;\n}\n\n/** and soft-box-shadow */\n\n\n/** selection-wrapper class */\n.select-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n.select-wrapper ul {\n position: absolute;\n background: white;\n flex-direction: column;\n width: fit-content;\n padding-bottom: 0.5rem;\n padding-left: 5px;\n padding-right: 5px;\n top: 2.2rem;\n color: rgb(55, 53, 47);\n padding-right: 0.3125rem;\n}\n\n.select-wrapper ul li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.625rem;\n padding: 0.1875rem 0.3125rem;\n border-radius: 0.1875rem;\n user-select: none !important;\n font-size: small !important;\n font-weight: 500;\n}\n\n.select-wrapper ul li span,\n.select-wrapper button span {\n display: inline-block;\n width: max-content;\n line-height: 100% !important;\n}\n\n.select-wrapper ul li .option-image {\n width: 1.375rem;\n height: 1.375rem;\n color: #242424;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper ul li .option-image svg {\n color: #4f4f4f;\n padding: 0 !important;\n margin: 0 !important;\n}\n\n.select-wrapper {\n position: relative;\n color: rgb(120, 119, 116);\n}\n\n.select-wrapper>button {\n color: rgba(55, 53, 47, 0.85);\n}\n\n.select-wrapper ul li>h3 {\n margin: 0;\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n}\n\n/** end selection wrapper **/\n\n\n\n/** Text formatting Bar **/\n\n\n\n.floating-toolbar {\n justify-content: space-between;\n padding: 8px 16px;\n background-color: white;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n}\n\n\n.floating-toolbar .item {\n color: rgb(120, 119, 116);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.floating-toolbar .item>button {\n\n display: inline-flex;\n align-items: center;\n}\n\n\n.floating-toolbar select {\n color: rgb(120, 119, 116);\n border: none;\n font-size: 0.85rem;\n background-color: inherit;\n}\n\n.text-formatting-select-button {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n\n#turnIntoButton span {\n display: inline-flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n font-size: 0.9rem;\n\n}\n\n#turnIntoButton svg use {\n margin: auto;\n}\n\n/* code:not(pre code) {\n margin: 0;\n padding: 0;\n background-color: #d0d0d0;\n background-color: #f6f5f4;\n font-size: inherit;\n font-size: 1rem !important;\n border: 1px solid #0000001a;\n padding: 0 3px;\n display: inline-block;\n border-radius: 4px;\n box-sizing: border-box;\n} */\n\n\n\n\n/* a:not([href]) {\n background-color: #d3e3fd;\n} */\n\n.text-formatting-button-active {\n color: #2382e2;\n}\n\n.text-formatting-circle-active {\n border-color: #2382e2 !important;\n}\n\n\n\n#moreTextOptionSelect {\n position: absolute;\n}\n\n.moreTextOptionWrapper {\n position: relative;\n}\n\n\n.bgc-red {\n background-color: #FDDEDE;\n}\n\n.bgc-green {\n background-color: #D7F7DC;\n}\n\n.bgc-blue {\n background-color: #D9EDF6;\n}\n\n.bgc-yellow {\n background-color: #FAF4D1;\n}\n\n.bgc-grey {\n background-color: #E1E0E0;\n}\n\np,\nmark {\n line-height: 1;\n}\n\n#turnIntoSelect .option-image {\n /* display: none !important; */\n}\n\n.border-less-image {\n width: 24px;\n height: 24px;\n}\n\n\n\n\n/** Block Options **/\n\n.block-options-wrapper {\n z-index: 999999;\n position: absolute;\n display: none;\n}\n\n.block-options {\n width: fit-content;\n max-height: 19rem;\n overflow-y: auto;\n}\n\n.block-options {\n padding: 0 0.625rem;\n background: white;\n}\n\n.block-options section h2 {\n font-size: small !important;\n color: #37352fa6;\n margin: 0;\n padding: 0;\n font-weight: 600 !important;\n margin-top: 0.3125rem;\n margin-bottom: 0.3125rem;\n padding-left: 0.3125rem;\n}\n\n.block-options .option {\n padding: 0.3125rem 0.625rem;\n margin: 0.3125rem 0;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: left;\n gap: 0.6rem;\n border-radius: 3px;\n}\n\n.block-options .option:focus {\n outline: none;\n background-color: #e9e9e9;\n background-color: red;\n border: inherit;\n}\n\n.option-focused {\n outline: none;\n background-color: #e9e9e9;\n border: none;\n}\n\n.danger-option.option-focused,\n.danger-option.option-focused svg {\n color: #EB5757 !important;\n}\n\n\n\n.block-options .option:focus-visible {\n outline: none;\n background-color: #e9e9e9;\n border: inherit;\n}\n\n/* .option-hover:hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n} */\n\n/* .select-wrapper>button, */\n\n/* #turnIntoButton,\n#colorTextButton {\n padding-left: 4px;\n} */\n\n#colorTextButton {\n margin-left: 0.625rem;\n}\n\n#turnIntoButton:not([disabled]):hover,\n#colorTextButton:not([disabled]):hover,\n#moreTextOptionButton:not([disabled]):hover,\n.floating-toolbar .item>button:not([disabled]):hover {\n background-color: #e9e9e9;\n box-shadow: 0px 0px 0px 2px #e9e9e9;\n border-radius: 1px;\n transition: 0.1s ease;\n}\n\n\n\n.option[focused="true"] {\n background-color: #bde4ff;\n}\n\n.option-image {\n width: 2.875rem;\n height: 2.875rem;\n border-radius: 0.1875rem;\n border: 1px solid #ccc;\n color: #4f4f4f;\n\n display: flex;\n flex-direction: row;\n justify-content: center;\n vertical-align: middle;\n align-items: center;\n background-color: #ffff;\n box-sizing: border-box;\n}\n\n.option-image img {\n max-width: 2.875rem;\n max-height: 2.875rem;\n}\n\n.option-image svg {\n margin: 0;\n padding: 0;\n padding: 0.625rem;\n box-sizing: border-box;\n\n}\n\n.option-text * {\n margin: 0;\n padding: 0;\n\n}\n\n.option-text .block-title {\n font-size: small !important;\n font-weight: 500;\n}\n\n.option-text .block-description {\n font-size: small !important;\n color: rgba(55, 53, 47, 0.5);\n}\n\n/** End Block Options **/\n\n\n\n/* #deleteBlockButton:hover svg,\n#deleteBlockButton:hover {\n color: rgb(235, 87, 87) !important;\n} */\n\n\n\n.johannes-editor *::selection {\n /* background-color: rgba(211, 227, 253, 0.5) !important; */\n\n background-color: hsl(210 75% 50% / 1);\n color: white;\n}\n\n.johannes-editor mark,\n.johannes-editor *:not(h1) {\n line-height: 1.5 !important;\n}\n\n.option {\n justify-content: space-between;\n}\n\n.text-option {\n display: flex;\n flex-direction: row;\n justify-content: start;\n align-items: center;\n gap: 0.625rem;\n}\n\n\n\n\n:root {\n /* font-size: 16px; */\n /* Tamanho padrão */\n}\n\n/* Para telas com densidade média */\n@media only screen and (-webkit-min-device-pixel-ratio: 2),\nonly screen and (min--moz-device-pixel-ratio: 2),\nonly screen and (min-resolution: 192dpi),\nonly screen and (min-resolution: 2dppx) {\n :root {\n font-size: 18px;\n /* Aumenta o tamanho da fonte para telas de alta densidade */\n }\n}\n\n/* Para telas com altíssima densidade */\n@media only screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (min--moz-device-pixel-ratio: 3),\nonly screen and (min-resolution: 288dpi),\nonly screen and (min-resolution: 3dppx) {\n :root {\n font-size: 20px;\n /* Ainda maior para telas de densidade muito alta */\n }\n}\n\n\n\n\n\n\n\n\n\n\n\ntable.johannes-content-element {\n border-collapse: collapse;\n max-width: inherit;\n width: auto;\n display: flex;\n box-sizing: border-box !important;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n min-height: 20px;\n}\n\ntable.johannes-content-element th,\ntable.johannes-content-element td {\n border: 1px solid #84888d;\n padding: 8px;\n text-align: left;\n align-items: start;\n overflow-wrap: break-word;\n word-wrap: break-word;\n white-space: normal;\n vertical-align: top;\n min-width: 100px;\n max-width: 200px;\n /* box-sizing: border-box !important; */\n\n transition: border 100ms ease-out, box-shadow 100ms ease-out;\n\n}\n\ntable.johannes-content-element td.selected,\ntable.johannes-content-element td:focus {\n outline: none;\n box-shadow: 0 0 0 1px #74b6db inset;\n border: 1px double #74b6db;\n\n}\n\ntd {\n min-height: 1rem !important;\n line-height: 1rem;\n}\n\ntd::placeholder {\n display: block;\n}\n\ntd:empty:before {\n content: attr(data-placeholder);\n color: #84888acd;\n display: block !important;\n opacity: 0;\n}\n\n.table-wrapper {\n width: 100%;\n}\n\n.table-controller {\n position: relative;\n max-width: 100%;\n}\n\n.add-table-row {\n background-color: rgba(55, 53, 47, 0.06);\n width: 100%;\n padding: 0;\n margin: 0;\n margin-top: 0.375rem;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 1rem;\n cursor: pointer;\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column {\n position: absolute;\n right: -1.3125rem;\n background-color: rgba(55, 53, 47, 0.06);\n width: 1rem;\n padding: 0;\n margin: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 100%;\n top: 0;\n cursor: pointer;\n height: calc(100% - 1rem - 5px);\n opacity: 0;\n user-select: none;\n}\n\n.add-table-column:hover {\n opacity: 1;\n}\n\n.add-table-row:hover {\n opacity: 1;\n}\n\n.table-shell {\n max-width: 100%;\n}\n\n\n\n.table-option {\n background-color: white;\n width: fit-content;\n justify-content: space-between;\n padding: 8px 16px;\n background-color: #f9f9f9;\n width: fit-content;\n z-index: 999999;\n position: absolute;\n user-select: none;\n padding: 8px 16px;\n display: none;\n}\n\n\n/** Callout **/\n\n.callout-wrapper {\n padding: 1rem;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n.callout:hover .options-button {\n display: block !important;\n}\n\n.callout p {\n margin: 0;\n}\n\n.callout-background-red {\n background-color: #FDDEDE;\n border-color: #e4c8c8;\n}\n\n.callout-background-green {\n background-color: #D7F7DC;\n border-color: #c2dec6;\n}\n\n.callout-background-blue {\n background-color: #D9EDF6;\n border-color: #c3d5dd;\n}\n\n.callout-background-yellow {\n background-color: #fcf7df;\n border-color: #fbf5d6;\n}\n\n.callout-background-grey {\n background-color: #edecec;\n border-color: #e7e6e6;\n}\n\n.callout-background-none {\n background-color: transparent;\n border-color: #e7e6e6;\n\n}\n\n/** end callout */\n\n\n/** mediaInputter **/\n.mediaInputter {\n background-color: white;\n}\n\n/** mediaInputter **/\n\n\n.no-selection {\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.pointer {\n cursor: pointer;\n}\n\n\n/** upload/embed **/\n\n.tab-container {\n font-size: 0.86rem;\n display: flex;\n flex-direction: column;\n transition: 0.1s ease;\n\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n\n transition: visibility 0.2s ease;\n\n\n width: fit-content;\n position: absolute;\n background-color: white;\n\n}\n\n.nav-underline {\n margin: 0;\n padding: 0;\n border-bottom: 1px solid rgba(55, 53, 47, 0.16);\n padding: 10px 20px;\n}\n\n.nav-underline .nav-item {\n display: flex;\n margin-right: 15px;\n}\n\n.nav-underline .nav-link {\n cursor: pointer;\n text-decoration: none;\n color: rgb(55, 53, 47);\n color: rgba(55, 53, 47, 0.5);\n transition: 0.1s ease;\n}\n\n\n.nav-item.active .nav-link {\n color: #000;\n}\n\n.tab-content .content-data {\n display: none;\n padding: 20px;\n border-top: none;\n transition: 0.1s ease;\n}\n\n.tab-content .content-data.active {\n display: flex;\n flex-direction: column;\n text-align: center;\n gap: 1rem;\n}\n\n.tab-content .text-info {\n font-size: 0.75rem;\n color: rgba(55, 53, 47, 0.6);\n}\n\n.nav-underline .nav-item {\n display: inline;\n}\n\n.embed-content input {\n width: 20rem;\n border: 1px solid rgba(55, 53, 47, 0.16);\n height: 1.5rem;\n border-radius: 4px;\n padding-left: 10px;\n}\n\n\n.upload-content label {\n display: block;\n border: 1px solid rgba(55, 53, 47, 0.16);\n border-radius: 4px;\n width: 20rem;\n text-align: center;\n padding: 4px;\n color: rgb(55, 53, 47);\n background-color: #fff;\n /* transition: 0.1s ease; */\n}\n\n.upload-content label:hover {\n background-color: #eeeeee;\n}\n\n\n\n\n\n\n\n\n\n\n/* Estilo para as alças de redimensionamento */\n.resize-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: rgba(0, 0, 0, 0.5);\n cursor: nwse-resize;\n /* Cursor de redimensionamento diagonal */\n}\n\n.resize-handle.se {\n bottom: 0;\n right: 0;\n}\n\n.spotify-embed {\n min-height: 152px;\n height: auto !important;\n padding-bottom: 0 !important;\n border-radius: .75rem !important;\n}\n\n.gist-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.snippet-embed {\n padding-bottom: 0 !important;\n min-height: 150px !important;\n overflow-y: auto;\n}\n\n.embed-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: visible;\n}\n\n.embed-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n.iframe-wrapper {\n position: relative;\n}\n\n\n\n.video-container {\n position: relative;\n width: 100%;\n padding-bottom: 56.25%;\n height: 0;\n overflow: hidden;\n}\n\n.video-container iframe {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n\n\n.x-resizable {\n resize: horizontal;\n overflow: auto;\n cursor: nesw-resize;\n min-width: 250px;\n}\n\n.y-resizable {\n resize: vertical;\n overflow: auto;\n cursor: ns-resize;\n min-height: 150px;\n}\n\n.background {\n background-color: #e7e6e3;\n}\n\n\n.fit-content {\n width: fit-content;\n height: fit-content;\n}\n\n\n\n\n\n\n\n\n\n\n\n/* .embed-container {\n position: relative;\n}\n\n.more-options-button {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 999999;\n background-color: red;\n\n}\n\n.context-menu {\n position: absolute;\n top: 20px;\n right: 0;\n background-color: #fff;\n border: 1px solid #ccc;\n padding: 5px;\n z-index: 10;\n display: none;\n}\n\n.more-options-button:active + .context-menu,\n.more-options-button:focus + .context-menu {\n display: block;\n}\n\n\n.bbbuton{\n background-color: red;\n top: 0;\n left: 0;\n} */\n\n\n/** BlockToolbar component **/\n.block-toolbar-wrapper {\n width: 0;\n height: 0;\n position: relative;\n overflow: visible;\n margin: 0;\n padding: 0;\n display: contents;\n display: block;\n \n}\n\n.block-toolbar {\n margin: 0;\n padding: 0;\n position: absolute;\n right: 0;\n display: flex;\n flex-direction: row;\n background-color: #f9f9f9;\n color: black !important;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n gap: 10px;\n padding: 5px;\n padding-left: 10px;\n padding-right: 10px;\n transition: visibility 0.2s;\n\n top: 5px;\n right: 5px;\n border-radius: 4px;\n}\n\n.block-toolbar .item {\n flex-direction: row;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.block-toolbar .item button {\n display: flex;\n}\n\n.block-toolbar button {\n color: black;\n}\n\n.block-toolbar .color-interactive-button {\n margin: 0;\n padding: 0;\n}\n\n/** End BlockToolbar component **/\n\n\n\n.justify-left {\n justify-content: left;\n}\n\n.justify-center {\n justify-content: center;\n}\n\n.justify-right {\n justify-content: right;\n}\n\n\n.hidden {\n visibility: hidden !important;\n}\n\n\n\n\nfigure {\n margin: 0;\n padding: 0;\n}\n\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n/** Inline Code **/\n.johannes-content-element code:not(pre code) {\n font-size: 1rem;\n background-color: #cccccc7a;\n padding: 0 3px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n/** Content placeholder */\n\n.content-placeholder {\n padding: 1rem;\n background-color: #e7e6e3;\n color: rgba(55, 53, 47, 0.5);\n display: flex;\n gap: 5px;\n align-items: center;\n border-radius: 4px;\n}\n\n.content-placeholder .icon-wrapper {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n\n/* end Content placeholder */\n\n\n\n/** Code **/\n\npre {\n margin: 0;\n}\n\npre code {\n border-radius: 4px;\n}\n\n.ignore-events {\n position: relative;\n}\n\n.code-block {\n position: relative;\n}\n\n.code-block select {\n position: absolute;\n}\n\n.code-block select {\n appearance: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n background: transparent;\n border: none;\n padding: 4px 8px;\n font: inherit;\n color: inherit;\n background-repeat: no-repeat;\n background-position: right 10px center;\n color: white;\n display: none;\n}\n\n.code-block:hover select {\n display: block;\n}\n\n\n\n.code-block code {\n font-size: 1rem;\n\n}\n\n\n\n@keyframes shake {\n\n 0%,\n 100% {\n transform: translateX(0);\n }\n\n 25%,\n 75% {\n transform: translateX(-5px);\n }\n\n 50% {\n transform: translateX(5px);\n }\n}\n\n.shake-animation {\n animation: shake 0.6s cubic-bezier(.36, .07, .19, .97) both;\n transform: translate3d(0, 0, 0);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.blue-button {\n background-color: "#2383e2";\n color: "white";\n border: "none";\n padding: "3px";\n border-radius: "5px";\n font-weight: "500";\n}\n\n\n.block-selected {\n /* border: 2px dashed red; */\n}\n\n.separator {\n /* padding: 10px 0; */\n}\n\n\n.separator-wrapper {\n display: flex;\n align-items: center;\n /* height: 50px; */\n}\n\n.separator {\n flex-grow: 1;\n padding: 0 10px;\n}\n\n/* .separator::before,\n.separator::after {\n content: "";\n flex-grow: 1;\n} */\n\n\n\n.separator-wrapper hr {\n /* Outros estilos */\n outline: none !important;\n /* Remova esta linha se estiver presente */\n}\n\n.separator-wrapper hr:focus {\n outline: none !important;\n}\n\n.separator-selected {\n /* outline: 2px solid blue; */\n border: none !important;\n outline: none !important;\n background-color: hsl(210 75% 50% / 1);\n}\n\n\n.separator-selected hr {\n /* outline: 2px solid blue; */\n /* border: 1px solid white !important; */\n\n /* background-color: hsl(210 75% 50% / 1); */\n color: white !important;\n border-color: white !important;\n\n\n}'],sourceRoot:""}]);const s=l},314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",o=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),o&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),o&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,o,i,r){"string"==typeof e&&(e=[[null,e,void 0]]);var l={};if(o)for(var s=0;s0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),t.push(d))}},t}},354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),r="/*# ".concat(i," */");return[t].concat([r]).join("\n")}return[t].join("\n")}},72:e=>{var t=[];function n(e){for(var n=-1,o=0;o{var t={};e.exports=function(e,n){var o=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(n)}},540:e=>{e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,n)=>{e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},825:e=>{e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var o="";n.supports&&(o+="@supports (".concat(n.supports,") {")),n.media&&(o+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(o+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),o+=n.css,i&&(o+="}"),n.media&&(o+="}"),n.supports&&(o+="}");var r=n.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),t.styleTagTransform(o,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var r=t[o]={id:o,exports:{}};return e[o](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.nc=void 0;var o,i,r,l,s,a,c,d,u,m,h,p,A,C,g,b,E,f=n(72),B=n.n(f),v=n(825),w=n.n(v),k=n(659),I=n.n(k),y=n(56),x=n.n(y),T=n(540),S=n.n(T),L=n(113),M=n.n(L),N=n(282),q={};q.styleTagTransform=M(),q.setAttributes=x(),q.insert=I().bind(null,"head"),q.domAPI=w(),q.insertStyleElement=S(),B()(N.A,q),N.A&&N.A.locals&&N.A.locals,function(e){e.Paragraph="p",e.Heading_1="h1",e.Heading_2="h2",e.Heading_3="h3",e.Heading_4="h4",e.Heading_5="h5",e.Heading_6="h6",e.CheckList="checkList",e.BulletedList="bulletedList",e.NumberedList="numberedList",e.List="list",e.Table="table",e.Image="image",e.Script="script",e.Iframe="iframe"}(o||(o={}));class H{static generateUniqueId(){const e=Date.now().toString(36),t=new Uint32Array(1);return window.crypto.getRandomValues(t),e+t[0].toString(36)}static rgbToHex(e){return"#"+e.match(/\d+/g).map(Number).map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join("")}static isValidUrl(e){const t=new RegExp("^(https?:\\/\\/)(?!-)[a-zA-Z\\d-]{1,63}(?O.blockParagraph(e)}static paragraphCreator(){return e=>O.paragraph(e)}static headingCreator(e){return t=>O.heading(e,t)}static checkboxItemCreator(){return e=>O.checkboxItem(e||"")}static listItemCreator(){return e=>O.listItem_2(e)}static dragHandleButtonCreator(){return()=>O.dragHandleButton()}static codeCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","ignore-events");const n=document.createElement("div");n.classList.add("code-block","ignore-quick-menu","ignore-text-floating-toolbar");const o=document.createElement("pre");o.classList.add(r.IncludeBlockToolbarClass,r.LanguageSelectionToolClass,r.ExtraOptionsClass);const i=document.createElement("code");return i.contentEditable="true",i.setAttribute("data-placeholder","/* Code snippet */"),i.textContent=e||"",i.classList.add("johannes-code","focusable","hljs","language-plaintext"),i.setAttribute("spellCheck","false"),o.appendChild(i),i.addEventListener("blur",(()=>{i.removeAttribute("data-highlighted"),hljs.highlightElement(i)})),n.appendChild(o),t.appendChild(n),hljs.highlightElement(i),t}}static quoteCreator(){return e=>{const t=document.createElement("div");t.classList.add("johannes-content-element","swittable");const n=document.createElement("blockquote");return n.classList.add("focusable"),n.textContent=e||"",n.contentEditable="true",n.setAttribute("data-placeholder",O.getRandomQuote()),t.appendChild(n),t}}static getRandomQuote(){const e=["Talk is cheap. Show me the code. - Linus Torvalds","Premature optimization is the root of all evil. - Donald Knuth","The most dangerous phrase in the language is, 'We've always done it this way.' - Grace Hopper","Simplicity is prerequisite for reliability. - Edsger W. Dijkstra","Any fool can write code that a computer can understand. Good programmers write code that humans can understand. - Martin Fowler","First, solve the problem. Then, write the code. - John Johnson","In programming, the hard part isn't solving problems, but deciding what problems to solve. - Paul Graham","Code is like humor. When you have to explain it, it's bad. - Cory House","Make it work, make it right, make it fast. - Kent Beck","Before software can be reusable it first has to be usable. - Ralph Johnson"];return e[Math.floor(Math.random()*e.length)]}static checkListCreator(){return e=>{const t=document.createElement("ul");t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list"),t.classList.add("checkbox-list"),t.setAttribute("data-content-type",o.CheckList);const n=O.checkboxItem(e||"");return t.appendChild(n),t}}static bulletedListCreator(){return e=>{const t=document.createElement("ul");t.setAttribute("data-content-type",o.BulletedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=O.listItem_2(e||"");return t.appendChild(n),t}}static numberedListCreator(){return e=>{const t=document.createElement("ol");t.setAttribute("data-content-type",o.NumberedList),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("list");const n=O.listItem_2(e||"");return t.appendChild(n),t}}static tableCreator(){return e=>{const t=document.createElement("div");t.classList.add("table-shell","ignore-quick-menu");const n=document.createElement("div");n.classList.add("table-controller");const i=document.createElement("div");i.classList.add("table-wrapper");const l=document.createElement("table");l.classList.add("johannes-content-element","swittable","table",r.IncludeBlockToolbarClass,r.AlignToolClass,r.ExtraOptionsClass),l.setAttribute("data-content-type",o.Table),t.appendChild(n),n.appendChild(i),i.appendChild(l);const s=document.createElement("tbody");l.appendChild(s);const a=e?e.split(","):[],c=document.createElement("tr");a.forEach((e=>{const t=document.createElement("td");t.classList.add("focusable"),t.setAttribute("data-placeholder","cell"),t.textContent=e,t.contentEditable="true",c.appendChild(t)})),s.appendChild(c);const d=document.createElement("div");d.classList.add("add-table-row"),d.innerHTML='';const u=document.createElement("div");return u.classList.add("add-table-column"),u.innerHTML='',n.appendChild(d),n.appendChild(u),t}}static placeholderCreator(e,t,n,o=[]){return i=>{const s=document.createElement("div");s.classList.add(l.ContentElement,"swittable","no-selection",r.IncludeBlockToolbarClass,r.ExtraOptionsClass),s.setAttribute("data-content-type",e);const a=document.createElement("div");a.classList.add("content-placeholder",l.ShowMediaInputOnClick,...o);const c=this.createIcon(t),d=document.createElement("span");return d.classList.add("no-selection"),d.innerText=n,s.appendChild(a),a.appendChild(c),a.appendChild(d),s}}static calloutCreator(){return e=>{const t=document.createElement("div");t.classList.add("ignore-quick-menu","callout","johannes-content-element","swittable",r.IncludeBlockToolbarClass,r.ColorToolClass,r.ExtraOptionsClass);const n=document.createElement("div");n.classList.add("callout-background-grey","callout-wrapper");const o=document.createElement("p");return o.setAttribute("data-placeholder","Type something..."),o.contentEditable="true",o.classList.add("callout-text","editable","focusable"),n.appendChild(o),t.appendChild(n),t}}static separatorCreator(){return()=>{const e=document.createElement("div");e.classList.add("johannes-content-element");const t=document.createElement("div");t.classList.add("separator-wrapper");const n=document.createElement("hr");return n.classList.add("separator"),t.appendChild(n),e.appendChild(t),e}}static paragraph(e=null){const t=document.createElement("p");return t.innerText=e||"",t.contentEditable="true",t.setAttribute("data-content-type",o.Paragraph),t.classList.add("johannes-content-element"),t.classList.add("swittable"),t.classList.add("focusable"),t.classList.add("key-trigger"),t.setAttribute("data-placeholder","Write something or type / (slash) to choose a block..."),t}static heading(e,t=null){const n=document.createElement(`h${e}`);return n.innerText=t||"",n.contentEditable="true",n.setAttribute("data-content-type",`h${e}`),n.classList.add("johannes-content-element"),n.classList.add("swittable"),n.classList.add("focusable"),n.classList.add("focus"),n.classList.add("key-trigger"),n.setAttribute("data-placeholder",`Heading ${e}`),n}static checkboxItem(e){const t=H.generateUniqueId();let n=document.createElement("li");n.classList.add("deletable","no-list-style","list-item","list-item-checkable");let o=document.createElement("input");o.id=t,o.setAttribute("type","checkbox");let i=document.createElement("div");return i.textContent=e,i.setAttribute("data-placeholder","To-do"),i.contentEditable="true",i.setAttribute("for",t),i.setAttribute("contentEditable","true"),i.classList.add("focusable"),i.classList.add("editable"),i.classList.add("focus"),n.appendChild(o),n.appendChild(i),n}static listItem_2(e=null){let t=document.createElement("li");t.classList.add("deletable"),t.classList.add("list-item");const n=document.createElement("div");return n.classList.add("focusable"),n.classList.add("editable"),n.classList.add("focus"),n.contentEditable="true",n.classList.add("key-trigger"),n.setAttribute("data-placeholder","Item"),t.appendChild(n),n.innerText=e||"",t}static blockParagraph(e=null){let t=document.createElement("div");t.id=`b-${H.generateUniqueId()}`;let n=O.paragraph(e);return t.appendChild(n),t.classList.add("block"),t.classList.add("deletable"),t}static dragHandleButton(){const e=document.createElement("div");e.classList.add("drag-handler-wrapper",l.EditorOnly);let t=document.createElement("button");return t.innerHTML='',t.classList.add(l.EditorOnly,"drag-handler","button-reset"),t.draggable=!0,e.appendChild(t),e}static createIcon(e){let t=document.createElement("div");return t.classList.add("icon-wrapper"),t.innerHTML=``,t}}!function(e){e.ColorChangeRequest="ColorChangeRequest",e.ShowHideActiveButton="ShowHideActiveButton",e.ResetActiveButtons="ResetActiveButtons",e.CloseElement="HideComponent",e.ShowElement="ShowElement",e.ChangeBlockToolbarLanguage="ChangeBlockToolbarLanguage"}(s||(s={}));class R{id;_canHide;classList=[];props;htmlElement;parent;constructor(e){this.props=e,this.htmlElement=this.init(),this._canHide=!0}get display(){return"block"}setId(e){this.id=e,this.htmlElement.id=e}addCssClass(...e){this.classList.push(...e),this.htmlElement.classList.add(...e)}appendTo(e){this.parent=e,e.htmlElement.appendChild(this.htmlElement)}get isVisible(){let e=this.htmlElement;if("none"===e.style.display||"hidden"===e.style.visibility||!document.contains(e))return!1;for(;e;){const t=window.getComputedStyle(e);if("none"===t.display||"hidden"===t.visibility)return!1;if(!e.parentElement)break;e=e.parentElement}return!0}show(){this.htmlElement.style.display=this.display}hide(){this.htmlElement.style.display="none"}lockHide(){this._canHide=!1}unlockHide(){this._canHide=!0}get canHide(){return this._canHide&&this.isVisible}set canHide(e){this._canHide=e}focus(){this.htmlElement.focus()}changeColor(e){this.htmlElement.style.color=e}removeColor(){this.htmlElement.style.color="inherit"}changeVisibilityToVisible(){this.htmlElement.style.visibility="visible"}changeVisibilityToHidden(){this.htmlElement.style.visibility="hidden"}get doesElementOverflowScreen(){const e=this.htmlElement.style.display,t=this.htmlElement.style.visibility,n=this.htmlElement.style.position;"none"===e&&(this.htmlElement.style.display="block",this.htmlElement.style.visibility="hidden",this.htmlElement.style.position="absolute");const o=this.htmlElement.getBoundingClientRect(),i=window.innerWidth;return"none"===e&&(this.htmlElement.style.display=e,this.htmlElement.style.visibility=t,this.htmlElement.style.position=n),o.right>i||o.left<0}ensureVisible(){this.htmlElement.closest("select, ul")?this.htmlElement.scrollIntoView({behavior:"smooth",block:"nearest",inline:"start"}):console.warn("Attempted to make a non-relevant item visible")}handleCloseElementEvent(e){const t=e.detail;this.id&&this.id==t.targetId&&(e.stopImmediatePropagation(),this.hide())}handleShowElementEvent(e){e.detail.targetId==this.id&&(e.stopImmediatePropagation(),this.show())}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this)),document.addEventListener(s.ShowElement,this.handleShowElementEvent.bind(this))}}class D{static instance=new D;dependencies={};constructor(){}static get Instance(){return D.instance}register(e,t){this.dependencies[e]=t}resolve(e){if(!this.dependencies[e])throw new Error(`Dependency ${e} not found.`);return this.dependencies[e]()}}!function(e){e.Load="load",e.Mouseenter="mouseenter",e.Mouseleave="mouseleave",e.Mousedown="mousedown",e.Mousemove="mousemove",e.Mouseup="mouseup",e.Mouseover="mouseover",e.Keyup="keyup",e.Keydown="keydown",e.Blur="blur",e.SelectStart="selectstart",e.SelectionChange="selectionchange",e.Click="click",e.Focusin="focusin",e.Focusout="focusout",e.DOMContentLoaded="DOMContentLoaded",e.Input="input",e.BblClick="dblclick"}(a||(a={}));class P{static isSelectionInTableCell(){let e=window.getSelection();if(!e?.rangeCount)return!1;let t=e.anchorNode;for(;t;){if(t.nodeType===Node.ELEMENT_NODE&&("TD"===t.tagName||"TH"===t.tagName))return!0;t=t.parentNode}return!1}static getSelectionTextInfo(e){let t,n,o=!1,i=!1;if(""==e.textContent)return o=!0,i=!0,{atStart:o,atEnd:i};const r=window.getSelection();return r&&r.rangeCount>0&&(t=r.getRangeAt(0),n=document.createRange(),n.selectNodeContents(e),n.setEnd(t.startContainer,t.startOffset),o=""===n.toString(),n.selectNodeContents(e),n.setStart(t.endContainer,t.endOffset),i=""===n.toString()),{atStart:o,atEnd:i}}static insertAfter(e,t){t.parentNode&&t.parentNode.insertBefore(e,t.nextSibling)}static hasTextContent(e){return""!==e.textContent?.trim()||e.hasChildNodes()&&Array.from(e.childNodes).some((e=>this.hasTextContent(e)))}static cloneAndInsertAfter(e){const t=e.cloneNode(!0),n=e.parentNode;if(!n)return null;if(n.insertBefore(t,e.nextSibling),t.id){const e=t.id.match(/^(.+?)-/);if(e){const n=e[1];t.id=n+"-"+H.generateUniqueId()}else t.id=H.generateUniqueId()}return t}static findClosestAncestorOfActiveElementByClass(e){const t=document.activeElement;if(!t)return null;let n=t;for(;n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static findClosestAncestorOfSelectionByClass(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;for(n&&n.nodeType===Node.TEXT_NODE&&(n=n.parentNode);n;){if(n.nodeType===Node.ELEMENT_NODE&&n.classList.contains(e))return n;n=n.parentNode}return null}static rearrangeContentAfterSplit(e,t){const n=P.getCursorPosition(e),o=this.splitContentAtCursorSelection(e);if(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(o[1]),document.getSelection()?.deleteFromDocument(),t&&n){this.setCursorPosition(t,n);const e=this.splitContentAtCursorSelection(t);document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e[0]),document.getSelection()?.deleteFromDocument()}}static getCursorPosition(e){const t=window.getSelection();if(!t||!e)return null;const n=t.getRangeAt(0);if(!n.intersectsNode(e))return null;const o=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:e=>NodeFilter.FILTER_ACCEPT});let i=0,r=o.firstChild();for(;r;){if(r===n.startContainer){i+=n.startOffset;break}i+=r.textContent?.length||0,r=o.nextNode()}return i}static setCursorPosition(e,t){const n=window.getSelection();if(!n)return;n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:()=>NodeFilter.FILTER_ACCEPT});let r=i.nextNode(),l=0;for(;r;){const e=r.textContent?.length||0;if(l+e>=t){o.setStart(r,t-l),o.collapse(!0);break}l+=e,r=i.nextNode()}n.addRange(o)}static getContentTypeFromActiveElement(){const e=P.getCurrentActiveBlock(),t=e?.querySelector(".johannes-content-element");return t&&t.getAttribute("data-content-type")||null}static splitContentAtCursorSelection(e){const t=[],n=window.getSelection();if(!n||0===n.rangeCount)return t;const o=n.getRangeAt(0),i=document.createRange();i.selectNodeContents(e),i.setEnd(o.startContainer,o.startOffset);const r=document.createRange();return r.selectNodeContents(e),r.setStart(o.endContainer,o.endOffset),e.lastChild&&r.setEndAfter(e.lastChild),t.push(i),t.push(r),t}static placeCursorAtStartOfEditableElement(e){setTimeout((()=>{if(e.isContentEditable){e.focus();const t=document.createRange();t.selectNodeContents(e),t.collapse(!0);const n=window.getSelection();n?.removeAllRanges(),n?.addRange(t)}else console.warn("The element is not editable.")}))}static placeCursorAtEndOfEditableElement(e){e.isContentEditable?requestAnimationFrame((()=>{e.focus();const t=document.createRange(),n=window.getSelection();t.selectNodeContents(e);let o=e;for(;o.lastChild;)o=o.lastChild;t.setEnd(o,o.nodeType===Node.TEXT_NODE?o.textContent.length:0),t.collapse(!1),n?.removeAllRanges(),n?.addRange(t)})):console.warn("The element is not editable.")}static getCurrentActiveBlock(){let e=document.activeElement;return e?e.closest(".block"):null}static isSelectedTextDescendantOf(e){const t=document.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).startContainer;return n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!!n&&null!==n.closest(e)}static removeFilterText(){let e=null;const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0),o=n.commonAncestorContainer;if(o.nodeType===Node.TEXT_NODE&&o.parentElement?.isContentEditable){let i=o,r=n.startOffset;for(;i&&r>0;){if(e=(i.textContent?.substring(0,r)||"").lastIndexOf("/"),-1!==e){n.setStart(i,e),n.deleteContents();break}r=i.parentNode?.textContent?.lastIndexOf("/")||-1,i=i.parentNode}t.removeAllRanges(),t.addRange(n)}else console.warn("The cursor is not within a contentEditable element or a text node.")}else console.warn("No active selection.");return e}static findClickedElementOrAncestorByDataContentType(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.dataset.contentType===t)return n;let o=n.parentElement;for(;o;){if(o.dataset.contentType===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorById(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.id===t)return n;let o=n.parentElement;for(;o;){if(o.id===t)return o;o=o.parentElement}return null}static findClickedElementOrAncestorByClass(e,t){let n=e.target;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentElement),n.classList.contains(t))return n;let o=n.parentElement;for(;o;){if(o.classList.contains(t))return o;o=o.parentElement}return null}static isEventTargetDescendantOf(e,t){let n=e.target;if(!(e.target instanceof Element))return!1;for(;n&&n!==document.documentElement;){if(n.matches(t))return!0;n=n.parentElement}return!1}static getParentTargetBySelector(e,t){let n=e.target instanceof Element?e.target:e.target instanceof Node?e.target.parentElement:null;if(!n)return null;for(;n&&n!==document.documentElement;){if(n.matches(t))return n;n=n.parentElement}return null}static getParentFromSelection(e){const t=window.getSelection();if(!t||0===t.rangeCount)return null;let n=t.getRangeAt(0).commonAncestorContainer;if(n instanceof Element&&n.matches(e))return n;let o=n instanceof Element?n:n.parentElement;for(;o&&o!==document.documentElement;){if(o.matches(e))return o;o=o.parentElement}return null}static removeClassesWithPrefix(e,t){Array.from(e.classList).filter((e=>e.startsWith(t))).forEach((t=>e.classList.remove(t)))}static isTargetDescendantOfSelector(e,t){let n=null;return e.target instanceof HTMLElement?n=e.target:e.target instanceof Text&&(n=e.target.parentElement),!!n&&null!==n.closest(t)}static querySelectorIncludingSelf(e,t){return e.matches(t)?e:e.querySelector(t)}static sanitizeContentEditable(e){const t=e.innerHTML,n=window.getSelection();if(!n)return;let o=!1,i=0;if(n.rangeCount>0){const r=n.getRangeAt(0);r.endOffset===e.innerText.length&&t.endsWith("
")&&(o=!0,i=r.endOffset)}if(t.endsWith("
")){const t=e.lastChild;t&&"BR"===t.nodeName&&e.removeChild(t)}if(o){const t=new Range,o=this.getTextNodesIn(e);let r=0;for(const e of o){const n=e.length;if(r+n>=i){t.setStart(e,i-r),t.setEnd(e,i-r);break}r+=n}n.removeAllRanges(),n.addRange(t)}}static getTextNodesIn(e){let t=[];if(e.nodeType===Node.TEXT_NODE)t.push(e);else{const n=e.childNodes;for(let e=0;e0?t[n-1]:null}static getNextContentEditable(e){const t=Array.from(document.querySelectorAll('[contenteditable="true"]')),n=t.indexOf(e);return n0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left}}return{charIndex:0,horizontalPos:0}}static restoreCaretPosition2d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos);if(i0){const n=t.getRangeAt(0).getBoundingClientRect();return{charIndex:Array.from(e.textContent||"").slice(0,t.anchorOffset).length,horizontalPos:n.left,verticalPos:n.top}}return{charIndex:0,horizontalPos:0,verticalPos:0}}static restoreCaretPosition3d(e,t){setTimeout((()=>{const n=window.getSelection();if(!n)return;const o=document.createRange(),i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;for(;r;)if(r.nodeValue){for(let e=0;e<=r.nodeValue.length;e++){o.setStart(r,e),o.collapse(!0);const n=o.getBoundingClientRect(),i=Math.abs(n.left-t.horizontalPos),c=Math.abs(n.top-t.verticalPos),d=Math.sqrt(i**2+c**2);if(d0;)o.appendChild(o.nextSibling.firstChild);e.removeChild(o.nextSibling)}P.mergeInlineElements(o)}}}}!function(e){e.floatingToolbarDisplayed="floatingToolbarDisplayed",e.anchorButtonClicked="anchorButtonClicked",e.boldButtonClicked="boldButtonClicked",e.italicButtonClicked="italicButtonClicked",e.underlineButtonClicked="underlineButtonClicked",e.inlineCodeButtonClicked="inlineCodeButtonClicked",e.strikeThroughButtonClicked="strikeThroughButtonClicked",e.hiliteColorButtonClicked="hiliteColorButtonClicked",e.foreColorButtonClicked="foreColorButtonClicked",e.buttonGroupItemClicked="buttonGroupItemClicked",e.focusOnFirstRequested="focusOnFirstRequested",e.pressedEnterOnTitle="pressedEnterOnTitle",e.transformBlockRequested="transformBlockRequested",e.duplicateBlockRequested="duplicateBlockRequested",e.anchor="anchor",e.bold="bold",e.italic="italic",e.underline="underline",e.inlineCode="inlineCode",e.strikeThrough="strikeThrough",e.hiliteColor="hiliteColor",e.foreColor="foreColor",e.textFormatChanged="textFormatChanged",e.emittedCommand="emittedCommand",e.blockTypeChanged="blockTypeChanged",e.blockDeleted="blockDeleted",e.blockCloned="blockCloned",e.tableCellChanged="tableCellChanged"}(c||(c={})),function(e){e.LowImportance="100",e.SlightlyImportant="200",e.Neutral="300",e.ModeratelyImportant="400",e.VeryImportant="500",e.ExtremelyImportant="600"}(d||(d={}));class F extends R{dropdowns;separators;currentSelectionRange;htmlFocusedElementBeforeOpenQuickMenu;constructor(e){super({id:e}),this.dropdowns=[],this.separators=[],this.currentSelectionRange=null,this.htmlFocusedElementBeforeOpenQuickMenu=null}init(){const e=document.createElement("div");e.id=this.props.id,e.style.display="none",e.classList.add("floating-toolbar","select-wrapper","soft-box-shadow"),e.style.zIndex=d.SlightlyImportant;const t=document.createElement("div");return e.appendChild(t),e}get display(){return"flex"}hide(){this.canHide&&(this.anyDropdownVisible()&&this.hideAllDropdownVisible(),this.currentSelectionRange=null,super.hide())}appendDropdown(e){this.dropdowns.push(e),this.htmlElement.appendChild(e.htmlElement)}appendButtonGroup(e){this.htmlElement.appendChild(e.htmlElement)}appendSeparator(e){this.separators.push(e),this.htmlElement.appendChild(e.htmlElement)}appendTextToolbar(e){this.htmlElement.appendChild(e.htmlElement)}anyDropdownVisible(){for(const e of this.dropdowns)if(e.dropdownList.isVisible)return!0;return!1}hideAllDropdownVisible(){for(const e of this.dropdowns)e.dropdownList.canHide&&e.dropdownList.hide();return!1}attachEvents(){this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),document.addEventListener("showInputLinkBoxRequested",(()=>{this.canHide=!1})),document.addEventListener("showInputLinkBoxFinished",(()=>{this.canHide=!0,this.restoreRangeSelection()})),document.addEventListener(c.blockDeleted,(()=>{this.hide()})),document.addEventListener(c.blockTypeChanged,(()=>{this.hide()}))}isSelectionEmpty(){const e=document.getSelection();return!e||0===e.rangeCount||""===e.toString().trim()}restoreRangeSelection(){document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(this.currentSelectionRange)}}!function(e){e.HiliteColorRed="#FDDEDE",e.HiliteColorGreen="#D7F7DC",e.HiliteColorBlue="#D9EDF6",e.HiliteColorYellow="#FAF4D1",e.HiliteColorGrey="#E1E0E0",e.HiliteColorNone="transparent",e.ForeColorRed="#D44C47",e.ForeColorGreen="#448361",e.ForeColorBlue="#337EA9",e.ForeColorYellow="#CB912F",e.ForeColorGrey="#787774",e.ForeColorInitial="initial",e.BackgroundColorRed="#FDDEDE",e.BackgroundColorGreen="#D7F7DC",e.BackgroundColorBlue="#D9EDF6",e.BackgroundColorYellow="#FAF4D1",e.BackgroundColorGrey="#E1E0E0",e.BackgroundColorNone="transparent",e.IconActiveBlue="#2382e2",e.IconDefaultBlack="rgba(55, 53, 47, 0.85)",e.Red="red",e.Tomato="#EB5757",e.OriginalTableColor="#84888d"}(u||(u={})),function(e){e.CalloutBackgroundRed="callout-background-red",e.CalloutBackgroundGreen="callout-background-green",e.CalloutBackgroundBlue="callout-background-blue",e.CalloutBackgroundYellow="callout-background-yellow",e.CalloutBackgroundGrey="callout-background-grey",e.CalloutBackgroundNone="callout-background-none"}(m||(m={})),function(e){e.toggleBold="bold",e.toggleItalic="italic",e.toggleHiliteColor="hiliteColor",e.changeCalloutBackgroundColor="changeCalloutBackgroundColor",e.toggleForeColor="foreColor",e.toggleInlineCode="inlineCode",e.toggleLink="createLink",e.linkReadyToInsert="linkReadyToInsert",e.toggleUnderline="underline",e.toggleStrikeThrough="strikeThrough",e.removeFormat="removeFormat",e.copySelected="copySelected",e.cutSelected="cutSelected",e.past="past",e.transformBlock="transformBlock",e.duplicateBlock="duplicateBlock",e.deleteBlock="deleteBlock",e.createDefaultBlock="createDefaultBlock",e.focusOnNextBlock="focusOnNextBlock",e.focusOnPreviousBlock="focusOnPreviousBlock",e.mergeWithPreviousBlock="mergeWithPreviousBlock",e.mergeWithNextBlock="mergeWithNextBlock",e.focusOnFirstBlock="focusOnFirstBlock",e.deleteBlockAndFocusOnPrevious="deleteBlockAndFocusOnPrevious",e.deleteBlockAndFocusOnNext="deleteBlockAndFocusOnNext",e.JustifyLeft="justifyLeft",e.JustifyCenter="justifyCenter",e.JustifyRight="justifyRight",e.insertNew="insertNew",e.insertTableRowAbove="insertTableRowAbove",e.insertTableRowBelow="insertTableRowBelow",e.insertTableColumnLeft="insertTableColumnLeft",e.insertTableColumnRight="insertTableColumnRight",e.showInsertTableColumnElement="showInsertTableColumnElement",e.showInsertTableRowElement="showInsertTableRowElement",e.hideInsertTableColumnElement="hideInsertTableColumnElement",e.hideInsertTableRowElement="hideInsertTableRowElement",e.toggleCellHiliteColor="toggleCellHiliteColor",e.removeColumn="removeColumn",e.removeRow="removeRow",e.changeTableBorderColor="changeTableBorderColor",e.changeCodeBlockLanguage="changeCodeBlockLanguage"}(h||(h={}));class V{color;constructor(e){this.color=e}}class _{classKey;value;intention;constructor(e,t,n){this.classKey=e,this.value=t,this.intention=n}}class j{classKey;constructor(e){this.classKey=e}}class z{}class Y{}class U{language;blockId;constructor(e,t){this.blockId=e,this.language=t}}class G{static emitCodeBlockLanguageChangedEvent(e,t,n){const o=new CustomEvent(s.ChangeBlockToolbarLanguage,{detail:{targetClass:e,action:new U(t,n)}});document.dispatchEvent(o)}static emitShowElementEvent(e){const t=new CustomEvent(s.ShowElement,{detail:{targetId:e,action:new Y}});document.dispatchEvent(t)}static emitCloseElementEvent(e){const t=new CustomEvent(s.CloseElement,{detail:{targetId:e,action:new z}});document.dispatchEvent(t)}static emitChangeComponentColorEvent(e,t){const n=new CustomEvent(s.ColorChangeRequest,{detail:{targetId:e,action:new V(t)}});document.dispatchEvent(n)}static emitShowHideActiveElementEvent(e,t,n){"hiliteColor"==e&&t==u.HiliteColorNone&&(n="hide"),"foreColor"==e&&t==u.ForeColorInitial&&(n="hide"),"backgroundColor"==e&&t==u.BackgroundColorNone&&(n="hide");const o=new CustomEvent(s.ShowHideActiveButton,{detail:{targetClass:e,action:new _(e,t,n)}});document.dispatchEvent(o)}static emitResetActiveButtonsElementEvent(e){const t=new CustomEvent(s.ResetActiveButtons,{detail:{targetClass:e,action:new j(e)}});document.dispatchEvent(t)}static emitChangeTableBorderColorEvent(e,t){const n=new CustomEvent(c.emittedCommand,{detail:{command:h.changeTableBorderColor,value:t,scope:e}});document.dispatchEvent(n)}}!function(e){e.Link="linkButton",e.Bold="boldButton",e.Italic="italicButton",e.Underline="underlineButton",e.InlineCode="inlineCodeButton",e.Strikethrough="strikethroughButton",e.AlignLeft="alignLeft",e.AlignCenter="alignCenter",e.AlignRight="alignRight"}(p||(p={})),function(e){e.Shift="Shift",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Control="Control",e.Space=" ",e.Delete="Delete"}(A||(A={}));class K extends F{static id="textFloatingToolbar";static instance;textOperationsService;initialRect=null;lockedHide=!1;debounceTimer=null;constructor(e){if(K.instance)throw new Error("Use TextContextFloatingToolbar.getInstance() to get instance.");super(K.id),this.htmlElement.style.zIndex=d.VeryImportant,this.textOperationsService=e,this.attachEvents()}static getInstance(){const e=D.Instance.resolve("ITextOperationsService");return K.instance||(K.instance=new K(e)),K.instance}processSelectionChangeEffects(){setTimeout((()=>{G.emitResetActiveButtonsElementEvent("hiliteColor"),G.emitResetActiveButtonsElementEvent("foreColor");const e=this.textOperationsService.queryCommandState("createLink"),t=this.textOperationsService.queryCommandState("bold"),n=this.textOperationsService.queryCommandState("italic"),o=this.textOperationsService.queryCommandState("underline"),i=this.textOperationsService.queryCommandState("inlineCode"),r=this.textOperationsService.queryCommandState("strikeThrough"),l={};l[u.HiliteColorRed]=this.textOperationsService.queryHiliteColor(u.HiliteColorRed),l[u.HiliteColorGreen]=this.textOperationsService.queryHiliteColor(u.HiliteColorGreen),l[u.HiliteColorBlue]=this.textOperationsService.queryHiliteColor(u.HiliteColorBlue),l[u.HiliteColorYellow]=this.textOperationsService.queryHiliteColor(u.HiliteColorYellow),l[u.HiliteColorGrey]=this.textOperationsService.queryHiliteColor(u.HiliteColorGrey);const s={};s[u.ForeColorRed]=this.textOperationsService.queryForeColor(u.ForeColorRed),s[u.ForeColorGreen]=this.textOperationsService.queryForeColor(u.ForeColorGreen),s[u.ForeColorBlue]=this.textOperationsService.queryForeColor(u.ForeColorBlue),s[u.ForeColorYellow]=this.textOperationsService.queryForeColor(u.ForeColorYellow),s[u.ForeColorGrey]=this.textOperationsService.queryForeColor(u.ForeColorGrey),Object.entries(l).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")})),Object.entries(s).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("foreColor",e,"show")})),this.emitChangeComponentColorEvent(e,p.Link),this.emitChangeComponentColorEvent(t,p.Bold),this.emitChangeComponentColorEvent(n,p.Italic),this.emitChangeComponentColorEvent(i,p.InlineCode),this.emitChangeComponentColorEvent(o,p.Underline),this.emitChangeComponentColorEvent(r,p.Strikethrough)}),20)}emitChangeComponentColorEvent(e,t){e?G.emitChangeComponentColorEvent(t,u.IconActiveBlue):G.emitChangeComponentColorEvent(t,u.IconDefaultBlack)}logSelectionChange(e){const t=document.getSelection();t&&!t.isCollapsed&&(this.processSelectionChangeEffects(),console.log("passou no log selection"))}attachEvents(){let e,t=!1;this.htmlElement.addEventListener(a.Mouseup,(e=>{e.preventDefault()})),document.addEventListener(a.Mouseup,this.logSelectionChange.bind(this)),document.addEventListener(a.BblClick,this.logSelectionChange.bind(this)),document.addEventListener(a.SelectionChange,this.logSelectionChange.bind(this)),document.addEventListener(a.Keydown,(e=>{e.shiftKey&&(t=!0)})),document.addEventListener(a.Keyup,(e=>{e.key===A.Shift&&(t=!1,this.showHide(e,t))})),document.addEventListener(a.Mousedown,(()=>{t=!0})),document.addEventListener(a.Mouseup,(n=>{t=!1,this.showHide(n,t),clearTimeout(e),e=setTimeout((()=>{t=!1,this.showHide(n,t)}),100)})),document.addEventListener(a.SelectionChange,(e=>{this.showHide(e,t)})),document.addEventListener(a.Keydown,(e=>{setTimeout((()=>{this.canHide&&e.key===A.Escape&&!this.lockedHide&&(this.anyDropdownVisible()?this.hideAllDropdownVisible():this.hide())}),10)})),super.attachEvents()}shouldUpdatePosition(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0).getBoundingClientRect();return!this.initialRect||(Math.abs(t.left-this.initialRect.left)>10||Math.abs(t.top-this.initialRect.top)>10)}showHide(e,t){const n=this.hasSelection();if(!n){if(this.lockedHide)return;return this.hide(),void(this.initialRect=null)}if(n&&!t)if(this.isVisible){if(this.shouldUpdatePosition()&&(P.isSelectedTextDescendantOf(".gist")||P.isSelectedTextDescendantOf(".gist")))return}else{if(P.isSelectedTextDescendantOf(".ignore-text-floating-toolbar")||P.isSelectedTextDescendantOf(".gist"))return;this.show()}}hasSelection(){const e=window.getSelection();return!!(e&&e.rangeCount>0&&""!==e.toString().trim())}changeToolbarPositionToBeClosedToSelection(){const e=window.getSelection();if(!e||0===e.rangeCount)return void console.error("No selection found");this.currentSelectionRange=e.getRangeAt(0);const t=this.currentSelectionRange.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20);const a=this.htmlElement.offsetHeight;let c=i+window.scrollY-a-10;c<0&&(c=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${c}px`}show(){const e=window.getSelection();e&&0!==e.rangeCount?P.findClosestAncestorOfActiveElementByClass("title")||(this.changeToolbarPositionToBeClosedToSelection(),this.hideTurnIntoDropdownIfInCell()):console.error("No selection found")}hideTurnIntoDropdownIfInCell(){const e=P.isSelectionInTableCell();this.dropdowns.forEach((t=>{"turnIntoMenu"==t.id&&(t.htmlElement.style.display=e?"none":this.display)})),this.separators.forEach((t=>{"turnIntoSeparator"==t.id&&(t.htmlElement.style.display=e?"none":this.display)}))}updatePosition(){const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0).getBoundingClientRect();this.setPosition(t)}}setPosition(e){const t=this.htmlElement.offsetWidth;let n=e.left+window.scrollX-50;n+t>window.innerWidth&&(n=window.innerWidth-t-20);const o=this.htmlElement.offsetHeight;let i=e.top+window.scrollY-o-10;i<0&&(i=e.bottom+window.scrollY+10),this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${i}px`}hide(){this.canHide&&(this.currentSelectionRange=null,super.hide())}lockHide(){this.lockedHide=!0}unlockHide(){this.lockedHide=!1}}class Z extends R{parentWrapper;constructor(){super({})}init(){const e=document.createElement("input");return e.id="linkBoxInput",e.type="url",e.placeholder="Paste or type a link...",e.style.position="relative",e}setParentWrapper(e){this.parentWrapper=e}}class W extends R{inputLinkBox;highlights=[];button;textContextFloatingToolbar;constructor(){const e=new Z,t=document.createElement("button");super({inputLinkBox:e,button:t}),this.id="linkBox",this.inputLinkBox=e,this.button=t,e.setParentWrapper(this),this.textContextFloatingToolbar=K.getInstance(),this.attachEvent()}init(){const e=document.createElement("div");e.id="linkBox",e.style.display="none",e.classList.add("dependent-box","soft-box-shadow"),e.style.position="absolute";const t=document.createElement("div");t.classList.add("header"),t.innerText="Link";const n=document.createElement("div");return n.appendChild(this.props.inputLinkBox.htmlElement),n.classList.add("link-box-shell"),this.props.button.classList.add("blue-button"),this.props.button.innerHTML="Embed",n.appendChild(this.props.button),e.appendChild(t),e.appendChild(n),e}attachEvent(){document.addEventListener(a.Keydown,(e=>{this.canHide&&"Escape"===e.key&&(e.stopImmediatePropagation(),this.hide())}),!0),document.addEventListener(a.Keydown,(function(e){e.key===A.Control&&document.body.classList.add("ctrl-active")})),document.addEventListener(a.Keyup,(function(e){e.key===A.Control&&document.body.classList.remove("ctrl-active")})),this.inputLinkBox.htmlElement.addEventListener(a.Keydown,(e=>{e.key==A.Enter&&this.insertLink(e)})),document.addEventListener(a.Click,(e=>{if(e.ctrlKey){const t=e.target;if("A"===t.tagName&&t.getAttribute("href")){const e=t.getAttribute("href");return void window.open(e,"_blank")}}!this.canHide||e.target.closest("#linkBox")||e.target.closest("#textFloatingToolbar")||this.hide()})),this.button.addEventListener(a.Click,this.insertLink.bind(this)),super.attachUIEvent()}handleShowElementEvent(e){const t=e.detail;t.targetId!=this.id||this.isVisible?t.targetId==this.id&&this.isVisible&&(e.stopImmediatePropagation(),this.hide()):(e.stopImmediatePropagation(),this.show())}insertLink(e){e.preventDefault(),e.stopImmediatePropagation();const t=this.inputLinkBox.htmlElement.value,n=t.startsWith("http://")||t.startsWith("https://")?t:`https://${t}`;if(H.isValidUrl(n))this.hide(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.linkReadyToInsert,value:n}}));else{const e=this.inputLinkBox.htmlElement;e.style.backgroundColor="rgb(253, 222, 222)",e.classList.add("shake-animation"),setTimeout((()=>{e.classList.remove("shake-animation")}),1e3)}}show(){this.inputLinkBox.htmlElement.style.backgroundColor="white",this.textContextFloatingToolbar.lockHide();const e=document.getSelection()?.getRangeAt(0);e&&(this.positionLinkComponentBelowSelection(e),this.highlightSelectedText(e),super.show())}positionLinkComponentBelowSelection(e){const t=e.getClientRects();if(0===t.length)return void console.error("No rects found");const n=t[0],o=n.left,i=n.top,r=n.bottom;this.htmlElement.style.display="flex";const l=this.htmlElement.offsetWidth;let s=o+window.scrollX-50;s+l>window.innerWidth&&(s=window.innerWidth-l-20),this.htmlElement.offsetHeight;let a=i+window.scrollY+40;a<0&&(a=r+window.scrollY+10),this.htmlElement.style.left=`${s}px`,this.htmlElement.style.top=`${a}px`}hide(){this.textContextFloatingToolbar.unlockHide(),super.hide(),this.removeHighlights(),this.inputLinkBox.htmlElement.value="";const e=this.textContextFloatingToolbar.currentSelectionRange;e&&(document.getSelection()?.removeAllRanges(),document.getSelection()?.addRange(e))}highlightSelectedText(e){const t=e.getClientRects();for(let e=0;e{document.body.removeChild(e)})),this.highlights=[]}}class $ extends R{elementFactoryService;static editorId="johannesEditor";static instance;memento;title;content;addBlock;textFloatingToolbar;quickMenu;tableContextToolbar;mediaInputter;inputLinkBoxWrapper;constructor(e,t,n,o,i,r,l,s,a,c,d){if(super({elementFactoryService:e,blockOperationsService:t,title:o,content:i,addBlock:r,floatingToolbar:l,quickMenu:s,tableToolbar:a,mediaInputter:c,inputLinkBoxWrapper:d}),$.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.inputLinkBoxWrapper=d,this.elementFactoryService=e,this.memento=n,this.addBlock=r,this.textFloatingToolbar=l,this.quickMenu=s,this.tableContextToolbar=a,this.mediaInputter=c,this.attachEvents(),$.instance=this,this.memento.saveState()}init(){const e=document.getElementById($.editorId)||document.createElement("div");e.classList.add("johannes-editor");const t=document.createElement("div");return t.classList.add("content-wrapper"),window.editorConfig,t.appendChild(this.props.title.htmlElement),t.appendChild(this.props.content.htmlElement),e.appendChild(t),window.editorConfig,e.appendChild(this.props.addBlock.htmlElement),window.editorConfig,e.appendChild(this.props.floatingToolbar.htmlElement),window.editorConfig,e.appendChild(this.props.quickMenu.htmlElement),e.appendChild(this.props.tableToolbar.htmlElement),e.appendChild(this.props.mediaInputter.htmlElement),e.appendChild(this.props.inputLinkBoxWrapper.htmlElement),e}static getInstance(e,t,n,o,i,r,l){const s=D.Instance.resolve("IElementFactoryService"),a=D.Instance.resolve("IBlockOperationsService"),c=D.Instance.resolve("IMemento"),d=new W;return $.instance||($.instance=new $(s,a,c,e,t,n,o,i,r,l,d)),$.instance}attachEvents(){const e=document.getElementById($.editorId);if(e?.addEventListener("mouseover",(e=>{const t=e.target;if(t instanceof Node){let e=t;if(e.nodeType===Node.TEXT_NODE&&(e=e.parentElement),e instanceof Element){const t=e.closest(".block");t&&this.appendDragHandler(t)}else console.error("Event target is not an HTMLElement and cannot handle HTMLElement specific methods:",e)}else console.error("Event target is not a Node:",t)})),"loading"===document.readyState)document.addEventListener("DOMContentLoaded",(()=>{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}));else{const e=document.querySelector("#johannesEditor > .content .block p");e&&e.focus()}document.addEventListener("paste",(function(e){if("true"===e.target.getAttribute("contenteditable")){e.preventDefault();const t=e.clipboardData;if(t){const e=t.getData("text/plain");$.insertTextAtCursor(e)}}}),!0),this.attachDragHandler()}static insertTextAtCursor(e){const t=window.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents();const o=document.createTextNode(e);n.insertNode(o),n.setStartAfter(o),n.setEndAfter(o),t.removeAllRanges(),t.addRange(n)}}appendDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");let n=t?.querySelector(".drag-handler");!n&&t&&(n=this.elementFactoryService.create(O.ELEMENT_TYPES.DRAG_HANDLE_BUTTON),t.prepend(n))}removeDragHandler(e){if(e.nodeType===Node.TEXT_NODE&&(e=e.parentNode),!(e instanceof HTMLElement))return void console.error("Provided element is not an HTMLElement:",e);const t=e.closest(".block");if(t){const e=t.querySelector(".drag-handler");e?.remove()}}extractContent(){throw new Error("Not implemented Exception")}attachDragHandler(){let e=null,t=document.createElement("div");t.classList.add("drop-line"),t.style.height="2px",t.style.display="none",this.htmlElement.addEventListener("dragstart",(t=>{t.target?.classList?.contains("drag-handler")&&(e=t.target?.closest(".block"),e.setAttribute("draggable","true"),setTimeout((()=>{e.style.opacity="0.5"}),0))})),this.htmlElement.addEventListener("dragend",(()=>{setTimeout((()=>{e&&(e.style.opacity="",e.removeAttribute("draggable"),e=null),t.remove()}),0)})),this.htmlElement.addEventListener("dragover",(n=>{n.preventDefault();let o=n.target?.closest(".block");if(o&&o!==e){let e=o.getBoundingClientRect(),i=e.y+e.height/2;n.clientY>i?o.nextElementSibling!==t&&o.insertAdjacentElement("afterend",t):o.previousElementSibling!==t&&o.insertAdjacentElement("beforebegin",t)}t.style.display="block"})),this.htmlElement.addEventListener("drop",(n=>{n.preventDefault(),e&&t&&t.parentElement&&(t.parentElement.insertBefore(e,t),t.remove())}))}}class Q extends R{blockOperationsService;icon;constructor(e,t){super({icon:t}),this.blockOperationsService=e,this.icon=t,this.attachEvents()}init(){const e=document.createElement("button");return e.title="Add a new block",e.classList.add("add-block","block-operation","pointer"),e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.blockOperationsService.execCommand(h.createDefaultBlock,!1)}))}static create(e){const t=D.Instance.resolve("IBlockOperationsService");return new Q(t,e)}}class X extends R{button;constructor(e){super({button:e}),this.button=e}init(){const e=document.createElement("div");return e.classList.add("add-block-wrapper"),e.appendChild(this.props.button.htmlElement),e}static create(e){return new X(e)}}class J{static medium="1rem";static large="1.25rem"}class ee extends R{useElement;constructor(e,t){super({iconId:e,size:t}),this.useElement=this.htmlElement.querySelector("use")}init(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.style.color="red !important";let t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${this.props.iconId}`),t.style.color="red !important",e.appendChild(t),e.setAttribute("width",this.props.size),e.setAttribute("height",this.props.size),e.setAttribute("fill","currentColor"),e}clone(){return new ee(this.props.iconId,this.props.sizes)}setUseTo(e){this.useElement.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e}`)}static create(e,t){return new ee(e,t)}}class te{static build(){return X.create(Q.create(ee.create(i.Plus,J.medium)))}}class ne extends R{id;dropdownButton;dropdownList;constructor(e,t,n){super({id:e}),this.id=e,this.dropdownButton=t,this.dropdownList=n,t.appendTo(this),n.appendTo(this)}init(){const e=document.createElement("div");return e.id=this.props.id,e.classList.add("select-wrapper"),e}get display(){return"block"}static create(e,t,n,o=[]){const i=new ne(e+H.generateUniqueId(),t,n);return i.addCssClass(...o),i}}class oe{head=null;tail=null;length=0;getFirst(){return this.head}getLast(){return this.tail}*[Symbol.iterator](){let e=this.head;if(e)do{yield e,e=e.nextNode}while(e&&e!==this.head)}forEach(e){let t=0;for(let n of this)e(n.value,t,this),t++}any(e){let t=this.head;for(;t;){if(e(t.value))return!0;if(t=t.nextNode,t===this.head)break}return!1}findFirst(e){if(!this.head)return null;let t=this.head;do{if(e(t.value))return t;t=t.nextNode}while(t&&t!==this.head);return null}findLast(e){if(!this.tail)return null;let t=this.tail;do{if(e(t.value))return t;t=t.previousNode}while(t&&t!==this.tail);return null}find(e){let t=this.head;for(;t;){if(t.value==e)return t;if(t=t.nextNode,t===this.head)break}return null}}class ie{parentList;previousNode;nextNode;value;constructor(e,t){this.previousNode=null,this.nextNode=null,this.value=e,this.parentList=t}setNext(e){this.nextNode=e}setPrevious(e){this.previousNode=e}getNextSatisfying(e){let t=this.nextNode;const n=this;for(;t;){if(e(t.value))return t;if(t=t.nextNode,t===n)break}return null}getPreviousSatisfying(e){let t=this.previousNode;const n=this;for(;t&&t!==n;){if(e(t.value))return t;if(t=t.previousNode,t===this)break}return null}}class re extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(t.setPrevious(this.tail),t.setNext(this.head),this.tail.setNext(t),this.head.setPrevious(t),this.tail=t):(this.head=t,this.tail=t,this.head.setNext(this.tail),this.head.setPrevious(this.tail)),this.length++}}class le extends R{id;command;value;activeIcon;leftIcon;title;onFocusFunctionList=[];onLoseFocusFunctionList=[];parentDropdownMenuList;constructor(e,t,n,o,i,r,l=null){const s=["list-item","option","option-hover","block-operation","no-list-style","no-selection"],a=new ee("icon-material-small-check",J.medium);a.htmlElement.style.visibility="hidden",o&&i&&(i.style.color=o),super({id:e,classList:s,leftIcon:i,title:r,icon:a,shortcut:l}),this.id=e,this.classList=s,this.leftIcon=i,this.command=n,this.value=o,this.title=r,this.parentDropdownMenuList=t,this.activeIcon=a,this.attachEvents()}addClass(e){this.classList.push(e),this.htmlElement.classList.add(e)}attachOnFocus(e,...t){this.onFocusFunctionList.push((()=>e(...t)))}attachOnLoseFocus(e,...t){this.onLoseFocusFunctionList.push((()=>e(...t)))}get display(){return"flex"}focus(){this.htmlElement.classList.add("option-focused"),this.onFocusFunctionList.forEach((e=>e()))}removeFocus(){this.htmlElement.classList.remove("option-focused"),this.onLoseFocusFunctionList.forEach((e=>e()))}init(){const e=document.createElement("li");e.id=this.props.id;const t=this.props.classList;e.classList.add("pointer",...t),e.tabIndex=2,e.style.color="#37352F";const n=document.createElement("div");n.classList.add("text-option"),this.props.leftIcon&&n.appendChild(this.props.leftIcon);const o=document.createElement("span");if(o.innerText=this.props.title,n.appendChild(o),e.appendChild(n),e.appendChild(this.props.icon.htmlElement),this.props.shortcut){const t=document.createElement("span");t.innerText=this.props.shortcut,t.style.color="rgba(55, 53, 47, 0.5)",e.appendChild(t)}return e}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:this.command,value:this.value,block:P.getParentFromSelection(".block")||P.getParentTargetBySelector(e,".block")}});document.dispatchEvent(t)}attachEvents(){this.attachUIEvent(),this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousedown,(e=>{e.preventDefault()})),this.htmlElement.addEventListener(a.Mousemove,(async()=>{const e=this.parentDropdownMenuList.dropdownItems.find(this);this.parentDropdownMenuList.switchVisualFocus(e)})),this.htmlElement.addEventListener(a.Click,(e=>{e.preventDefault(),e.stopImmediatePropagation(),this.emitCommandEvent(e)})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&t.targetClass.includes("code-block-language-menu")){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.value==e.language?this.activeIcon?.changeVisibilityToVisible():this.activeIcon?.changeVisibilityToHidden())}}attachUIEvent(){document.addEventListener(s.ShowHideActiveButton,this.handleShowHideActiveButtonEvent.bind(this)),document.addEventListener(s.ResetActiveButtons,this.handleResetActiveButtonsEvent.bind(this))}handleShowHideActiveButtonEvent(e){const t=e.detail;if(this.classList?.includes(t.targetClass)){const e=t.action,n=e.value;this.value?.toLowerCase()==n.toLowerCase()&&"show"==e.intention&&this.activeIcon?.changeVisibilityToVisible()}}handleResetActiveButtonsEvent(e){const t=e.detail;this.classList?.includes(t.targetClass)&&this.activeIcon?.changeVisibilityToHidden()}}class se extends R{parentDropdownParentButton;dropdownItems;currentFocusedMenuItem;filter="";constructor(e){super({id:e}),this.id=e,this.dropdownItems=new re,this.currentFocusedMenuItem=null,this.attachEvents()}get display(){return"flex"}init(){const e=document.createElement("ul");return e.id=this.props.id,e.setAttribute("name","block-type"),e.style.display="none",e.classList.add("soft-box-shadow","dependent-box","checkable-items"),e.style.position="absolute",e.style.maxHeight="25vmax",e.style.overflowY="auto",e.style.zIndex=d.ExtremelyImportant,e}append(e){this.dropdownItems.append(e),this.htmlElement.appendChild(e.htmlElement)}setParentDropdownMenuButton(e){this.parentDropdownParentButton=e}attachEvents(){document.addEventListener(a.Keydown,(e=>{this.isVisible&&this.currentFocusedMenuItem&&"Enter"===e.key&&(e.stopImmediatePropagation(),e.preventDefault(),this.currentFocusedMenuItem.value.emitCommandEvent(e))}),!0),document.addEventListener(a.Click,(e=>{this.clickedOutsideTheDropdownWhileDropdownIsVisible(e)&&this.hide()})),document.addEventListener(a.Keydown,(e=>{this.keyPressedOutsideTheDropdownWhileDropdownIsVisible(e)&&("ArrowDown"==e.key&&(e.preventDefault(),this.focusNextVisibleItem()),"ArrowUp"==e.key&&(e.preventDefault(),this.focusPreviousVisibleItem()),e.key!=A.Escape||this.htmlElement.closest(".floating-toolbar")||(e.stopImmediatePropagation(),e.preventDefault(),this.hide()))})),document.addEventListener(a.Keydown,this.handlerKeyDownEvent.bind(this)),document.addEventListener(c.blockCloned,(()=>{this.hide()})),this.attachUIEvent()}handlerKeyDownEvent(e){this.isVisible&&/^[a-zA-Z]$/.test(e.key)?(this.filter+=e.key,this.applyFilter()):this.isVisible&&e.key===A.Backspace&&(this.filter=this.filter.slice(0,-1),this.applyFilter())}applyFilter(){this.dropdownItems.forEach((e=>{""==e.value||e.value?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())||e.title?.toLocaleLowerCase().includes(this.filter.toLocaleLowerCase())?e.show():e.hide()}))}show(){this.filter="",this.htmlElement.style.left="0",this.htmlElement.style.right="auto",this.doesElementOverflowScreen&&(this.htmlElement.style.left="auto",this.htmlElement.style.right="0"),this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-up"),this.applyFilter(),super.show()}hide(){this.parentDropdownParentButton?.svgIcon?.setUseTo("icon-wordpress-chevron-down"),this.currentFocusedMenuItem?.value.removeFocus(),this.currentFocusedMenuItem=null,super.hide()}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus())}focusNextVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getNextSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}focusPreviousVisibleItem(){let e;e=this.currentFocusedMenuItem?this.currentFocusedMenuItem.getPreviousSatisfying((e=>e instanceof le&&e.isVisible)):this.dropdownItems.findFirst((e=>e instanceof le)),this.switchVisualFocus(e),e?.value.ensureVisible()}clickedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)&&!e.target.closest(`#${this.parentDropdownParentButton?.htmlElement.id}`)}keyPressedOutsideTheDropdownWhileDropdownIsVisible(e){return this.canHide&&!e.target.closest(`#${this.htmlElement.id}`)}static create(e,t=[]){const n=new se(e+H.generateUniqueId());return n.addCssClass(...t),n}}class ae extends R{id;constructor(e){super({id:e}),this.id=e}init(){const e=document.createElement("div");return e.id=this.props.id,e.style.height="24px",e.style.width="1px",e.style.borderRight="1px solid #d0d0d0",e.style.margin="auto 6px",e}}class ce extends R{constructor(){super({})}init(){const e=document.createElement("div");return e.classList.add("item"),e}}class de extends R{command;showUI;icon;constructor(e,t,n){super({title:t,icon:n}),this.command=e,this.showUI=e==h.toggleLink,this.icon=n,this.attachEvents()}init(){const e=document.createElement("button");return e.classList.add("entry","button-reset","text-formatting-operation","option-hover"),e.title=this.props.title,e.tabIndex=1,e.appendChild(this.props.icon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener(a.Click,(async e=>{const t=P.findClickedElementOrAncestorByClass(e,"block");document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:this.command,showUI:this.showUI,block:t}}))})),document.addEventListener(s.ColorChangeRequest,(e=>{const t=e.detail;this.id==t.targetId&&this.icon.changeColor(t.action.color)}))}static create(e,t,n){return new de(e,t,n)}}class ue extends R{constructor(e){super({color:e})}init(){const e=document.createElement("div");return e.style.width="1.25rem",e.style.height="1.25rem",e.style.borderRadius="50%",e.style.backgroundColor=this.props.color,e.style.border="1px solid #d0d0d0",e.style.boxSizing="border-box",e}}class me extends R{parentDropdownMenuList;constructor(e,t){super({title:t}),this.parentDropdownMenuList=e}title="";activeIcon;value="";changeActiveIconToVisible(){}getLeftIconBackgroundColor(){return null}resetActiveIcon(){}attachOnLoseFocus(e){throw new Error("Method not implemented.")}attachOnFocus(e){throw new Error("Method not implemented.")}emitCommandEvent(){throw new Error("Method not implemented.")}removeFocus(){throw new Error("Method not implemented.")}focus(){throw new Error("Method not implemented.")}init(){const e=document.createElement("li");e.classList.add("no-list-style");const t=document.createElement("h3");return t.innerText=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}}!function(e){e.BackgroundOptionRed="BackgroundOptionRed",e.BackgroundOptionGreen="BackgroundOptionRed",e.BackgroundOptionBlue="BackgroundOptionRed",e.BackgroundOptionYellow="BackgroundOptionRed",e.BackgroundOptionGrey="BackgroundOptionRed",e.BackgroundOptionNone="BackgroundOptionRed"}(C||(C={}));class he{static alignTool(){const e=new ce;return de.create(h.JustifyLeft,"Left",ee.create(i.JustifyStart,J.large)).appendTo(e),de.create(h.JustifyCenter,"Center",ee.create(i.JustifyCenter,J.large)).appendTo(e),de.create(h.JustifyRight,"Right",ee.create(i.JustifyEnd,J.large)).appendTo(e),e}static colorTool(){const e=new se("colorInteractiveOptionSelect"+H.generateUniqueId()),t=new Ae("colorInteractiveButton"+H.generateUniqueId(),new ue("#FAF4D1").htmlElement,e);t.addCssClass("color-interactive-button");const n=new ne("colorInteractionOptionsMenu"+H.generateUniqueId(),t,e);e.append(new me(e,"Background"));const o=new le(C.BackgroundOptionRed+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundRed,new ue(u.HiliteColorRed).htmlElement,"Red"),i=new le(C.BackgroundOptionGreen+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGreen,new ue(u.HiliteColorGreen).htmlElement,"Green"),r=new le(C.BackgroundOptionBlue+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue"),l=new le(C.BackgroundOptionYellow+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow"),s=new le(C.BackgroundOptionGrey+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey"),a=new le(C.BackgroundOptionNone+H.generateUniqueId(),e,h.changeCalloutBackgroundColor,m.CalloutBackgroundNone,new ue(u.HiliteColorNone).htmlElement,"None");return e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static languageSelectionTool(){const e=se.create("languageSelectionInteractiveOptionSelect"),t=Ae.create("languageSelectionInteractiveButton","Plain Text",e,!0,["code-block-language-menu","color-interactive-button"]),n=ne.create("languageSelectionInteractionOptionsMenu",t,e);return e.append(new me(e,"Language")),Object.entries(pe.languageMap).sort(((e,t)=>e[1].localeCompare(t[1]))).forEach((([t,n])=>{const o=new le("languageSelectionItem-"+H.generateUniqueId(),e,h.changeCodeBlockLanguage,t,null,n);"plaintext"==o.value&&o.activeIcon?.changeVisibilityToVisible(),e.append(o)})),n}static extraOptions(){const e=new ee("icon-material-more",J.large),t=se.create("moreInteractiveOptionSelect",["media-more-option-select"]),n=Ae.create("moreInteractiveOptionButton",e.htmlElement,t,!1,["moreMediaOptionsButton"]),o=ne.create("moreInteractiveOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("duplicateOption"+H.generateUniqueId(),t,h.duplicateBlock,null,ee.create(i.Duplicate,J.large).htmlElement,"Clone","Ctrl+D"));const r=new le("deleteOption"+H.generateUniqueId(),t,h.deleteBlock,null,ee.create(i.Trash,J.large).htmlElement,"Delete","Shift+Del");return r.addCssClass("danger-option"),t.append(r),o}}!function(e){e.TD="td",e.TABLE="table"}(g||(g={}));class pe{static instance;static languageMap={ada:"Ada",apache:"Apache Config",applescript:"AppleScript",arduino:"Arduino",asciidoc:"AsciiDoc",bash:"Bash",basic:"BASIC",c:"C",csharp:"C#",cpp:"C++",css:"CSS",coffeescript:"CoffeeScript",dart:"Dart",go:"Go",html:"HTML",java:"Java",javascript:"JavaScript",json:"JSON",markdown:"Markdown",perl:"Perl",php:"PHP",plaintext:"Plain Text",python:"Python",ruby:"Ruby",scss:"SCSS",shell:"Shell",sql:"SQL",typescript:"TypeScript",xml:"XML",yaml:"YAML"};constructor(){if(pe.instance)throw new Error("Use BlockToolbox.getInstance() to get instance.");this.attachEvents()}static getInstance(){return pe.instance||(pe.instance=new pe),pe.instance}listen(){console.log("Listening block toolboxes...")}attachEvents(){document.addEventListener(a.Mouseover,this.insertToolboxIntoBlockOnce.bind(this)),document.addEventListener(a.Focusin,this.handleTableBehaviorFocusIn.bind(this)),document.addEventListener(a.Focusout,this.handleTableBehaviorFocusOut.bind(this)),document.addEventListener(a.Click,this.handleClickEvent.bind(this))}handleClickEvent(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}handleTableBehaviorFocusIn(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!0)}handleTableBehaviorFocusOut(e){const t=e.target;t.closest(g.TABLE)&&this.toolboxVisibilityController(t,!1)}toolboxVisibilityController(e,t){const n=e.closest(".block");if(n){const e=n.querySelector(".block-toolbar");e&&(t?e.classList.add("hidden"):e.classList.remove("hidden"))}}insertToolboxIntoBlockOnce(e){const t=e.target.closest(`.${r.IncludeBlockToolbarClass}`);if(!t)return;const n=t.closest(".block");if(n&&null===n.querySelector(".block-toolbar-wrapper")){const e=t.classList.contains(r.LanguageSelectionToolClass),o=t.classList.contains(r.AlignToolClass),i=t.classList.contains(r.ColorToolClass),l=t.classList.contains(r.ExtraOptionsClass),s=pe.createToolbox(e,o,i,l);n&&(n.appendChild(s),n.addEventListener(a.Mouseenter,(e=>this.resetToolbox(e,n))),n.addEventListener(a.Mousemove,(e=>{const t=s.firstChild?.id,o=document.getElementById(t);o&&(n.contains(e.target)?o.style.display="flex":this.hideBlockToolbox(s))})),n.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s))),document.addEventListener(a.Click,(e=>{P.isTargetDescendantOfSelector(e,`#${n.id}`)||this.hideBlockToolbox(s)})),n.querySelectorAll("iframe").forEach((e=>{e.addEventListener(a.Mouseenter,(()=>{const e=s.firstChild?.id,t=document.getElementById(e);t&&(t.style.display="flex",this.changeToolbarColor(n))})),e.addEventListener(a.Mouseleave,(()=>this.hideBlockToolbox(s)))})))}}changeToolbarColor(e){const t=e.querySelector(".color-interactive-button div"),n=e.querySelector(".callout-wrapper");if(t&&n){var o=window.getComputedStyle(n);t.style.backgroundColor=o.backgroundColor,t.style.borderColor=o.borderColor,t.style.borderColor="#ccc"}}hideBlockToolbox(e){const t=e.firstChild?.id,n=document.getElementById(t);n&&(pe.isAnyDependentBoxVisible(n)||(n.style.display="none"))}static isAnyDependentBoxVisible(e){const t=e.querySelectorAll(".dependent-box");for(const e of t){const t=window.getComputedStyle(e);if("none"!==t.display&&"hidden"!==t.visibility)return!0}return!1}resetToolbox(e,t){const n=t.querySelector(".block-toolbar");if(!n)return void console.log("block-toolbar not found");const o=n.querySelector(".media-more-option-select");o&&(o.style.display="none");const i=n.querySelector(".color-interactive-select");i&&(i.style.display="none"),this.changeToolbarColor(t)}static createToolbox(e=!1,t=!1,n=!1,o=!1){const i=document.createElement("div");i.classList.add("block-toolbar-wrapper","exclude-from-clone",l.EditorOnly),i.style.position="relative";const r=document.createElement("div");return r.classList.add("block-toolbar","soft-box-shadow"),r.id=`btb-${H.generateUniqueId()}`,i.appendChild(r),e&&r.appendChild(he.languageSelectionTool().htmlElement),t&&r.appendChild(he.alignTool().htmlElement),n&&r.appendChild(he.colorTool().htmlElement),o&&r.appendChild(he.extraOptions().htmlElement),i}}class Ae extends R{dropdownList;svgIcon;constructor(e,t,n,o=!0){const i=new ee("icon-wordpress-chevron-down",J.medium);super({id:e,title:t,dropdownList:n,svgIcon:o?i:null}),this.dropdownList=n,this.svgIcon=i,this.attachEvents(),n.setParentDropdownMenuButton(this)}init(){const e=document.createElement("button");if(e.id=this.props.id,e.role="button",e.classList.add("button-reset","text-formatting-select-button","text-formatting-operation","option-hover","pointer"),e.tabIndex=1,e.style.position="relative",e.setAttribute("aria-controls",this.props.dropdownList.htmlElement.id),"string"==typeof this.props.title){const t=document.createElement("span");t.classList.add("no-selection"),t.textContent=this.props.title,e.appendChild(t)}else e.appendChild(this.props.title);return this.props.svgIcon&&e.appendChild(this.props.svgIcon.htmlElement),e}attachEvents(){this.htmlElement.addEventListener("click",(()=>{this.dropdownList.isVisible?this.dropdownList.hide():this.dropdownList.show()})),document.addEventListener(s.ChangeBlockToolbarLanguage,this.handleChangeBlockToolbarLanguageEvent.bind(this))}handleChangeBlockToolbarLanguageEvent(e){const t=e.detail;if(t.targetClass&&this.classList.includes(t.targetClass)){const e=t.action;this.htmlElement.closest(`#${e.blockId}`)&&(this.changeTitle(pe.languageMap[e.language]),this.dropdownList.hide())}}get display(){return"block"}changeTitle(e){const t=this.htmlElement.querySelector("span");t&&(t.textContent=e)}static create(e,t,n,o,i=[]){const r=new Ae(e+H.generateUniqueId(),t,n,o);return r.addCssClass(...i),r}}!function(e){e.ColorTextOptionSelect="colorTextOptionSelect"}(b||(b={})),function(e){e.ColorTextOptionsMenu="colorTextOptionsMenu"}(E||(E={}));class Ce{static build(){const e=K.getInstance();return e.appendDropdown(Ce.turnIntoDropdown()),e.appendSeparator(Ce.separator("turnIntoSeparator")),e.appendButtonGroup(Ce.buttonGroup()),e.appendDropdown(Ce.colorDropdown()),e.appendSeparator(Ce.separator("textOperationsSeparator")),e.appendDropdown(Ce.moreOptionsDropdown()),e}static turnIntoDropdown(){const e=new se("turnIntoSelect"),t=new Ae("turnIntoButton","Text",e),n=new ne("turnIntoMenu",t,e);return e.append(new me(e,"Turn into")),e.append(new le("turnIntoOptionText",e,h.transformBlock,O.ELEMENT_TYPES.PARAGRAPH,ge.paragraph.htmlElement,"Text","Ctrl+Shift+Enter")),e.append(new le("turnIntoOptionTodoList",e,h.transformBlock,O.ELEMENT_TYPES.CHECK_LIST,ge.todo_list.htmlElement,"Todo list","Ctrl+1")),e.append(new le("turnIntoOptionBulletedList",e,h.transformBlock,O.ELEMENT_TYPES.BULLETED_LIST,ge.b_list.htmlElement,"Bulleted list","Ctrl+.")),e.append(new le("turnIntoOptionNumberedList",e,h.transformBlock,O.ELEMENT_TYPES.NUMBERED_LIST,ge.n_list.htmlElement,"Numbered list","Ctrl+/")),e.append(new le("turnIntoOptionBlockCode",e,h.transformBlock,O.ELEMENT_TYPES.CODE,ge.code.htmlElement,"Block code")),e.append(new le("turnIntoOptionQuote",e,h.transformBlock,O.ELEMENT_TYPES.QUOTE,ge.quote.htmlElement,"Quote")),e.append(new le("turnIntoOptionHeading2",e,h.transformBlock,O.ELEMENT_TYPES.HEADER_2,ge.head2.htmlElement,"Heading 2","Ctrl+Alt+2")),e.append(new le("turnIntoOptionHeading3",e,h.transformBlock,O.ELEMENT_TYPES.HEADER_3,ge.head3.htmlElement,"Heading 3","Ctrl+Alt+3")),e.append(new le("turnIntoOptionHeading4",e,h.transformBlock,O.ELEMENT_TYPES.HEADER_4,ge.head4.htmlElement,"Heading 4","Ctrl+Alt+4")),n}static separator(e){return new ae(e)}static buttonGroup(){const e=new ce,t=de.create(h.toggleLink,"Link",ee.create(i.Link,J.large));t.setId(p.Link),t.appendTo(e);const n=de.create(h.toggleBold,"Bold",ee.create(i.Bold,J.large));n.setId(p.Bold),n.appendTo(e);const o=de.create(h.toggleItalic,"Italic",ee.create(i.Italic,J.large));o.setId(p.Italic),o.appendTo(e);const r=de.create(h.toggleUnderline,"Underline",ee.create(i.Underline,J.large));r.setId(p.Underline),r.appendTo(e);const l=de.create(h.toggleInlineCode,"Code",ee.create(i.InlineCode,J.large));l.setId(p.InlineCode),l.appendTo(e);const s=de.create(h.toggleStrikeThrough,"Strike-through",ee.create(i.StrikeThrough,J.large));return s.setId(p.Strikethrough),s.appendTo(e),e}static colorDropdown(){const e=new se(b.ColorTextOptionSelect),t=new Ae("colorTextButton",new ue("#FAF4D1").htmlElement,e),n=new ne(E.ColorTextOptionsMenu,t,e);e.append(new me(e,"Highlight"));const o=new le(C.BackgroundOptionRed,e,h.toggleHiliteColor,u.HiliteColorRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("hiliteColor");const i=new le(C.BackgroundOptionGreen,e,h.toggleHiliteColor,u.HiliteColorGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("hiliteColor");const r=new le(C.BackgroundOptionBlue,e,h.toggleHiliteColor,u.HiliteColorBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("hiliteColor");const l=new le(C.BackgroundOptionYellow,e,h.toggleHiliteColor,u.HiliteColorYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("hiliteColor");const s=new le(C.BackgroundOptionGrey,e,h.toggleHiliteColor,u.HiliteColorGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("hiliteColor");const a=new le(C.BackgroundOptionNone,e,h.toggleHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");a.addClass("hiliteColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),e.append(new me(e,"Text"));const c=new le("colorOptionRed",e,h.toggleForeColor,u.ForeColorRed,new ee("icon-material-format",J.large).htmlElement,"Red");c.addClass("foreColor");const d=new le("colorOptionGreen",e,h.toggleForeColor,u.ForeColorGreen,new ee("icon-material-format",J.large).htmlElement,"Green");d.addClass("foreColor");const m=new le("colorOptionBlue",e,h.toggleForeColor,u.ForeColorBlue,new ee("icon-material-format",J.large).htmlElement,"Blue");m.addClass("foreColor");const p=new le("colorOptionYellow",e,h.toggleForeColor,u.ForeColorYellow,new ee("icon-material-format",J.large).htmlElement,"Yellow");p.addClass("foreColor");const A=new le("colorOptionGrey",e,h.toggleForeColor,u.ForeColorGrey,new ee("icon-material-format",J.large).htmlElement,"Grey");A.addClass("foreColor");const g=new le("colorOptionNone",e,h.toggleForeColor,u.ForeColorInitial,new ee("icon-material-format",J.large).htmlElement,"None");return g.addClass("foreColor"),e.append(c),e.append(d),e.append(m),e.append(p),e.append(A),e.append(g),n}static moreOptionsDropdown(){const e=new ee("icon-material-more",J.large),t=new se("moreTextOptionSelect"),n=new Ae("moreTextOptionButton",e.htmlElement,t,!1),o=new ne("moreTextOptionsMenu",n,t);t.append(new me(t,"More options")),t.append(new le("copyOption",t,h.copySelected,null,ge.copy.htmlElement,"Copy","Ctrl+C")),t.append(new le("cutOption",t,h.cutSelected,null,ge.cut.htmlElement,"Cut","Ctrl+X")),t.append(new le("pasteOption",t,h.past,null,ge.paste.htmlElement,"Replace","Ctrl+V")),t.append(new le("duplicateOption",t,h.duplicateBlock,null,ge.duplicate.htmlElement,"Clone","Ctrl+D")),t.append(new le("resetOption",t,h.removeFormat,null,ge.eraser.htmlElement,"Reset Style","Ctrl+\\"));const i=new le("deleteOption",t,h.deleteBlock,null,ge.delete.htmlElement,"Delete","Shift+Del");return i.addCssClass("danger-option"),t.append(i),o}}const ge={paragraph:new ee("icon-material-format","1.25rem"),todo_list:new ee("icon-material-check-list-2",J.large),b_list:new ee("icon-wordpress-bulleted-list",J.large),n_list:new ee("icon-wordpress-numbered-list",J.large),code:new ee("icon-wordpress-code-mark",J.large),quote:new ee("icon-wordpress-quote",J.large),head1:new ee("icon-julia-head-1",J.large),head2:new ee("icon-julia-head-2",J.large),head3:new ee("icon-julia-head-3",J.large),head4:new ee("icon-julia-head-4",J.large),head5:new ee("icon-julia-head-5",J.large),head6:new ee("icon-julia-head-6",J.large),duplicate:new ee("icon-material-duplicate",J.large),delete:new ee("icon-material-trash",J.large),eraser:new ee("icon-material-clear",J.large),copy:new ee("icon-material-copy",J.large),cut:new ee("icon-material-cut",J.large),paste:new ee("icon-material-paste",J.large)};class be extends R{constructor(){super({})}init(){const e=document.createElement("span");return e.innerText="No results",e.classList.add("empty-block-options"),e.style.padding="10px",e.style.color="rgba(55, 53, 47, 0.65)",e.style.display="none",e}}class Ee extends R{static id="quickMenu";blockOperationsService;currentFocusedMenuItem;menuSections;quickMenuEmpty;filterInput;static instance;focusStack;constructor(e,t){super({}),this.currentFocusedMenuItem=null,this.menuSections=new re,this.quickMenuEmpty=new be,this.blockOperationsService=e,this.focusStack=t,this.attachEvents(),this.filterInput=""}init(){const e=document.createElement("div");e.id=Ee.id,e.style.zIndex=d.SlightlyImportant,e.classList.add("block-options-wrapper","soft-box-shadow"),e.style.display="none";const t=document.createElement("div");return t.classList.add("block-options"),t.style.position="relative",e.appendChild(t),e}append(e){this.menuSections.append(e),this.htmlElement.querySelector(".block-options").appendChild(e.htmlElement)}static getInstance(){const e=D.Instance.resolve("IBlockOperationsService"),t=D.Instance.resolve("IFocusStack");return Ee.instance||(Ee.instance=new Ee(e,t)),Ee.instance}switchVisualFocus(e){this.currentFocusedMenuItem!=e&&(this.currentFocusedMenuItem&&this.currentFocusedMenuItem.value.removeFocus(),this.currentFocusedMenuItem=e,this.currentFocusedMenuItem.value.focus(),this.focusStack.peek()?.focus())}focusOnTheFirstVisibleItem(){const e=this.menuSections.getFirst();let t=e;for(;t;){const n=t.value.menuItems.findFirst((e=>e.isVisible));if(n)return void this.switchVisualFocus(n);if(t=t.nextNode,t==e)return}}focusPreviousVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getPreviousSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getPreviousSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}}else{let t=this.menuSections.findLast((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findLast((e=>e.isVisible))}this.switchVisualFocus(e)}focusNextVisibleItem(){let e;if(this.currentFocusedMenuItem){if(e=this.currentFocusedMenuItem.getNextSatisfying((e=>e.isVisible)),!e){let t=this.menuSections.find(this.currentFocusedMenuItem.value.immediateParent).getNextSatisfying((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}}else{let t=this.menuSections.findFirst((e=>e.isVisible));if(!t)return;e=t.value.menuItems.findFirst((e=>e.isVisible))}this.switchVisualFocus(e)}filterItems(){this.menuSections.forEach((e=>{e.filterSection(this.filterInput)})),this.menuSections.any((e=>e.isVisible))?this.quickMenuEmpty.hide():this.quickMenuEmpty.show(),this.focusOnTheFirstVisibleItem()}show(){setTimeout((()=>{const e=document.activeElement;if(!e)return void console.error("Failed to display the quickMenu: no active element found. Please ensure an element is focused before attempting to display the quickMenu.");this.focusStack.push(e);const t=window.getSelection();if(!t||0===t.rangeCount)throw new Error("Nenhuma seleção encontrada");const n=t.getRangeAt(0).getBoundingClientRect();this.htmlElement.style.display="flex";const o=this.htmlElement.offsetWidth;let i=n.left+window.scrollX;i+o>window.innerWidth&&(i=window.innerWidth-o-20),this.htmlElement.offsetHeight;let r=n.bottom+window.scrollY+10;this.htmlElement.style.left=`${i}px`,this.htmlElement.style.top=`${r}px`,super.show(),this.focusOnTheFirstVisibleItem(),this.focusStack.peek()?.focus()}),10)}restore(){this.filterInput="",this.menuSections.forEach((e=>{e.restore()}))}hide(){this.restore(),this.focusStack.peek()?.focus(),super.hide()}attachEvents(){document.addEventListener(c.emittedCommand,(e=>{const{command:t}=e.detail;t==h.transformBlock&&this.hide()})),document.addEventListener("keydown",(e=>{const t=P.findClosestAncestorOfActiveElementByClass("block");if(this.isVisible||"/"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||!t)(!this.isVisible||"ArrowLeft"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)&&(!this.isVisible||"ArrowRight"!==e.key||e.ctrlKey||e.shiftKey||e.altKey)?!this.isVisible||"ArrowDown"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||"ArrowUp"!==e.key||e.ctrlKey||e.shiftKey||e.altKey?!this.isVisible||!/^[a-z0-9 ]$/i.test(e.key)||e.ctrlKey||e.shiftKey||e.altKey?this.isVisible&&"Backspace"===e.key?""==this.filterInput?this.hide():(this.removeLastFilterInputCharacter(),this.filterItems()):!this.isVisible||"Escape"!==e.key||e.ctrlKey||e.shiftKey||e.altKey||this.hide():(this.concatFilterInput(e.key),this.filterItems()):(e.preventDefault(),this.focusPreviousVisibleItem()):(e.preventDefault(),this.focusNextVisibleItem()):(e.preventDefault(),e.stopPropagation());else{if(e.target.closest(".ignore-quick-menu"))return;this.show()}})),document.addEventListener("click",(e=>{this.isVisible&&!e.target.closest(`#${this.htmlElement.id}`)&&this.hide()})),document.addEventListener("keydown",(e=>{if(this.isVisible&&"Enter"===e.key&&!e.ctrlKey&&!e.shiftKey&&!e.altKey){e.preventDefault(),e.stopPropagation();const t=this.currentFocusedMenuItem?.value.blockType;t&&this.transformHtmlFocusedElementBeforeOpenQuickMenu(t)}})),document.addEventListener(c.blockTypeChanged,(e=>{this.hide()}))}emitCommandEvent(e){const t=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:e}});document.dispatchEvent(t)}transformHtmlFocusedElementBeforeOpenQuickMenu(e){e&&this.emitCommandEvent(e)}concatFilterInput(e){this.filterInput+=e.toLowerCase()}removeLastFilterInputCharacter(){this.filterInput.length>0&&(this.filterInput=this.filterInput.slice(0,-1))}}class fe extends oe{constructor(){super()}append(e){const t=new ie(e,this);this.head&&this.tail?(this.tail.setNext(t),t.setPrevious(this.tail),this.tail=t):(this.head=t,this.tail=t),this.length++}}class Be extends R{immediateParent;menuItems=new fe;constructor(e){super({title:e.title,classList:e.classList}),this.immediateParent=e.quickMenuInstance}init(){const e=document.createElement("section");e.classList.add(this.props.classList);const t=document.createElement("h2");return t.textContent=this.props.title,t.classList.add("no-selection"),e.appendChild(t),e}appendQuickMenuItems(e){e.forEach((e=>{this.appendQuickMenuItem(e)}))}appendQuickMenuItem(e){this.menuItems.append(e),this.htmlElement.appendChild(e.htmlElement)}filterSection(e){this.restore(),""!==e&&(this.menuItems.forEach((t=>{t.filterValue.toLocaleLowerCase().includes(e)||t.hide()})),this.menuItems.any((t=>t.filterValue.toLocaleLowerCase().includes(e)))||this.hide())}restore(){this.show(),this.menuItems.forEach((e=>{e.show()}))}}class ve extends R{_blockType;_filterValue;_immediateParent;constructor(e,t,n,o,i,r){super({title:t,description:n,iconId:o}),this._blockType=i,this._filterValue=r,this._immediateParent=e,this.attachEvents()}init(){const e=document.createElement("div");e.classList.add("option","option-hover","block-operation","pointer","no-selection"),e.setAttribute("data-block-operation","apply-selected-block-type"),e.setAttribute("tabindex","0"),e.setAttribute("role","option");const t=document.createElement("div");t.classList.add("option-image");const n=new ee(this.props.iconId,"100%");t.appendChild(n.htmlElement),e.appendChild(t);const o=document.createElement("div");o.classList.add("option-text");const i=document.createElement("p");i.classList.add("block-title"),i.innerText=this.props.title,o.appendChild(i);const r=document.createElement("p");return r.classList.add("block-description"),r.innerText=this.props.description,o.appendChild(r),e.appendChild(o),e}get display(){return"flex"}get filterValue(){return this._filterValue}get immediateParent(){return this._immediateParent}get blockType(){return this._blockType}focus(){this.htmlElement.classList.add("option-focused"),this.htmlElement.focus()}removeFocus(){this.htmlElement.classList.remove("option-focused")}emitCommandEvent(){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,value:this.blockType}});document.dispatchEvent(e)}attachEvents(){this.htmlElement.addEventListener("mousemove",(()=>{const e=this._immediateParent.menuItems.find(this);this._immediateParent.immediateParent.switchVisualFocus(e)})),this.htmlElement.addEventListener("click",(e=>{e.preventDefault(),e.stopPropagation(),this.emitCommandEvent()}))}}class we{static build(){const e=Ee.getInstance(),t=new Be({quickMenuInstance:e,title:"Basic",classList:"basic-section"});t.appendQuickMenuItems([new ve(t,"Text","Start writing in plain text.","icon-material-format",O.ELEMENT_TYPES.PARAGRAPH,"paragraph text p"),new ve(t,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",O.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(t,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",O.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list"),new ve(t,"Table","Organize data in rows and columns.","icon-material-table",O.ELEMENT_TYPES.TABLE,"table tr th"),new ve(t,"Callout","Emphasize key points with a callout box.",i.Callout,O.ELEMENT_TYPES.CALLOUT,"callout note spotlight"),new ve(t,"Code","Include a code snippet.","icon-wordpress-code-mark",O.ELEMENT_TYPES.CODE,"code script source markup"),new ve(t,"Quote","Highlight text as a quote.","icon-wordpress-quote",O.ELEMENT_TYPES.QUOTE,"quote blockquote citation quotation cite"),new ve(t,"Heading 2","Medium header for sections.","icon-julia-head-2",O.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(t,"Heading 3","Small header for subsections.","icon-julia-head-2",O.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(t,"Separator","Visually divide blocks.","icon-wordpress-separator",O.ELEMENT_TYPES.SEPARATOR,"separator divider rule line hr")]),e.append(t);const n=new Be({quickMenuInstance:e,title:"Media",classList:"media-section"});n.appendQuickMenuItems([new ve(n,"Image","Upload or embed an image.",i.Image2,O.ELEMENT_TYPES.IMAGE,"image figure photo illustration picture media upload"),new ve(n,"YouTube","Embed a YouTube video.",i.YouTube,"video","video embed youtube clip film movie tape")]),e.append(n);const o=new Be({quickMenuInstance:e,title:"Heading",classList:"heading-section"});o.appendQuickMenuItems([new ve(o,"Heading 1","Large header for main topics.","icon-julia-head-1",O.ELEMENT_TYPES.HEADER_1,"header 1 heading 1 h1"),new ve(o,"Heading 2","Medium header for sections.","icon-julia-head-2",O.ELEMENT_TYPES.HEADER_2,"header 2 heading 2 h2"),new ve(o,"Heading 3","Small header for subsections.","icon-julia-head-3",O.ELEMENT_TYPES.HEADER_3,"header 3 heading 3 h3"),new ve(o,"Heading 4","Detailed header for subtopics.","icon-julia-head-4",O.ELEMENT_TYPES.HEADER_4,"header 4 heading 4 h4"),new ve(o,"Heading 5","Minor header for specifics.","icon-julia-head-5",O.ELEMENT_TYPES.HEADER_5,"header 5 heading 5 h5"),new ve(o,"Heading 6","Smallest header for fine details.","icon-julia-head-6",O.ELEMENT_TYPES.HEADER_6,"header 6 heading 6 h6")]),e.append(o);const r=new Be({quickMenuInstance:e,title:"List",classList:"list-section"});r.appendQuickMenuItems([new ve(r,"Todo list","Track tasks with checkboxes.","icon-material-check-list-2",O.ELEMENT_TYPES.CHECK_LIST,"todo list task list checklist"),new ve(r,"Bulleted list","Organize items with bullet points.","icon-wordpress-bulleted-list",O.ELEMENT_TYPES.BULLETED_LIST,"bulleted list unordered list ul"),new ve(r,"Numbered list","List items in a numbered format.","icon-wordpress-numbered-list",O.ELEMENT_TYPES.NUMBERED_LIST,"numbered list number list sequential list ol enumerated list ordered list")]),e.append(r);const l=new Be({quickMenuInstance:e,title:"Embed",classList:"embed-section"});return l.appendQuickMenuItems([new ve(l,"GitHub Gist","Embed a GitHub Gist.",i.GitHub,"github-gist","code gist github snippet git"),new ve(l,"CodePen","Embed a CodePen web demo.",i.CodePen,"codepen","code codepen"),new ve(l,"Spotify","Embed a Spotify audio track.",i.Spotify,"spotify","mp3 sound audio music spotify track")]),e.append(l),e}}class ke extends R{constructor(e){super({value:e})}init(){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("h1");return t.setAttribute("contentEditable","true"),t.setAttribute("data-placeholder","Untitled"),this.props.value&&(t.textContent=this.props.value),e.appendChild(t),e}static create(e){return new ke(e)}}class Ie{static build(){return ke.create(window.editorConfig?.title)}}var ye,xe,Te,Se,Le,Me;!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight"}(ye||(ye={})),function(e){e.Column="Column",e.Row="Row",e.Cell="Cell",e.SelectedCells="SelectedCells"}(xe||(xe={}));class Ne{static addRow(e,t=null){const n=null!==t&&t>=0&&t<=e.rows.length?t:e.rows.length,o=e.insertRow(n),i=Array.from(e.rows).reduce(((e,t)=>Math.max(e,t.cells.length)),0);let r=[];for(let e=0;e{r.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static addColumn(e,t=null){const n=null!==t?t:void 0;let o=[];for(let t=0;t{o.forEach((e=>e.classList.remove("temporary-shadow")))}),700)}static isLastColumn(e,t){if(!e.contains(t))return!1;const n=t.parentElement;return t===n.cells[n.cells.length-1]}static isLastRow(e,t){return!!e.contains(t)&&t.parentElement===e.rows[e.rows.length-1]}static removeColumnByCell(e){if("td"!==e.tagName.toLowerCase()&&"th"!==e.tagName.toLowerCase())throw new Error("The provided element is not a table cell.");const t=e.parentElement.parentElement,n=e.cellIndex;for(let e=0;e=0;t--){const n=e.rows[t];for(let e=n.cells.length-1;e>=0;e--){const t=n.cells[e];if(t.isContentEditable)return t}}return null}static getFirstTableCell(e){for(let t=0;t{e.style.border=`1px double ${n}`}))}static moveFocusToBelowCell(e,t){const n=t.parentElement?.nextElementSibling;if(!n)return!1;const o=t.cellIndex,i=n.cells[o];return!(!i||!i.isContentEditable||(i.focus(),0))}}class qe extends R{constructor(){super({}),this.attachEvent()}init(){const e=document.createElement("div");return e.classList.add("content"),window.editorConfig,e.append(O.blockParagraph()),e}clearSelectionOnDrag(){document.addEventListener(a.Mousedown,(e=>{const t=e.target;let n;t&&(n=t.nodeType==Node.TEXT_NODE?t.parentElement:t,n&&n.closest(".drag-handler")&&window.getSelection()?.removeAllRanges())}))}attachEvent(){this.clearSelectionOnDrag(),this.reRenderPlaceholder(),document.addEventListener(a.Click,(e=>{document.querySelectorAll(".separator-selected").forEach((e=>{e.classList.remove("separator-selected"),e.removeAttribute("tabindex")}));let t=e.target;if(t&&t.closest(".separator-wrapper")){e.stopImmediatePropagation(),e.preventDefault();let n=t.closest(".separator-wrapper");n&&(n.classList.add("separator-selected"),n.setAttribute("tabindex","-1"),setTimeout((()=>{n.focus()}),50))}})),document.addEventListener(a.Blur,(e=>{const t=e.target;if(t instanceof HTMLElement&&t.closest(".separator-selected")){e.stopImmediatePropagation();const n=t.closest(".separator-selected");n.classList.remove("separator-selected"),n.removeAttribute("tabindex")}}),!0),document.addEventListener("copiedText",(()=>{const e=document.querySelector("#copyOption .text-option span");e&&(e.textContent="Copied!",setTimeout((()=>{e.textContent="Copy"}),1500))})),document.addEventListener(a.DOMContentLoaded,(function(){const e=document.querySelector(".johannes-editor");if(e){let t=e.querySelectorAll(".block");if(1==t.length){const e=t[0].querySelector(".johannes-content-element");""==e.innerText&&e.focus()}}})),document.addEventListener(a.Keydown,(e=>{"Enter"===e.key&&!e.shiftKey&&P.isEventTargetDescendantOf(e,"#johannesEditor .content-wrapper .title")&&(e.preventDefault(),document.dispatchEvent(new CustomEvent(c.pressedEnterOnTitle,{})))}),!0),document.addEventListener(a.Keydown,(async e=>{if(P.isEventTargetDescendantOf(e,".ignore-events")&&"Tab"!==e.key)return;const t=D.Instance.resolve("IQuickMenu"),n=D.Instance.resolve("ITableContextFloatingToolbar");if(!(e.ctrlKey||e.shiftKey||e.altKey))if(e.key!==A.Enter||e.shiftKey||t.isVisible||n.isVisible){if(e.key===A.Backspace){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnPrevious}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();n&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithPreviousBlock}})))}}else if(e.key===A.Delete){const t=e.target;if(t.classList.contains("separator-wrapper"))e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.classList.contains("johannes-content-element")&&""===t.textContent?.trim())e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlockAndFocusOnNext}}));else if(t.closest(".johannes-content-element")&&""!==t.textContent?.trim()){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(t),i=document.getSelection()?.toString();o&&0==i?.length&&(e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.mergeWithNextBlock}})))}}else if("ArrowRight"===e.key&&qe.isCursorAtEnd(e.target));else if("ArrowLeft"===e.key&&qe.isCursorAtStart(e.target));else if("ArrowDown"===e.key&&qe.isCursorOnLastLine());else if("ArrowUp"===e.key&&qe.isCursorOnFirstLine());else if("Tab"===e.key&&P.isEventTargetDescendantOf(e,".johannes-code")){e.preventDefault();const t="    ";document.execCommand("insertText",!1,t)}}else{e.preventDefault();const t=e.target.closest(".table-controller");if(t){const n=e.target.closest("td, th"),o=t.querySelector("table");return void(n&&(Ne.moveFocusToBelowCell(o,n)||document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.focusOnNextBlock}}))))}if(e.target.closest(".johannes-code"))return;e.preventDefault(),e.stopImmediatePropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.insertNew}}))}})),document.addEventListener(a.Blur,(e=>this.sanitizeElementEventHandler(e)),!0)}sanitizeElementEventHandler(e){const t=e.target;t instanceof HTMLElement&&"true"===t.contentEditable&&(console.log("lipou"),P.sanitizeContentEditable(t))}reRenderPlaceholder(){document.addEventListener(a.Input,(function(e){if(e.target instanceof HTMLElement){const t=e.target;if(t.isContentEditable&&t.hasAttribute("data-placeholder")){const e=t.getAttribute("data-placeholder");""===t.textContent?.trim()&&(t.setAttribute("data-placeholder",e||""),t.textContent="")}}}))}static isCursorAtEnd(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.endContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&o.endOffset===(o.endContainer.textContent||"").length}static isCursorAtStart(e){const t=e.closest(".focusable");if(!t)return!1;const n=window.getSelection();if(!n.rangeCount)return!1;const o=n.getRangeAt(0);let i=o.startContainer;return i.nodeType===Node.TEXT_NODE&&(i=i.parentNode),o.collapsed&&i===t&&0===o.startOffset}static isAtFirstVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!0),n.setStart(e,0),n.getBoundingClientRect().top===e.getBoundingClientRect().top}static isAtLastVisibleLine(e){const t=window.getSelection();if(!t.rangeCount)return!1;const n=t.getRangeAt(0).cloneRange();return n.collapse(!1),n.setEnd(e,e.childNodes.length),n.getBoundingClientRect().bottom===e.getBoundingClientRect().bottom}static didCursorMove(e){const t=window.getSelection();if(!t.rangeCount)return Promise.resolve(!1);const n=t.getRangeAt(0).cloneRange().getBoundingClientRect();return new Promise((o=>{setTimeout((()=>{const i=t.getRangeAt(0).cloneRange().getBoundingClientRect(),r=!(n.top===i.top&&n.left===i.left);r||e.preventDefault(),o(r)}),0)}))}static isCursorOnFirstLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return 0===t.startOffset&&t.startContainer===t.commonAncestorContainer}static isCursorOnLastLine(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0);return t.endOffset===t.endContainer.textContent?.length&&t.endContainer===t.commonAncestorContainer}static getInstance(){return D.Instance.resolve("IShortcutListeners"),D.Instance.resolve("ITableListeners"),new qe}}class He{static build(){return qe.getInstance()}}!function(e){e.Text="Text",e.Cell="Cell",e.Block="Block"}(Te||(Te={}));class Oe extends F{static id="tableFloatingToolbar";static instance;focusStack;selectedCells=[];actualFocusedCell=null;tableOperationsService;controller;selectionMode=Te.Text;selectionFlag=!1;selectedText="";constructor(e,t){if(Oe.instance)throw new Error("Use TableContextFloatingToolbar.getInstance() to get instance.");super(Oe.id),this.clearAndHide=this.clearAndHide.bind(this),this.htmlElement.style.zIndex=d.ModeratelyImportant,this.controller=new AbortController,this.focusStack=e,this.tableOperationsService=t,this.attachEvents()}attachEvents(){document.addEventListener(a.Mousedown,this.handleMouseDown.bind(this)),document.addEventListener(a.Mousemove,this.handleMouseMove.bind(this)),document.addEventListener(a.Mouseup,this.handleMouseUp.bind(this)),document.addEventListener(a.Keydown,this.handleStartSelectionInCellKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleCellSelectionContinuationOnKeyDown.bind(this)),document.addEventListener(a.Keydown,this.handleKeyDown.bind(this)),document.addEventListener(a.Keyup,this.handleKeyUp.bind(this)),this.attachUIEvent(),super.attachEvents()}handleMouseDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".figure-embed-container td")&&(console.log("MouseDown event on: ",e.target),e.stopImmediatePropagation(),this.controller.abort(),t!=this.actualFocusedCell&&this.hide(),this.clearAll(),this.addSelectedCell(t),this.selectionFlag=!0,this.selectionMode=Te.Text)}handleMouseMove(e){if(this.selectionFlag){const t=e.target.closest(g.TD);t&&(this.updateSelectionModeByMouseEvent(e),this.selectionMode==Te.Cell&&(e.stopImmediatePropagation(),e.preventDefault(),this.canHide&&this.hide(),this.addSelectedCell(t),document.getSelection()?.removeAllRanges()))}}handleMouseUp(e){this.selectedCells.length>0&&this.selectionFlag&&(this.resetSelectionState(),this.show())}handleKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.key!=A.Enter||e.shiftKey||e.ctrlKey||e.metaKey||e.altKey?e.key==A.Escape&&this.canHide&&!K.getInstance().isVisible&&setTimeout((()=>{this.canHide&&(e.stopImmediatePropagation(),this.clearAll(),this.hide())}),10):e.stopImmediatePropagation())}handleStartSelectionInCellKeyDown(e){const t=e.target.closest(g.TD);t&&!t.matches(".gist td")&&(e.repeat||e.key!==A.Shift||(e.stopImmediatePropagation(),this.controller.abort(),this.selectionFlag=!0,this.selectionMode=Te.Text,this.addSelectedCell(t)))}handleCellSelectionContinuationOnKeyDown(e){if(this.selectionFlag){const t=e.target.closest(g.TD);if(t&&!t.matches(".gist td")&&this.selectionMode==Te.Cell&&e.shiftKey&&e.key.startsWith("Arrow")&&!e.repeat){e.stopImmediatePropagation(),e.preventDefault();const n=t.closest(g.TABLE),o=Ne.getNeighborCell(n,t,e.key);this.addSelectedCell(t),o&&this.addSelectedCell(o)}}}normalizeText(e){return e.replace(/\s+/g," ").trim()}updateTheSelectionModeByCurrentSelectionState(e){if(this.selectionFlag){const t=document.getSelection();if(t){const n=this.normalizeText(t.toString().trim()),o=e.target.closest(g.TD);if(o.matches(".gist td"))return;const i=this.normalizeText((o.textContent||"").trim()),{atStart:r,atEnd:l}=P.getSelectionTextInfo(o);""===i||n===this.selectedText.trim()&&(r||l)?(this.selectionMode=Te.Cell,this.selectedText="",this.canHide&&this.hide()):n&&(this.selectedText=n)}}}updateSelectionModeByMouseEvent(e){if(this.selectionFlag&&this.actualFocusedCell){const t=this.actualFocusedCell.getBoundingClientRect(),n=e.clientX,o=e.clientY;n>=t.left&&n<=t.right&&o>=t.top&&o<=t.bottom||(this.selectionMode=Te.Cell,this.canHide&&this.hide())}}handleKeyUp(e){e.target.closest(g.TD)&&(e.stopImmediatePropagation(),this.updateTheSelectionModeByCurrentSelectionState(e),e.key===A.Shift&&(this.resetSelectionState(),this.selectedCells.length>0&&this.show()))}addSelectedCell(e){if(0===this.selectedCells.length)return this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,void e.focus();this.selectedCells[this.selectedCells.length-1].closest("table")===e.closest("table")&&(-1===this.selectedCells.indexOf(e)?(this.selectedCells.push(e),e.classList.add("selected"),this.actualFocusedCell=e,e.focus()):(this.actualFocusedCell=e,e.focus()))}attachUIEvent(){document.addEventListener(s.CloseElement,this.handleCloseElementEvent.bind(this))}handleCloseElementEvent(e){const t=e.detail;Oe.id==t.targetId&&this.clearAndHide()}show(){this.actualFocusedCell?(this.resetAbortController(),this.focusStack.push(this.actualFocusedCell),this.changeToolbarPositionToBeClosedTo(this.actualFocusedCell),this.processSelectionChangeEffects(),super.show(),this.actualFocusedCell.addEventListener(a.Blur,this.clearAndHide,{signal:this.controller.signal})):console.error("No focused cell found")}processSelectionChangeEffects(){G.emitResetActiveButtonsElementEvent("backgroundColor");const e={};e[u.BackgroundColorRed]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorRed),e[u.BackgroundColorGreen]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGreen),e[u.BackgroundColorBlue]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorBlue),e[u.BackgroundColorYellow]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorYellow),e[u.BackgroundColorGrey]=this.tableOperationsService.queryAllStateCellBackgroundColor(this.selectedCells,u.BackgroundColorGrey),Object.entries(e).forEach((([e,t])=>{t&&G.emitShowHideActiveElementEvent("backgroundColor",e,"show")}))}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";const n=this.htmlElement.offsetWidth;let o=t.left+window.scrollX+0;o+n>window.innerWidth&&(o=window.innerWidth-n-20);const i=this.htmlElement.offsetHeight;let r=t.top+window.scrollY-i-10;r<0&&(r=t.bottom+window.scrollY+10),this.htmlElement.style.left=`${o}px`,this.htmlElement.style.top=`${r}px`}resetSelectionState(){this.selectionMode=Te.Text,this.selectionFlag=!1,this.selectedText=""}clearAll(){this.actualFocusedCell=null,document.querySelectorAll("td").forEach((e=>e.classList.remove("selected"))),this.selectedCells=[]}hide(){this.canHide&&super.hide()}clearAndHide(){this.clearAll(),this.hide()}resetAbortController(){this.controller=new AbortController}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("ITableOperationsService");return new Oe(e,t)}}class Re{static build(){const e=D.Instance.resolve("ITableOperationsService"),t=Oe.getInstance();return t.appendDropdown(Re.tableOptions(e)),t.appendSeparator(Re.separator("tableOperationsSeparator")),t.appendDropdown(Re.tableColorDropdown()),t}static tableOptions(e){const t=new se("tableOptionsSelect"),n=new Ae("tableOptions","Options",t),o=new ne("tableOptionsMenu",n,t);t.append(new me(t,"Insert Column")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnLeft,O.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnLeft,J.medium).htmlElement,"Left")),t.append(new le("turnIntoOptionText",t,h.insertTableColumnRight,O.ELEMENT_TYPES.PARAGRAPH,ee.create(i.ColumnRight,J.medium).htmlElement,"Right")),t.append(new me(t,"Insert Row")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowAbove,O.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowAbove,J.medium).htmlElement,"Above")),t.append(new le("turnIntoOptionTodoList",t,h.insertTableRowBelow,O.ELEMENT_TYPES.CHECK_LIST,ee.create(i.RowBelow,J.medium).htmlElement,"Below")),t.append(new me(t,"Remove"));const r=new le("turnIntoOptionText",t,h.removeColumn,O.ELEMENT_TYPES.PARAGRAPH,ee.create(i.deleteSweep,J.medium).htmlElement,"Column");r.addCssClass("danger-option"),t.append(r);const l=new le("turnIntoOptionTodoList",t,h.removeRow,O.ELEMENT_TYPES.CHECK_LIST,ee.create(i.deleteSweep,J.medium).htmlElement,"Row");return l.addCssClass("danger-option"),t.append(l),o}static tableColorDropdown(){const e=new se("colorTableOptionSelect"),t=new Ae("colorTableButton",new ue("#FAF4D1").htmlElement,e),n=new ne("tableColorOptionsMenu",t,e);e.append(new me(e,"Background"));const o=new le("backgroundOptionRed",e,h.toggleCellHiliteColor,u.HiliteColorRed,new ue(u.HiliteColorRed).htmlElement,"Red");o.addClass("backgroundColor");const i=new le("backgroundOptionGreen",e,h.toggleCellHiliteColor,u.HiliteColorGreen,new ue(u.HiliteColorGreen).htmlElement,"Green");i.addClass("backgroundColor");const r=new le("backgroundOptionBlue",e,h.toggleCellHiliteColor,u.HiliteColorBlue,new ue(u.HiliteColorBlue).htmlElement,"Blue");r.addClass("backgroundColor");const l=new le("backgroundOptionYellow",e,h.toggleCellHiliteColor,u.HiliteColorYellow,new ue(u.HiliteColorYellow).htmlElement,"Yellow");l.addClass("backgroundColor");const s=new le("backgroundOptionGrey",e,h.toggleCellHiliteColor,u.HiliteColorGrey,new ue(u.HiliteColorGrey).htmlElement,"Grey");s.addClass("backgroundColor");const a=new le("backgroundOptionNone",e,h.toggleCellHiliteColor,u.HiliteColorNone,new ue(u.HiliteColorNone).htmlElement,"None");return a.addClass("backgroundColor"),e.append(o),e.append(i),e.append(r),e.append(l),e.append(s),e.append(a),n}static separator(e){return new ae(e)}}class De{static async embedImage(e,t){const n=new URL(e);if(!await De.validateImage(n.toString()))throw new Error("invalid image");const o=this.createEmbedContainer(),i=document.createElement("img");i.src=n.toString(),i.alt="Embedded Image",i.style.maxWidth="100%",i.style.width="auto",i.style.height="auto",o.appendChild(i),o.classList.add(r.AlignToolClass),De.finalizeEmbed(o,[r.AlignToolClass,"fit-content","x-resizable"],t)}static validateImage(e){return new Promise(((t,n)=>{const o=new Image;o.onload=()=>{t(!0)},o.onerror=()=>{t(!1)},o.src=e}))}static embedGoogleSheet(e,t){const n=e.pathname.split("/")[3],o=De.createEmbedContainer(["embed-container"]),i=document.createElement("iframe"),r=encodeURIComponent(n);i.src=`https://docs.google.com/spreadsheets/d/e/${r}/pubhtml?widget=true&headers=false`,i.style.width="100%",i.style.height="450px",i.frameBorder="0",i.allowFullscreen=!0,o.appendChild(i),De.finalizeEmbed(o,["x-resizable"],t)}static embedYouTubeVideoAsIframe(e,t){const n=e.searchParams.get("v");if(n){const e=this.createEmbedContainer(["embed-container"]),o=document.createElement("iframe"),i=encodeURIComponent(n);o.src=`https://www.youtube.com/embed/${i}`,o.frameBorder="0",o.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",o.allowFullscreen=!0,e.appendChild(o),e.classList.add(r.AlignToolClass),this.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube video URL")}static embedYouTubeShortAsIframe(e,t){const n=e.pathname.split("/"),o=n[n.length-1];if(o){const e=De.createEmbedContainer(["embed-container"]),n=document.createElement("iframe"),i=encodeURIComponent(o);n.src=`https://www.youtube.com/embed/${i}`,n.frameBorder="0",n.allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",n.allowFullscreen=!0,e.appendChild(n),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube Shorts URL")}static embedYouTubePlaylistAsIframe(e,t){const n=e.searchParams.get("list");if(n){const e=De.createEmbedContainer(["embed-container"]),o=encodeURIComponent(n),i=document.createElement("iframe");i.src=`https://www.youtube.com/embed/videoseries?list=${o}`,i.setAttribute("allowfullscreen","true"),e.appendChild(i),De.finalizeEmbed(e,["x-resizable",r.AlignToolClass],t)}else console.error("Invalid YouTube playlist URL")}static embedSpotifyContent(e,t,n){const o=e.pathname.split("/").pop(),i=this.createEmbedContainer(["embed-container"]);if(i.classList.add("spotify-embed",r.AlignToolClass),!o)return void console.error("contentId is empty");const l=encodeURIComponent(o),s=document.createElement("iframe");switch(s.classList.add("spotify-embed"),s.src=`https://open.spotify.com/embed/${n}/${l}`,s.frameBorder="0",s.setAttribute("scrolling","no"),n){case Se.SpotifyTrack:s.style.height="80px";break;case Se.SpotifyPlaylist:case Se.SpotifyShow:case Se.SpotifyEpisode:case Se.SpotifyArtist:s.style.height="380px";break;default:s.style.height="300px"}i.appendChild(s),this.finalizeEmbed(i,["x-resizable",r.AlignToolClass],t)}static async embedGistAsScript(e,t){const n=e.pathname.split("/").pop();if(!n)return void console.error("Invalid Gist ID");const o=document.createElement("div");o.classList.add("shadow-element");const i=De.createEmbedContainer(["gist-embed-container","figure-embed-container","ignore-text-floating-toolbar"]);i.style.minHeight="100px",i.style.width="100%",t.appendChild(i),i.appendChild(o);const r=o.attachShadow({mode:"open"}),l=`https://gist.github.com/${encodeURIComponent(n)}.js`,s=document.createElement("script");s.type="text/javascript",s.src=l,s.async=!0;const a=document.write;let c="";document.write=e=>{c+=e},s.onload=()=>{document.write=a;const e=document.createElement("div");e.innerHTML=c,Array.from(e.childNodes).forEach((e=>{r.appendChild(e)})),console.log("Gist loaded successfully")},s.onerror=()=>{document.write=a,console.error("Failed to load the Gist")},r.appendChild(s),De.finalizeEmbed(i,[],t)}static embedCodepenAsIframe(e,t){const n=e.pathname.split("/");if(n.length<4||""===n[1]||""===n[3])return void console.error("Invalid URL: Expected format /user/{username}/pen/{penId}");const o=n[1],i=n[3],r=encodeURIComponent(o),l=encodeURIComponent(i),s=De.createEmbedContainer(["embed-container"]),a=document.createElement("iframe");a.src=`https://codepen.io/${r}/embed/${l}?height=265&theme-id=light&default-tab=js,result`,a.style.border="none",a.style.height="100%",a.style.width="100%",a.style.overflow="visible",a.setAttribute("sandbox","allow-scripts allow-same-origin"),s.appendChild(a),De.finalizeEmbed(s,["y-resizable"],t);const c=new ResizeObserver((e=>{for(let t of e){const{height:e}=t.contentRect;a.style.height=`${e}px`}})),d=s.closest(".johannes-content-element");d&&(d.classList.add("overflow-hidden"),c.observe(d))}static createEmbedContainer(e=[]){const t=document.createElement("figure");return t.classList.add(...e),t}static finalizeEmbed(e,t=[],n){const o=n.closest(`.${l.ContentElement}`);if(o){for(o.classList.add(...t);o.firstChild;)o.removeChild(o.firstChild);o.appendChild(e);const n=o.closest(".block"),i=n?.querySelector(".block-toolbar-wrapper");i?.remove()}}static determineEmbedType(e){const t=new URL(e),n=t.hostname.toLowerCase(),o=t.pathname.toLowerCase();if(/^(?:.*\.)?spotify\.com$/.test(n)){if(o.includes("/track"))return Se.SpotifyTrack;if(o.includes("/playlist"))return Se.SpotifyPlaylist;if(o.includes("/artist"))return Se.SpotifyArtist;if(o.includes("/episode"))return Se.SpotifyEpisode;if(o.includes("/show"))return Se.SpotifyShow}else if(/^(?:.*\.)?(youtube\.com|youtu\.be)$/.test(n)){if(o.includes("/watch"))return t.searchParams.has("list")?Se.YouTubePlaylist:Se.YouTubeVideo;if(o.includes("/playlist"))return Se.YouTubePlaylist;if(o.includes("/shorts"))return Se.YouTubeShort}else{if("vimeo.com"===n)return Se.VimeoVideo;if("docs.google.com"===n&&o.includes("/spreadsheets"))return Se.GoogleSheet;if("twitter.com"===n)return Se.Tweet;if("google.com"===n&&o.includes("/maps"))return Se.GoogleMap;if("gist.github.com"===n)return Se.GitHubGist;if("gitlab.com"===n&&o.includes("/snippets"))return Se.GitLabSnippet;if("codepen.io"===n)return Se.CodePen}return null}}!function(e){e.SpotifyTrack="track",e.SpotifyPlaylist="playlist",e.SpotifyArtist="artist",e.SpotifyEpisode="episode",e.SpotifyShow="show",e.YouTubeVideo="video",e.YouTubePlaylist="playlist",e.YouTubeShort="short",e.VimeoVideo="video",e.GoogleSheet="sheet",e.Tweet="tweet",e.GoogleMap="map",e.GitHubGist="gist",e.GitLabSnippet="snippet",e.CodePen="pen"}(Se||(Se={}));class Pe extends R{id;focusStack;constructor(){const e="mediaInputter";super({id:e}),this.id=e,this.focusStack=D.Instance.resolve("IFocusStack"),this.attachEvents()}init(){const e=document.createElement("div");e.id=this.props.id,e.classList.add("tab-container","soft-box-shadow"),e.style.display="none",e.style.zIndex=d.ExtremelyImportant;const t=document.createElement("ul");t.classList.add("nav","nav-underline");const n=this.createNavItem("uploadTab","Upload",!0),o=this.createNavItem("embedTab","Embed");t.appendChild(n),t.appendChild(o);const i=document.createElement("div");i.classList.add("tab-content");const r=this.createUploadContent(),l=this.createEmbedContent();return i.appendChild(r),i.appendChild(l),e.appendChild(t),e.appendChild(i),e}createNavItem(e,t,n=!1){const o=document.createElement("li");o.classList.add("nav-item"),o.id=e;const i=document.createElement("a");return i.classList.add("nav-link"),i.innerText=t,o.appendChild(i),o}createUploadContent(){const e=document.createElement("div");e.id="uploadContent",e.classList.add("upload-content","content-data");const t=document.createElement("label");t.classList.add("blue-button"),t.innerText="Upload file";const n=document.createElement("div");return n.classList.add("text-info"),n.innerText="Maximum file size: 5MB",e.appendChild(t),e.appendChild(n),e}createEmbedContent(){const e=document.createElement("div");e.id="embedContent",e.classList.add("content-data","embed-content");const t=document.createElement("input");t.type="text";const n=document.createElement("button");return n.classList.add("blue-button"),n.innerText="Embed",e.appendChild(t),e.appendChild(n),n.addEventListener(a.Click,(()=>this.embedGeneric(t))),t.addEventListener(a.Keydown,(e=>{e.key==A.Enter&&this.embedGeneric(t)})),t.addEventListener(a.Focusin,(()=>this.resetInputBgColor(t))),e}resetInputBgColor(e){e.style.backgroundColor=""}async embedGeneric(e){const t=e.value,n=this.focusStack.peek(),i=n?.closest(`.${l.ContentElement}`)?.getAttribute("data-content-type");try{const e=new URL(t);if(!H.isValidUrl(e.toString()))throw new Error("Invalid URL");if(!n)return void console.error("not element found");if(i==o.Image)await De.embedImage(t,n);else if(i==o.Iframe){const o=De.determineEmbedType(t);switch(o){case Se.YouTubeVideo:De.embedYouTubeVideoAsIframe(e,n);break;case Se.YouTubePlaylist:De.embedYouTubePlaylistAsIframe(e,n);break;case Se.YouTubeShort:De.embedYouTubeShortAsIframe(e,n);break;case Se.SpotifyTrack:case Se.SpotifyPlaylist:case Se.SpotifyArtist:case Se.SpotifyEpisode:case Se.SpotifyShow:case Se.SpotifyPlaylist:De.embedSpotifyContent(e,n,o);break;case Se.GitHubGist:De.embedGistAsScript(e,n);break;case Se.CodePen:De.embedCodepenAsIframe(e,n);break;default:throw new Error("Unsupported")}}this.hide()}catch(e){const t=document.querySelector("#embedContent input");t&&(t.style.backgroundColor="rgb(253, 222, 222)",t.classList.add("shake-animation"),setTimeout((()=>{t.classList.remove("shake-animation")}),1e3))}}set inputValue(e){const t=this.htmlElement.querySelector("input");t&&(t.value=e)}get display(){return"flex"}attachEvents(){const e=this.htmlElement.querySelector("#uploadTab");e?.addEventListener("click",(()=>{this.setActiveTab("uploadTab","uploadContent")}));const t=this.htmlElement.querySelector("#embedTab");t?.addEventListener("click",(()=>{this.setActiveTab("embedTab","embedContent")})),document.addEventListener(a.Keydown,this.handlerKeydownEvents.bind(this)),document.addEventListener(a.Click,this.handlerClickEvents.bind(this)),super.attachUIEvent()}handlerKeydownEvents(e){e.key==A.Escape&&this.canHide&&this.hide()}handlerClickEvents(e){this.hideMediaInputterOnExternalClick(e),this.showMediaInputterOnMediaInputterElementClick(e)}hideMediaInputterOnExternalClick(e){const t=P.findClickedElementOrAncestorById(e,this.id),n=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(!t&&!n&&this.isVisible)return e.stopImmediatePropagation(),void this.hide()}showMediaInputterOnMediaInputterElementClick(e){const t=P.findClickedElementOrAncestorByClass(e,l.ShowMediaInputOnClick);if(t)return e.stopImmediatePropagation(),e.preventDefault(),this.focusStack.push(t),void(this.isVisible?this.hide():this.show())}findClassWithSuffix(e,t){const n=new RegExp(`.*${t}$`);for(let t of e.classList)if(n.test(t))return t;return null}getTab(e){return document.getElementById(e)}getContent(e){return document.getElementById(e)}setActiveTab(e,t){document.querySelectorAll(".nav-item").forEach((e=>{e.classList.remove("active")})),document.querySelectorAll(".content-data").forEach((e=>{e.classList.remove("active")})),this.getTab(e)?.classList.add("active"),this.getContent(t)?.classList.add("active")}show(){const e=this.focusStack.peek(),t=e?.querySelector(`.${l.ShowMediaInputOnClick}`)||e?.closest(`.${l.ShowMediaInputOnClick}`);if(t){const e=this.findClassWithSuffix(t,"-embed-placeholder-text");e&&this.setInputPlaceholder(e)}if(e){const t=e.querySelector(`.${l.ShowMediaInputUpload}`)||e.closest(`.${l.ShowMediaInputUpload}`),n=this.htmlElement.querySelector("#uploadTab"),o=this.htmlElement.querySelector("#embedTab"),i=this.htmlElement.querySelector("#uploadContent"),r=this.htmlElement.querySelector("#embedContent");t&&n&&i?(n.style.display="inline",n.classList.add("active"),i.classList.add("active"),r.classList.remove("active"),o.classList.remove("active")):(n.style.display="none",n.classList.remove("active"),i.classList.remove("active"),r.classList.add("active"),o.classList.add("active"))}this.htmlElement.style.visibility="visible",e&&this.changeToolbarPositionToBeClosedTo(e),super.show();const n=document.querySelector("#embedContent input");n&&this.isElementVisible(n)&&(n.style.backgroundColor="white",setTimeout((()=>{n.focus()}),100))}setInputPlaceholder(e){const t=document.querySelector("#embedContent input");"image-embed-placeholder-text"!=e?"youtube-embed-placeholder-text"!=e?"spotify-embed-placeholder-text"!=e?"github-gist-embed-placeholder-text"!=e?"codepen-embed-placeholder-text"!=e?t.setAttribute("placeholder","Paste URL here..."):t.setAttribute("placeholder","https://codepen.io/..."):t.setAttribute("placeholder","https://gist.github.com/..."):t.setAttribute("placeholder","https://open.spotify.com/..."):t.setAttribute("placeholder","https://www.youtube.com/..."):t.setAttribute("placeholder","https://example.com/image.jpg")}isElementVisible(e){if(null===e.offsetParent)return!1;const t=e.getBoundingClientRect();return t.width>0&&t.height>0}hide(){this.inputValue="",super.hide()}changeToolbarPositionToBeClosedTo(e){const t=e.getBoundingClientRect();this.htmlElement.style.display="flex";let n=t.left+window.scrollX+t.width/2-this.htmlElement.offsetWidth/2,o=t.bottom+window.scrollY+10;this.htmlElement.style.left=`${n}px`,this.htmlElement.style.top=`${o}px`}}class Fe{static build(){return new Pe}}class Ve{static build(){return $.getInstance(Ie.build(),He.build(),te.build(),Ce.build(),we.build(),Re.build(),Fe.build())}}class _e{static instance;editor;constructor(e){if(_e.instance)throw new Error;this.editor=e,_e.instance=this}static build(){return _e.instance?_e.instance:new _e(Ve.build())}start(){return this.insertIcons(),this.editor}insertIcons(){if(!document.querySelector(".svg-icons-container")){const e=document.createElement("div");e.innerHTML='\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- tags --\x3e\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \x3c!-- \r\n \r\n --\x3e\r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n',e.className="svg-icons-container",document.body.appendChild(e)}}}class je{static instance=null;blockOperationsService;tableOperationsService;textOperationsService;constructor(e,t,n){if(je.instance)throw new Error("Attempt to instantiate singleton `CommandDispatcher` more than once.");this.blockOperationsService=e,this.textOperationsService=t,this.tableOperationsService=n}static getInstance(){const e=D.Instance.resolve("IBlockOperationsService"),t=D.Instance.resolve("ITextOperationsService"),n=D.Instance.resolve("ITableOperationsService");return je.instance||(je.instance=new je(e,t,n)),je.instance}listen(){document.addEventListener(c.emittedCommand,this.handleCommandEvent),document.addEventListener(c.pressedEnterOnTitle,(()=>this.blockOperationsService.createANewParagraphFromTitle()))}handleCommandEvent=e=>{const{command:t,showUI:n,value:o,targetBlockType:i,block:r,scope:l}=e.detail;switch(t){case h.linkReadyToInsert:if(!o)throw new Error(`${h.linkReadyToInsert} requires value`);this.textOperationsService.execInsertLink(o);break;case h.toggleLink:this.textOperationsService.execToggleLink();break;case h.toggleBold:this.textOperationsService.execBold();break;case h.toggleInlineCode:this.textOperationsService.execInlineCode();break;case h.toggleItalic:this.textOperationsService.execItalic();break;case h.toggleUnderline:this.textOperationsService.execUnderline();break;case h.toggleStrikeThrough:this.textOperationsService.execStrikeThrough();break;case h.toggleHiliteColor:if(!o)throw new Error(`${h.toggleHiliteColor} requires a color value`);this.textOperationsService.execHiliteColor(o);break;case h.toggleForeColor:if(!o)throw new Error(`${h.toggleForeColor} requires a color value`);this.textOperationsService.execForeColor(o);break;case h.transformBlock:if(!o)throw new Error(`${h.transformBlock} requires a value that represents the target element type.`);this.blockOperationsService.transformBlock(o,r);break;case h.duplicateBlock:this.blockOperationsService.execDuplicateBlock(r);break;case h.deleteBlock:this.blockOperationsService.execDeleteBlock(r);break;case h.deleteBlockAndFocusOnPrevious:this.blockOperationsService.execDeleteFocusOnPrevious();break;case h.deleteBlockAndFocusOnNext:this.blockOperationsService.execDeleteAndFocusOnNext();break;case h.focusOnNextBlock:this.blockOperationsService.execFocusOnNext();break;case h.removeFormat:this.execRemoveFormat(t);break;case h.JustifyLeft:if(!r)throw new Error(`${h.JustifyLeft} requires a block to justify.`);this.blockOperationsService.justifyLeft(r);break;case h.JustifyCenter:if(!r)throw new Error(`${h.JustifyCenter} requires a block to justify.`);this.blockOperationsService.justifyCenter(r);break;case h.JustifyRight:if(!r)throw new Error(`${h.JustifyRight} requires a block to justify.`);this.blockOperationsService.justifyRight(r);break;case h.changeCodeBlockLanguage:if(!r)throw new Error(`${h.changeCodeBlockLanguage} requires a block to change a code block language.`);if(!o)throw new Error(`${h.changeCodeBlockLanguage} requires a value to change a code block language.`);this.blockOperationsService.changeCodeBlockLanguage(r,o);break;case h.createDefaultBlock:this.execCreateDefaultBlock(t);break;case h.insertNew:this.execInsertNew(t);break;case h.focusOnPreviousBlock:this.execFocusOnPreviousBlock(t);break;case h.mergeWithNextBlock:this.blockOperationsService.execMergeWithNextBlock();break;case h.mergeWithPreviousBlock:this.blockOperationsService.execMergeWithPreviousBlock();break;case h.insertTableColumnLeft:this.tableOperationsService.insertColumnLeft();break;case h.insertTableColumnRight:this.tableOperationsService.insertColumnRight(r||null);break;case h.insertTableRowAbove:this.tableOperationsService.insertRowAbove();break;case h.insertTableRowBelow:this.tableOperationsService.insertRowBelow(r||null);break;case h.toggleCellHiliteColor:if(!o)throw new Error(`${h.toggleCellHiliteColor} requires a value that represents the cell background color.`);this.tableOperationsService.execCellBackgroundColor(o);break;case h.changeCalloutBackgroundColor:if(!r)throw new Error(`${h.changeCalloutBackgroundColor} requires a block.`);if(!o)throw new Error(`${h.changeCalloutBackgroundColor} requires a value that represents the background color.`);this.blockOperationsService.execChangeCalloutBackground(r,o);break;case h.removeColumn:this.tableOperationsService.removeColumn();break;case h.removeRow:case h.removeRow:this.tableOperationsService.removeRow();break;case h.changeTableBorderColor:this.tableOperationsService.changeTableBorderColor(l,o);break;default:console.error(`No action defined for command: ${t}`)}};execRemoveFormat(e){const t=this.blockOperationsService.execCommand(e,!1),n=P.getActiveContentEditable();return n&&n.normalize(),t}execCreateDefaultBlock(e){return this.blockOperationsService.execCommand(e,!1)}execInsertNew(e){return this.blockOperationsService.createNewElementAndSplitContent()}execFocusOnPreviousBlock(e){return this.blockOperationsService.execCommand(e,!1)}}class ze{static instance=null;constructor(){if(ze.instance)throw new Error("Use ShortcutListeners.getInstance() to get instance.");this.listen()}startListen(){console.log("listening keyboard shortcuts")}static getInstance(){return ze.instance?ze.instance:new ze}listen(){document.addEventListener("keydown",(e=>{console.log(`Key: ${e.key}, Code: ${e.code}, Ctrl: ${e.ctrlKey}, Alt: ${e.altKey}, AltGr: ${"AltGraph"===e.key}, NumLock: ${e.getModifierState("NumLock")}`);const t=e.code.startsWith("Numpad"),n=e.getModifierState("NumLock");(e.ctrlKey||e.metaKey)&&e.shiftKey&&"Enter"===e.key?(e.preventDefault(),e.stopPropagation(),alert("converto para paragrafo"),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.PARAGRAPH}}))):!e.ctrlKey&&!e.metaKey||e.altKey||"Digit1"!==e.code&&"Numpad1"!==e.code?!e.ctrlKey&&!e.metaKey||e.shiftKey||"."!==e.key?!e.ctrlKey&&!e.metaKey||e.shiftKey||"/"!==e.key?e.ctrlKey&&e.altKey&&("Digit1"===e.code||t&&n&&"Numpad1"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_1}}))):e.ctrlKey&&e.altKey&&("Digit2"===e.code||t&&n&&"Numpad2"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_2}}))):e.ctrlKey&&e.altKey&&("Digit3"===e.code||t&&n&&"Numpad3"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_3}}))):e.ctrlKey&&e.altKey&&("Digit4"===e.code||t&&n&&"Numpad4"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_4}}))):e.ctrlKey&&e.altKey&&("Digit5"===e.code||t&&n&&"Numpad5"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_5}}))):e.ctrlKey&&e.altKey&&("Digit6"===e.code||t&&n&&"Numpad6"===e.code)?(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.HEADER_6}}))):"D"!==e.key&&"d"!==e.key||!e.ctrlKey?"Delete"!==e.key&&"Backspace"!==e.key||!e.shiftKey?"\\"===e.key&&(e.ctrlKey||e.metaKey)?document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.removeFormat}})):e.ctrlKey&&e.altKey&&"Digit1"===e.code&&e.preventDefault():(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.deleteBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.duplicateBlock}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.NUMBERED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.BULLETED_LIST}}))):(e.preventDefault(),e.stopPropagation(),document.dispatchEvent(new CustomEvent(c.emittedCommand,{detail:{command:h.transformBlock,targetBlockType:O.ELEMENT_TYPES.CHECK_LIST}})))}))}}class Ye{static instance=null;focusStack;shownElements=new Map;constructor(e){if(Ye.instance)throw new Error("Use TableEventListeners.getInstance() to get instance.");this.focusStack=e,this.listen()}startListen(){console.log("listening table clicks")}static getInstance(){const e=D.Instance.resolve("IFocusStack");return Ye.instance?Ye.instance:new Ye(e)}listen(){document.addEventListener("click",(e=>{let t=null;if(t=e.target.nodeType==Node.TEXT_NODE?e.target.parentElement:e.target,t?.closest(".add-table-column")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableColumnRight,block:t.closest(".block")}});document.dispatchEvent(e)}if(t?.closest(".add-table-row")){const e=new CustomEvent(c.emittedCommand,{detail:{command:h.insertTableRowBelow,block:t.closest(".block")}});document.dispatchEvent(e)}}))}}class Ue{static instance;stack;capacity=10;constructor(){this.stack=[]}static getInstance(){return Ue.instance||(Ue.instance=new Ue),Ue.instance}push(e){this.stack.length>=this.capacity&&this.stack.shift(),this.stack.push(e)}peek(){return this.stack[this.stack.length-1]}clear(){this.stack=[]}}class Ge{static instance;elementFactoryService;memento;focusStack;constructor(e,t,n){if(Ge.instance)throw new Error("Use BlockOperationsService.getInstance() to get instance.");this.elementFactoryService=e,this.focusStack=t,this.memento=n,Ge.instance=this}execCommand(e,t,n=null){if(e==h.copySelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();navigator.clipboard.writeText(t).then((()=>{const e=new CustomEvent("copiedText",{bubbles:!0,cancelable:!0});return document.dispatchEvent(e),!0})).catch((e=>{console.error("Error when copy text",e)}))}}return!1}if(e==h.cutSelected){if(document.getSelection&&navigator.clipboard&&navigator.clipboard.writeText){const e=document.getSelection();if(e&&e.toString().length>0){const t=e.toString();e.deleteFromDocument(),navigator.clipboard.writeText(t).then((()=>!0)).catch((e=>{console.error("Error when cut text: ",e)}))}}return!1}if(e==h.past)return navigator.clipboard&&navigator.clipboard.readText&&navigator.clipboard.readText().then((e=>{const t=document.getSelection();if(t&&t.rangeCount>0){const n=t.getRangeAt(0);n.deleteContents(),n.insertNode(document.createTextNode(e));const o=new CustomEvent("requestUpdateFloatingToolbar",{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}console.error("No text selected or clipboard empty.")})).catch((e=>{console.error("Error when pasting text: ",e)})),!1;if(e==h.transformBlock&&this.getCurrentSelectedBlock()&&n&&this.transformBlock(n),e==h.removeFormat)return document.execCommand(h.removeFormat,!1);if(e==h.createDefaultBlock){const e=document.activeElement||null;return this.createDefaultBlock(e),!0}if(e==h.focusOnFirstBlock){const e=document.querySelector(".focusable");return!!e&&(e.focus(),!0)}if(e==h.deleteBlockAndFocusOnPrevious)throw new Error("Remove all reference to this code");if(e==h.deleteBlockAndFocusOnNext)throw new Error("Remove all reference to this code");return!0}queryCommandState(){throw new Error("Method not implemented.")}static getInstance(){const e=D.Instance.resolve("IElementFactoryService"),t=D.Instance.resolve("IFocusStack"),n=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ge(e,t,n)),this.instance}static getDraggableElementFromSelection(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t.closest(".block")}throw new Error}execMergeWithPreviousBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getPreviousContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(t),setTimeout((()=>{const n=P.saveCaretPosition2d(t);if(t.innerHTML=t.innerHTML+e.innerHTML,e.closest("li")){const t=e.closest("li");t&&t.remove()}else{const t=e.closest(".block");t&&t.remove()}const o={charIndex:n.charIndex+t.textContent.length,horizontalPos:n.horizontalPos};P.restoreCaretPosition2d(t,o)}),10)})))}execMergeWithNextBlock(){this.memento.saveState();const e=P.getActiveContentEditable();if(!e)return;const t=P.getNextContentEditable(e);t&&(P.sanitizeContentEditable(e),P.sanitizeContentEditable(t),setTimeout((()=>{P.placeCursorAtEndOfEditableElement(e),setTimeout((()=>{const n=P.saveCaretPosition2d(e);if(e.innerHTML=e.innerHTML+t.innerHTML,e.closest("li")){const e=t.closest("li");e&&e.remove()}else{const e=t.closest(".block");e&&e.remove()}P.restoreCaretPosition2d(e,n)}),10)})))}execDuplicateBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock());const t=e.cloneNode(!0);t.querySelectorAll(".exclude-from-clone").forEach((e=>e.remove()));const n=e.nextSibling;e.parentNode?.insertBefore(t,n),t.id=`b-${H.generateUniqueId()}`;const o=new CustomEvent(c.blockCloned,{bubbles:!0,cancelable:!0});return document.dispatchEvent(o),!0}execDeleteBlock(e){e||(e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock()),this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e);const t=new CustomEvent(c.blockDeleted,{bubbles:!0,cancelable:!0});return document.dispatchEvent(t),!0}transformBlock(e,t){let n;n=t?t.closest(".block"):this.focusStack.peek()?.closest(".block")||null,t||(t=P.findClosestAncestorOfActiveElementByClass(".block"));let o=n.querySelector(".swittable");this.focusStack.peek()?.focus(),P.removeFilterText(),this.memento.saveState();let i,r=o?.innerText,l=null;switch(e){case O.ELEMENT_TYPES.PARAGRAPH:{i=this.elementFactoryService.create(O.ELEMENT_TYPES.PARAGRAPH);const e=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&(i.innerHTML=e.innerHTML);break}case O.ELEMENT_TYPES.HEADER_1:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_1),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_2:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_2),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_3:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_3),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_4:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_4),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_5:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_5),i.innerText=r;break;case O.ELEMENT_TYPES.HEADER_6:i=this.elementFactoryService.create(O.ELEMENT_TYPES.HEADER_6),i.innerText=r;break;case O.ELEMENT_TYPES.CODE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.CODE);break;case O.ELEMENT_TYPES.QUOTE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.QUOTE);break;case O.ELEMENT_TYPES.BULLETED_LIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.BULLETED_LIST,r);break;case O.ELEMENT_TYPES.NUMBERED_LIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.NUMBERED_LIST,r);break;case O.ELEMENT_TYPES.CHECK_LIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.CHECK_LIST,r);break;case O.ELEMENT_TYPES.SEPARATOR:i=this.elementFactoryService.create(O.ELEMENT_TYPES.SEPARATOR);break;case O.ELEMENT_TYPES.TABLE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.TABLE,",,");break;case O.ELEMENT_TYPES.IMAGE:i=this.elementFactoryService.create(O.ELEMENT_TYPES.IMAGE,r),l=i;break;case O.ELEMENT_TYPES.VIDEO:i=this.elementFactoryService.create(O.ELEMENT_TYPES.VIDEO,r),l=i;break;case O.ELEMENT_TYPES.SPOTIFY:i=this.elementFactoryService.create(O.ELEMENT_TYPES.SPOTIFY,r),l=i;break;case O.ELEMENT_TYPES.GITHUB_GIST:i=this.elementFactoryService.create(O.ELEMENT_TYPES.GITHUB_GIST,r),l=i;break;case O.ELEMENT_TYPES.GITLAB_SNIPPET:i=this.elementFactoryService.create(O.ELEMENT_TYPES.GITLAB_SNIPPET,r),l=i;break;case O.ELEMENT_TYPES.CODEPEN:i=this.elementFactoryService.create(O.ELEMENT_TYPES.CODEPEN,r),l=i;break;case O.ELEMENT_TYPES.CALLOUT:{i=this.elementFactoryService.create(O.ELEMENT_TYPES.CALLOUT);const e=i.querySelector(".callout-text"),t=P.querySelectorIncludingSelf(o,'[contenteditable="true"]');e&&t&&(e.innerHTML=t.innerHTML);break}default:return void console.error("Unsupported type")}if(!i)return;n.replaceChild(i,o);const s=i.closest(".focusable")||n.querySelector(".focusable");if(s&&(s.focus(),P.placeCursorAtEndOfEditableElement(s)),l&&this.focusStack.push(l),"image"==e||"video"==e||"spotify"==e||"github-gist"==e||"gitlab-snippet"==e||"codepen"==e){const e=l?.querySelector(".content-placeholder");e&&(console.log("opaaaaaa"),this.focusStack.push(e)),G.emitShowElementEvent("mediaInputter")}const a=n?.querySelector(".block-toolbar-wrapper");a&&a.remove()}createNewElement(e){this.memento.saveState();const t=e.target.closest(".johannes-content-element");t&&t.classList.contains("list")?this.createListItem(t):this.createDefaultBlock(t)}createListItem(e){this.memento.saveState();let t=null,n=(document.activeElement,e.closest(".johannes-content-element"));n.classList.contains("checkbox-list")?t=this.elementFactoryService.create("checkboxItem",""):n.classList.contains("list")&&(t=this.elementFactoryService.create("listItem",""))}createNewElementAndSplitContent(){this.memento.saveState();const e=P.getContentTypeFromActiveElement();if(e==o.Table)return!1;if(e==o.CheckList||e==o.BulletedList||e==o.NumberedList){const e=P.findClosestAncestorOfActiveElementByClass("list-item");if(e&&P.hasTextContent(e)){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),o=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,o)}}else if(e){const t=e.closest(".block");if(t){const n=t.querySelectorAll(".list-item").length,o=O.blockParagraph();P.insertAfter(o,t),e.remove(),1==n&&t.remove();const i=o.querySelector("p");P.placeCursorAtStartOfEditableElement(i)}}}else{const e=P.findClosestAncestorOfActiveElementByClass("block");if(e){const t=P.cloneAndInsertAfter(e);if(t){const n=e.querySelector(".focusable"),i=t.querySelector(".focusable");P.rearrangeContentAfterSplit(n,i),this.transformBlock(o.Paragraph,t)}const n=t.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(n)}}return!0}createANewParagraphFromTitle(){this.memento.saveState();const e=document.querySelector("#johannesEditor .title h1"),t=P.cloneAndInsertAfter(e);t&&P.rearrangeContentAfterSplit(e,t);const n=this.elementFactoryService.create(O.ELEMENT_TYPES.BLOCK_PARAGRAPH,""),o=n.querySelector(`.${l.ContentElement}`);o&&(o.innerHTML=t?.innerHTML||"");const i=document.querySelector("#johannesEditor .content");if(i){i.prepend(n);const e=n.querySelector(".focusable");P.placeCursorAtStartOfEditableElement(e)}t?.remove()}createDefaultBlock(e){this.memento.saveState();const t=this.elementFactoryService.create(O.ELEMENT_TYPES.BLOCK_PARAGRAPH,"");return e&&e.closest(".block")?e.closest(".block").insertAdjacentElement("afterend",t):document.querySelector("#johannesEditor .content").appendChild(t),t.querySelector(".johannes-content-element").focus(),this.focusStack.push(t),t}execFocusOnNext(){let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),!0)}execDeleteFocusOnPrevious(){this.memento.saveState();const e=document.activeElement;return this.focusOnPrevious(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0}execDeleteAndFocusOnNext(){this.memento.saveState();let e=this.getCurrentSelectedBlock()||P.getCurrentActiveBlock();return!!e&&(this.focusOnNext(e),this.deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e),!0)}focusOnPrevious(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.previousElementSibling;if(!o)return;if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n))}let o=e.closest(".block");if(!o)return;let i=o.previousElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[e.length-1],void(t?this.applyCursorXEndPosition(n,t):P.placeCursorAtEndOfEditableElement(n));i=i.previousElementSibling}}getPreviousFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.previousElementSibling;if(!n)return null;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.previousElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.previousElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[e.length-1],t;o=o.previousElementSibling}return t}focusOnNext(e,t=null){let n=null;if("LI"===e.tagName.toUpperCase()){let o=e.nextElementSibling;if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}if("LI"===e.parentNode.tagName.toUpperCase()){let o=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(o&&o.classList.contains("focusable"))return n=o,t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n}let o=e.closest(".block");if(!o)return;let i=o.nextElementSibling;for(;i;){let e=i.querySelectorAll(".focusable");if(e.length>0)return n=e[0],t?this.applyCursorXStartPosition(n,t):P.placeCursorAtStartOfEditableElement(n),n;i=i.nextElementSibling}return n}getNextFocusableElement(e){let t=null;if("LI"===e.tagName.toUpperCase()){let n=e.nextElementSibling;if(n&&n.classList.contains("focusable"))return t=n,t}if("LI"===e.parentNode.tagName.toUpperCase()){let n=e.closest("li")?.nextElementSibling?.querySelector(".focusable");if(n&&n.classList.contains("focusable"))return t=n,t}let n=e.closest(".block");if(!n)return null;let o=n.nextElementSibling;for(;o;){let e=o.querySelectorAll(".focusable");if(e.length>0)return t=e[0],t;o=o.nextElementSibling}return t}deleteTheCurrentElementAndTheDraggableBlockIfEmpty(e){const t=e.closest(".block"),n=e.closest(".deletable");n?.remove(),t&&0==t.querySelectorAll(".editable").length&&t.remove()}applyCursorXEndPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.lastChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=(i.nodeName.toUpperCase(),i.previousSibling)}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!1),n.removeAllRanges(),n.addRange(o),e.focus())}applyCursorXStartPosition(e,t){const n=window.getSelection(),o=document.createRange();let i=e.firstChild,r=null;for(;i;){if(i.nodeType===Node.TEXT_NODE){r=this.adjustCursorOffset(i,t);break}i=i.nextSibling}r&&r.closestNode?(o.setStart(r.closestNode,r.closestOffset),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus()):(o.selectNodeContents(e),o.collapse(!0),n.removeAllRanges(),n.addRange(o),e.focus())}adjustCursorOffset(e,t){let n=document.createRange(),o=e,i=0,r=1/0;for(let o=0;on.getBoundingClientRect().right&&(i=e.textContent.length),{closestNode:o,closestOffset:i}}getCurrentSelectedFocusable(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".focusable")}getCurrentSelectedBlock(){const e=window.getSelection();if(!e||0===e.rangeCount)return null;let t=e.getRangeAt(0).commonAncestorContainer;return t.nodeType===Node.TEXT_NODE&&(t=t.parentNode),t.closest(".block")}justifyLeft(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-left")}justifyCenter(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-center")}justifyRight(e){this.memento.saveState(),this.removeJustify(e),e.classList.add("justify-right")}changeCodeBlockLanguage(e,t){this.memento.saveState();const n=e.querySelector("code");n&&(P.removeClassesWithPrefix(n,"language-"),n.classList.add(`language-${t}`),n.removeAttribute("data-highlighted"),hljs.highlightElement(n),G.emitCodeBlockLanguageChangedEvent("code-block-language-menu",e.id,t))}removeJustify(e){const t=e.classList;for(let e=0;e div");n&&(P.removeClassesWithPrefix(n,"callout-background-"),n.classList.add(t))}}class Ke{static instance;memento;textOperationService;constructor(e){if(Ke.instance)throw new Error("Use TextOperationService.getInstance() to get instance.");this.memento=e}static getInstance(){const e=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ke(e)),this.instance}execInsertLink(e){this.memento.saveState(),document.execCommand("createLink",!1,e),setTimeout((()=>{G.emitChangeComponentColorEvent(p.Link,u.IconActiveBlue),this.normalizeAnchors()}),50)}normalizeAnchors(){document.querySelectorAll("#johannesEditor .content a").forEach((e=>{e.hasAttribute("title")||e.setAttribute("title",e.href),e.normalize()}))}execToggleLink(){this.queryAnchorCommandState()?(document.execCommand("unlink",!1),G.emitChangeComponentColorEvent("linkButton",u.IconDefaultBlack)):G.emitShowElementEvent("linkBox")}execBold(){this.memento.saveState(),document.execCommand("bold")&&(document.queryCommandState("bold")?G.emitChangeComponentColorEvent(p.Bold,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Bold,u.IconDefaultBlack))}execInlineCode(){this.memento.saveState(),this.toggleInlineCode()&&(this.queryInlineCodeCommandState()?G.emitChangeComponentColorEvent(p.InlineCode,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.InlineCode,u.IconDefaultBlack))}toggleInlineCode(){const e=window.getSelection();if(!e||0===e.rangeCount)return!1;const t=e.getRangeAt(0);let n=t.extractContents(),o=!1;const i=document.createElement("span");i.appendChild(n.cloneNode(!0)),i.querySelector("code")&&(o=!0,i.querySelectorAll("code").forEach((e=>{const t=document.createTextNode(e.textContent||"");e.parentNode?.replaceChild(t,e)})),n=i);let r=e.anchorNode;for(;r&&"CODE"!==r.nodeName&&"BODY"!==r.nodeName;)r=r.parentNode;if(r&&"CODE"===r.nodeName){o=!0;const e=document.createTextNode(r.textContent||"");r.parentNode?.replaceChild(e,r)}if(o)t.insertNode(i);else{const e=document.createElement("code");e.appendChild(n),t.insertNode(e)}e.removeAllRanges(),e.addRange(t);const l=P.getActiveContentEditable();return l&&(l.normalize(),P.mergeInlineElements(l)),!0}execItalic(){this.memento.saveState(),document.execCommand("italic")&&(document.queryCommandState("italic")?G.emitChangeComponentColorEvent(p.Italic,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Italic,u.IconDefaultBlack))}execStrikeThrough(){this.memento.saveState(),document.execCommand("strikeThrough")&&(document.queryCommandState("strikeThrough")?G.emitChangeComponentColorEvent(p.Strikethrough,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Strikethrough,u.IconDefaultBlack))}execUnderline(){this.memento.saveState(),document.execCommand("underline")&&setTimeout((()=>{document.queryCommandState("underline")?G.emitChangeComponentColorEvent(p.Underline,u.IconActiveBlue):G.emitChangeComponentColorEvent(p.Underline,u.IconDefaultBlack)}),10)}execHiliteColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("hiliteColor"),document.execCommand("hiliteColor",!1,e)&&G.emitShowHideActiveElementEvent("hiliteColor",e,"show")}execForeColor(e){this.memento.saveState(),G.emitResetActiveButtonsElementEvent("foreColor"),document.execCommand("foreColor",!1,e)&&G.emitShowHideActiveElementEvent("foreColor",e,"show")}queryCommandState(e,t){return e===h.toggleLink?this.queryAnchorCommandState():e===h.toggleUnderline?this.queryUnderlineCommandState():e===h.toggleHiliteColor?this.queryHiliteColor(t):e===h.toggleForeColor?this.queryForeColor(t):e===h.toggleInlineCode?this.queryInlineCodeCommandState():document.queryCommandState(e)}queryAnchorCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;const t=e.getRangeAt(0),n=t.startContainer,o=t.endContainer,i=e=>{for(;e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE&&"a"===e.tagName.toLowerCase())return!0;e=e.parentNode}return!1};return!(!i(n)&&!i(o))||t.cloneContents().querySelectorAll("a").length>0}queryInlineCodeCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("code"))return!0;t=t.parentNode}return!1}queryUnderlineCommandState(){const e=window.getSelection();if(!e||!e.rangeCount)return!1;let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&null!==t;){if(t.nodeType==Node.ELEMENT_NODE&&t.closest("u"))return!0;t=t.parentNode}return!1}queryForeColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("font[color]");if(!o)return!1;const i=window.getComputedStyle(o).color;return H.rgbToHex(i).toUpperCase()===e.toUpperCase()}queryHiliteColor(e){const t=window.getSelection();if(!t)return!1;if(!t.rangeCount)return!1;let n=t.getRangeAt(0).commonAncestorContainer;if(n.nodeType===Node.TEXT_NODE&&(n=n.parentNode),!(n instanceof Element))return!1;const o=n.closest("span[style*='background-color']")||n.closest("font[style*='background-color']");if(!o)return!1;const i=window.getComputedStyle(o).backgroundColor;return H.rgbToHex(i).toUpperCase()===e.toUpperCase()}getTargetElementMap(e){switch(e){case"strong":case"bold":case"b":return"strong";case"italic":case"i":case"em":return"em";case"underline":case"u":return"u";case"strikethrough":case"s":return"s";case"background":case"color":return"span";default:throw new Error}}static getSelectedHTMLElement(){const e=window.getSelection();if(e&&e.rangeCount>0){let t=e.getRangeAt(0).commonAncestorContainer;for(t.nodeType===Node.TEXT_NODE&&(t=t.parentNode);t&&!(t instanceof HTMLElement);)t=t.parentNode;if(t)return t}return null}getSelectedTextNodes(){const e=window.getSelection();if(!e||0===e.rangeCount)return[];const t=[];for(let n=0;no.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let r;for(;r=i.nextNode();)if(r.nodeType===Node.TEXT_NODE){const e=document.createRange();e.selectNodeContents(r),-1===o.compareBoundaryPoints(Range.END_TO_START,e)&&1===o.compareBoundaryPoints(Range.START_TO_END,e)&&t.push(r)}}return t}findClosestMatchingParent(e,t){for(e&&e.nodeType===Node.TEXT_NODE&&(e=e.parentElement);e&&e!==document.body;){if(e.nodeType===Node.ELEMENT_NODE){const n=e;if(n.tagName.toLowerCase()===t.nodeType.toLowerCase()&&(!t.classes||t.classes.every((e=>n.classList.contains(e)))))return n}e=e.parentElement}return null}extractSelectedText(e){const t=window.getSelection();if(!t||0===t.rangeCount)return"";const n=t.getRangeAt(0);if(e.nodeType!==Node.TEXT_NODE)return"";const o=e.textContent||"";let i=0,r=o.length;return n.intersectsNode(e)?(n.startContainer===e?i=n.startOffset:n.startContainer.contains(e)&&(i=0),n.endContainer===e?r=n.endOffset:n.endContainer.contains(e)&&(r=o.length),i{t.style.backgroundColor=e})),G.emitShowHideActiveElementEvent("backgroundColor",e,"show")):console.error("cell not found")}static isCellBackgroundColor(e,t){if(!e||"TD"!==e.tagName||!e.hasAttribute("data-placeholder"))return!1;const n=window.getComputedStyle(e).getPropertyValue("background-color");return H.rgbToHex(n).toUpperCase()===t.toUpperCase()}queryStateCellBackgroundColor(e){const t=Ne.getActiveTableCell();if(t){const n=window.getComputedStyle(t).getPropertyValue("background-color");return H.rgbToHex(n).toUpperCase()===e.toUpperCase()}return!1}queryAllStateCellBackgroundColor(e,t){let n=!0;return t!=u.BackgroundColorNone&&(e.forEach((e=>{const o=window.getComputedStyle(e).backgroundColor;H.rgbToHex(o).toLocaleLowerCase()!==t.toLocaleLowerCase()&&(n=!1)})),n)}static getInstance(){const e=D.Instance.resolve("IFocusStack"),t=D.Instance.resolve("IMemento");return this.instance||(this.instance=new Ze(e,t)),this.instance}insertRowAbove(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No cell is focused");const t=e.parentElement;if(!t)return void console.error("No row is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=n.querySelector("tbody")||n,i=Array.from(o.children).indexOf(t);i<0?console.error("Row index not found"):(Ne.addRow(n,i),G.emitCloseElementEvent(Le.TableToolbar))}insertRowBelow(e){if(this.memento.saveState(),e){const t=e.querySelector("table");if(!t)return void console.error("Table does not exist");{const e=t.querySelector("tr:last-child");if(!e)return void console.error("No rows in the table");{const n=Array.from(t.children[0].children).indexOf(e)+1;Ne.addRow(t,n)}}}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.parentElement,o=t.closest("table");if(!o)return void console.error("Table does not exist");if(n){const e=Array.from(o.children[0].children).indexOf(n)+1;Ne.addRow(o,e),G.emitCloseElementEvent(Le.TableToolbar)}}}insertColumnLeft(){this.memento.saveState();const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o),G.emitCloseElementEvent(Le.TableToolbar)}insertColumnRight(e){if(this.memento.saveState(),e){const t=e.querySelector("table");t&&Ne.addColumn(t)}else{const e=this.focusStack.peek();if(!e)return void console.error("No focused element available");const t=e.closest("td");if(!t)return void console.error("No cell is focused");const n=t.closest("table");if(!n)return void console.error("Table does not exist");const o=Array.from(t.parentElement.children).indexOf(t);Ne.addColumn(n,o+1),G.emitCloseElementEvent(Le.TableToolbar)}}showInsertLineElement(e){e.querySelector(".add-table-row").style.visibility="visible"}showInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="visible"}hideInsertRowElement(e){e.querySelector(".add-table-row").style.visibility="hidden"}hideInsertColumnElement(e){e.querySelector(".add-table-column").style.visibility="hidden"}changeTableBorderColor(e,t){const n=this.focusStack.peek()?.closest(g.TABLE);n&&Ne.changeCellBorderColor(n,e,t)}}class We{static query="#johannesEditor .content-wrapper";static instance;undoStack=[];redoStack=[];get content(){return document.querySelector(We.query)}constructor(){if(We.instance)throw new Error("Use Memento.getInstance() to get instance.");this.attachEvents(),this.saveState()}saveState(){if(this.content){const e=this.content.cloneNode(!0);setTimeout((()=>{const t=P.saveCaretPosition3d(this.content);e.querySelectorAll(`.${l.EditorOnly}`).forEach((e=>e.remove())),this.undoStack.push({html:e.innerHTML,caretPosition:t}),this.redoStack=[]}),10)}}undo(){if(this.undoStack.length>1){this.redoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.undoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}redo(){if(this.redoStack.length>0){this.undoStack.push({html:this.content.innerHTML,caretPosition:P.saveCaretPosition3d(this.content)});const e=this.redoStack.pop();e&&(this.content.innerHTML=e.html,P.restoreCaretPosition3d(this.content,e.caretPosition))}}attachEvents(){document.addEventListener("keydown",(e=>{e.ctrlKey&&"z"===e.key?(this.undo(),e.preventDefault()):e.ctrlKey&&"y"===e.key&&(this.redo(),e.preventDefault())})),document.addEventListener(a.Keyup,(e=>{e.key==A.Space&&this.saveState()}))}static getInstance(){return We.instance||(We.instance=new We),We.instance}}!function(e){e.First="First",e.Last="Last"}(Me||(Me={}));class $e{static instance;quickMenu;constructor(e){document.addEventListener("keydown",this.handleArrowKeys.bind(this)),this.quickMenu=e}listen(){console.log("EditableNavigation is now listening for key events.")}static getInstance(){if(!$e.instance){const e=D.Instance.resolve("IQuickMenu");$e.instance=new $e(e)}return $e.instance}handleArrowKeys(e){if(!this.quickMenu.isVisible&&e.key.startsWith("Arrow")&&!e.altKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){const t=document.activeElement;if(t&&t.isContentEditable&&this.shouldSwitchEditable(t,e.key)){const n=this.findNextEditable(t,e.key);n&&(e.preventDefault(),e.stopImmediatePropagation(),e.key!=ye.ArrowUp&&e.key!=ye.ArrowDown||this.placeCaretInSimilarPosition(t,n),e.key==ye.ArrowLeft&&P.placeCursorAtEndOfEditableElement(n),e.key==ye.ArrowRight&&P.placeCursorAtStartOfEditableElement(n),n.focus())}}}shouldSwitchEditable(e,t){const n=window.getSelection();if(n&&n.rangeCount>0){let e=n.getRangeAt(0);if(e.endOffset!=e.startOffset)return!1}if(n&&n.rangeCount>0){const{atStart:n,atEnd:o}=P.getSelectionTextInfo(e),i=this.isAtLineBoundary(e,Me.First),r=this.isAtLineBoundary(e,Me.Last);return!!(t===ye.ArrowLeft&&n||t===ye.ArrowRight&&o||t===ye.ArrowUp&&(n||i)||t===ye.ArrowDown&&(o||r))}return!1}isAtLineBoundary(e,t){if(""===e.textContent?.trim())return!0;const n=window.getSelection();if(!n||0===n.rangeCount)return!1;const o=n.getRangeAt(0).getClientRects()[0];if(!o)return!0;const i=e.getBoundingClientRect();return t===Me.First?Math.abs(o.top-i.top)<11:t===Me.Last&&Math.abs(o.bottom-i.bottom)<11}findNextEditable(e,t){const n=Array.from(document.querySelectorAll('[contenteditable="true"]')),o=n.indexOf(e);if(e.closest("td")){const n=e.closest("table"),o=e.closest("td");if(n&&o){const e=Ne.getNeighborCell(n,o,t);if(e)return e}}let i=-1;return i=t===ye.ArrowLeft||t===ye.ArrowRight?t===ye.ArrowLeft?o-1:o+1:this.findVerticalEditableIndex(e,n,t),i<0||i>=n.length?null:n[i]||null}findVerticalEditableIndex(e,t,n){let o=t.indexOf(e);return n===ye.ArrowUp?o--:n===ye.ArrowDown&&o++,o>=0&&o0){const e=n.getRangeAt(0).getBoundingClientRect();n.removeAllRanges();const o=document.createRange(),i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);let r=i.nextNode(),l=r,s=0,a=1/0;if(l){do{if(r&&r.nodeValue){o.setStart(r,0),o.setEnd(r,r.nodeValue.length);for(let t=0;tWe.getInstance())),D.Instance.register("IShortcutListeners",(()=>ze.getInstance())),D.Instance.register("ITableListeners",(()=>Ye.getInstance())),D.Instance.register("IFocusStack",(()=>Ue.getInstance())),D.Instance.register("IElementFactoryService",(()=>O.getInstance())),D.Instance.register("ITextOperationsService",(()=>Ke.getInstance())),D.Instance.register("ITableOperationsService",(()=>Ze.getInstance())),D.Instance.register("IBlockOperationsService",(()=>Ge.getInstance())),D.Instance.register("IQuickMenu",(()=>Ee.getInstance())),D.Instance.register("ITableContextFloatingToolbar",(()=>Oe.getInstance())),D.Instance.register("IEditableNavigation",(()=>$e.getInstance())),_e.build().start(),je.getInstance().listen(),$e.getInstance().listen(),pe.getInstance().listen()}))})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SyxTQUFTLHVCQUF1QixJQUFNZ3lDLEdBQW1CdHdDLGdCQUV0RmtsQyxHQUFVN2pCLFFBQVE4akIsUUFFbEJHLEdBQWtCdGxDLGNBQWNpcUIsU0FDaENxbUIsR0FBbUJ0d0MsY0FBY2lxQixTQUNqQ2IsR0FBYXBwQixjQUFjaXFCLFFBRS9CLEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9hc3NldHMvY3NzL21haW4uY3NzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL2pvaGFubmVzLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2pvaGFubmVzL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvd2VicGFjay9ydW50aW1lL25vbmNlIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Db250ZW50VHlwZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0ljb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9Ub29sYm94T3B0aW9ucy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ29tbW9uQ2xhc3Nlcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ3VzdG9tVUlFdmVudHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0RlZmF1bHRKU0V2ZW50cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ3VzdG9tRXZlbnRzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9aSW5kZXgudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0NvbG9ycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9Db21tYW5kcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0J1dHRvbklEcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vS2V5Ym9hcmRLZXlzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRHJvcGRvd25JdGVtSURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9ET01FbGVtZW50cy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0Ryb3Bkb3duTGlzdElEcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0Ryb3Bkb3duTWVudUlEcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9hc3NldHMvY3NzL21haW4uY3NzPzFmYmEiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvdXRpbGl0aWVzL1V0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9jb21tb24vQmFzZVVJQ29tcG9uZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy91dGlsaXRpZXMvRE9NVXRpbHMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL0Zsb2F0aW5nVG9vbGJhci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQ29sb3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL1Nob3dIaWRlQWN0aXZlQnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL1VJQWN0aW9ucy9SZXNldEFjdGl2ZUJ1dHRvbnMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL0Nsb3NlRWxlbWVudC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0VsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1hbmRzL0V2ZW50RW1pdHRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2xpbmstYm94L0lucHV0TGlua0JveC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvbGluay1ib3gvSW5wdXRMaW5rQm94V3JhcHBlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2VkaXRvci9FZGl0b3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tCdXR0b24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9hZGQtYmxvY2svQWRkQmxvY2tXcmFwcGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9TaXplcy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0FkZEJsb2NrQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbW9uL0Jhc2VEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9KTm9kZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3QudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb24udHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9CbG9ja1Rvb2xib3hCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9CbG9ja1Rvb2xib3gudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51RW1wdHkudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21tb24vRG91Ymx5TGlua2VkTGlzdC50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51SXRlbS50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9RdWlja01lbnVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvdGl0bGUvVGl0bGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGl0bGVCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9EaXJlY3Rpb25zLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXMudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1NlbGVjdGlvbk1vZGUudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9FbWJlZFRvb2wudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9Ub29sYmFySURzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbW1vbi9Cb3VuZGFyaWVzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3V0aWxpdGllcy9UYWJsZVV0aWxzLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvY29udGVudC9Db250ZW50LnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2J1aWxkZXJzL0NvbnRlbnRCdWlsZGVyLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvTWVkaWFJbnB1dHRlckJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvYnVpbGRlcnMvRWRpdG9yQnVpbGRlci50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9idWlsZGVycy9VSUJ1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvY29yZS9TaG9ydGN1dExpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0ZvY3VzU3RhY2sudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL3NlcnZpY2VzL3RleHQtb3BlcmF0aW9ucy9UZXh0T3BlcmF0aW9uc1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vam9oYW5uZXMvLi9zcmMvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnRzIiwid2VicGFjazovL2pvaGFubmVzLy4vc3JjL2NvcmUvTWVtZW50by50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9jb3JlL0VkaXRhYmxlTmF2aWdhdGlvbi50cyIsIndlYnBhY2s6Ly9qb2hhbm5lcy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBgLyoqIGN1cnNvciBzdHlsZSAqL1xuW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0ge1xuICAgIGN1cnNvcjogdGV4dCAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcCAhaW1wb3J0YW50O1xufVxuXG5cblxuLyoqIENTUyByZXNldCAqL1xuXG4uYnV0dG9uLXJlc2V0IHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IGluaGVyaXQ7XG4gICAgZm9udDogaW5oZXJpdDtcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGluaGVyaXQ7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG5cblxuLyoqIGFkZCBibG9jayAqL1xuLmFkZC1ibG9jayB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1hcmdpbi1sZWZ0OiAxLjNyZW07XG59XG5cbi5hZGQtYmxvY2std3JhcHBlciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcbn1cblxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG5cbi8qKiBhbmQgYWRkIGJsb2NrICovXG5cblxuXG4vKiogTGlzdCAgKiovXG4ubGlzdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGdhcDogMTBweDtcblxufVxuXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XG4gICAgbWFyZ2luLXRvcDogMC41cmVtO1xufVxuXG4ubGlzdCBsaSBkaXYge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICAgIG1pbi13aWR0aDogMTAwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG59XG5cbm9sLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCxcbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtICFpbXBvcnRhbnQ7XG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk+YnV0dG9uIHtcbiAgICAvKiBkaXNwbGF5OiBub25lOyAqL1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIHRvcDogMDtcblxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG5cbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG59XG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgbGk6OmJlZm9yZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuMzEyNXJlbTtcbn1cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBsaTpob3Zlcj5idXR0b24ge1xuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcblxufVxuXG5wLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwICFpbXBvcnRhbnQ7XG59XG5cblxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcbn1cblxuXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IHVsLmNoZWNrYm94LWxpc3QgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQrc3BhbiB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50Om5vdCguY2hlY2tib3gtbGlzdCkge1xuICAgIHBhZGRpbmctbGVmdDogMS41cmVtICFpbXBvcnRhbnQ7XG59ICovXG5cbi8qKiBBZGQgbGluZSB0aHJvdWdoIHRleHQgZGVjb3JhdGlvbiB0byBjaGVja2VkIGNoZWNrYm94ZXMgdGV4dCBkaXYgKi9cbi5ibG9jayBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Y2hlY2tlZCtkaXYge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xufVxuXG4vKiogUmVtb3ZlIHRoZSBkZWZhdWx0IGxpc3Qgc3R5bGUgYW5kIHJlcGxhY2UgYnkgYW5vdGhlciB0aGF0IHdvcmtzIHdpdGggZGlzcGxheSBmbGV4ICovXG4uYmxvY2sgb2wsXG4uYmxvY2sgdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi5ibG9jayB1bCAubGlzdC1pdGVtLFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxufVxuXG4uYmxvY2sgb2wgbGkge1xuICAgIGNvdW50ZXItaW5jcmVtZW50OiBpdGVtO1xufVxuXG4uYmxvY2sgb2wgbGk6OmJlZm9yZSB7XG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcIi5cIjtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC8qIHdpZHRoOiAxOHB4OyAqL1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cblxuLmJsb2NrIHVsIGxpOm5vdCgubm8tbGlzdC1zdHlsZSk6OmJlZm9yZSB7XG4gICAgY29udGVudDogXCLigKJcIjtcbiAgICBtYXJnaW4tcmlnaHQ6IDAuMzEyNXJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC8qIHdpZHRoOiAxOHB4OyAqL1xufVxuXG4ubGlzdC1pdGVtLWNoZWNrYWJsZSBpbnB1dCB7XG4gICAgLyogd2lkdGg6IDE4cHg7ICovXG4gICAgbWFyZ2luLXJpZ2h0OiAwLjMxMjVyZW07XG59XG5cblxuLyoqIGFuZCBsaXN0ICoqL1xuXG5cblxuLmRyYWctaGFuZGxlciB7XG4gICAgY29sb3I6ICM4NDg4OGQ7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGN1cnNvcjogZ3JhYjtcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcbiAgICBwYWRkaW5nLXRvcDogMC4zM3JlbTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbi5kcmFnLWhhbmRsZXItd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMDtcbiAgICB3aWR0aDogMDtcbn1cblxuXG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHtcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7ICovXG59XG5cbi5kcmFnLWhhbmRsZXIgc3ZnIHVzZSB7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cbn1cblxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xuICAgIGN1cnNvcjogZ3JhYmJpbmc7XG59XG5cbi5ibG9jayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xuICAgIHBhZGRpbmctbGVmdDogMS4yNXJlbSAhaW1wb3J0YW50O1xufVxuXG4uYmxvY2s6aG92ZXIgLmRyYWctaGFuZGxlciB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzO1xufVxuXG4vKiAuYmxvY2s6aG92ZXIgLmJsb2NrLXRvb2xiYXIge1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG59ICovXG5cbi5kcm9wLWxpbmUge1xuICAgIGhlaWdodDogMXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjODQ4ODhkO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG5cbi50aXRsZSBoMSB7XG4gICAgbWFyZ2luLWxlZnQ6IDEuM3JlbTtcbiAgICBsaW5lLWhlaWdodDogM3JlbTtcbn1cblxuXG5bY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpmb2N1cyB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4ZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuaDFbZGF0YS1wbGFjZWhvbGRlcl06ZW1wdHk6YmVmb3JlIHtcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xuICAgIGNvbG9yOiAjODQ4ODhkICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmgxW2RhdGEtcGxhY2Vob2xkZXJdOmZvY3VzOmJlZm9yZSB7fVxuXG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbipbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoaDEpOmVtcHR5OmhvdmVyOmJlZm9yZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbmNpdGVbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpiZWZvcmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4qW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl06bm90KGgxKVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpmb2N1czpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZCAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5saS5kaXZbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXTplbXB0eTpob3ZlcjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBibG9jaztcbn1cblxuXG5cbmgxIHtcbiAgICBmb250LXNpemU6IDIuNXJlbTtcbiAgICBmb250LXdlaWdodDogYm9sZGVyICFpbXBvcnRhbnQ7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3Ige1xuICAgIHdpZHRoOiAxMDAlO1xuXG59XG5cbi5jb250ZW50IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cbn1cblxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgIG92ZXJmbG93LXk6IGhpZGRlbjtcbn1cblxuXG4vKiBwcmUge1xuICAgIHdpZHRoOiAxMDAlO1xufSAqL1xuXG5bY29udGVudGVkaXRhYmxlXSB7XG4gICAgb3V0bGluZTogbm9uZTtcbn1cblxuYm9keSB7XG4gICAgLyogbWluLWhlaWdodDogMjAwMHB4OyAqL1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuXG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJOb3RvIFNhbnNcIiwgXCJMaWJlcmF0aW9uIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWYsIFwiQXBwbGUgQ29sb3IgRW1vamlcIiwgXCJTZWdvZSBVSSBFbW9qaVwiLCBcIlNlZ29lIFVJIFN5bWJvbFwiLCBcIk5vdG8gQ29sb3IgRW1vamlcIjtcbn1cblxuXG5cbi5lZGl0b3Ige1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgbWFyZ2luLXRvcDogODBweDtcbn1cblxucCB7XG4gICAgY29sb3I6ICMyNDI0MjQ7XG59XG5cblxuLmJsb2NrLFxuLmJsb2NrICoge1xuICAgIHVzZXItc2VsZWN0OiB0ZXh0O1xufVxuXG5cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xufVxuXG5cbiNqb2hhbm5lc0VkaXRvciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgaHIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMnB4O1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xufVxuXG5cblxuLmpvaGFubmVzLWVkaXRvciBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHJnYig1NSwgNTMsIDQ3KTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZSB7XG4gICAgcGFkZGluZy10b3A6IDFyZW0gIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG5cblxuLmpvaGFubmVzLWVkaXRvciBjaXRlOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6ICfigJQgJztcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuI2xpbmtCb3gge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7ICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbiNsaW5rQm94IC5oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIDtcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gICAgLyogZm9udC1zaXplOiAwLjc1cmVtOyAqL1xuICAgIC8qIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNik7ICovXG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xufVxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IDFyZW07XG4gICAgcGFkZGluZzogMjBweDtcbn1cblxuXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwgaW5wdXQge1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIGhlaWdodDogMS41cmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cblxuLmN0cmwtYWN0aXZlIC5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgYSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5cblxuXG4vKiAjbGlua0JveCB7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcblxuXG4gICAgYm94LXNoYWRvdzpcbiAgICAgICAgMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKSxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXG4gICAgICAgIDJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpO1xuXG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZDBkMGQwO1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcbiAgICBib3JkZXItcmFkaXVzOiBub25lO1xufVxuXG5cbiNsaW5rQm94IGlucHV0IHtcbiAgICB3aWR0aDogMzE2cHg7XG4gICAgcGFkZGluZzogOHB4IDQwcHggOHB4IDE2cHg7XG5cbiAgICBib3JkZXI6IDFweCBzb2xpZCAjOTQ5NDk0O1xuICAgIGhlaWdodDogMjRweDtcblxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5cbiNsaW5rQm94IGlucHV0OjpzZWxlY3Rpb24sXG4jbGlua0JveCBpbnB1dDpmb2N1cyB7XG4gICAgYm9yZGVyLXJhZGl1czogbm9uZTtcbn0gKi9cblxuLyoqIHNvZnQtYm94LXNoYWRvdyBjbGFzcyAqL1xuLnNvZnQtYm94LXNoYWRvdyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGJveC1zaGFkb3c6XG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXG4gICAgICAgIDAgLTJweCA0cHggcmdiYSgyMTYsIDE5NiwgMTk2LCAwLjAyKSxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcblxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XG59XG5cbi8qKiBhbmQgc29mdC1ib3gtc2hhZG93ICovXG5cblxuLyoqIHNlbGVjdGlvbi13cmFwcGVyIGNsYXNzICovXG4uc2VsZWN0LXdyYXBwZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uc2VsZWN0LXdyYXBwZXIgdWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xuICAgIHBhZGRpbmctbGVmdDogNXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgICB0b3A6IDIuMnJlbTtcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xuICAgIHBhZGRpbmctcmlnaHQ6IDAuMzEyNXJlbTtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xuICAgIHBhZGRpbmc6IDAuMTg3NXJlbSAwLjMxMjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSBzcGFuLFxuLnNlbGVjdC13cmFwcGVyIGJ1dHRvbiBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcbiAgICB3aWR0aDogMS4zNzVyZW07XG4gICAgaGVpZ2h0OiAxLjM3NXJlbTtcbiAgICBjb2xvcjogIzI0MjQyNDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG5cbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuXG4uc2VsZWN0LXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xufVxuXG4uc2VsZWN0LXdyYXBwZXI+YnV0dG9uIHtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjg1KTtcbn1cblxuLnNlbGVjdC13cmFwcGVyIHVsIGxpPmgzIHtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMzczNTJmYTY7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XG59XG5cbi8qKiBlbmQgc2VsZWN0aW9uIHdyYXBwZXIgKiovXG5cblxuXG4vKiogVGV4dCBmb3JtYXR0aW5nIEJhciAqKi9cblxuXG5cbi5mbG9hdGluZy10b29sYmFyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0ge1xuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGdhcDogMTBweDtcbn1cblxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcblxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cblxuLmZsb2F0aW5nLXRvb2xiYXIgc2VsZWN0IHtcbiAgICBjb2xvcjogcmdiKDEyMCwgMTE5LCAxMTYpO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1zZWxlY3QtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuI3R1cm5JbnRvQnV0dG9uIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcblxufVxuXG4jdHVybkludG9CdXR0b24gc3ZnIHVzZSB7XG4gICAgbWFyZ2luOiBhdXRvO1xufVxuXG4vKiBjb2RlOm5vdChwcmUgY29kZSkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjVmNDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDAwMDFhO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn0gKi9cblxuXG5cblxuLyogYTpub3QoW2hyZWZdKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcbn0gKi9cblxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcbiAgICBjb2xvcjogIzIzODJlMjtcbn1cblxuLnRleHQtZm9ybWF0dGluZy1jaXJjbGUtYWN0aXZlIHtcbiAgICBib3JkZXItY29sb3I6ICMyMzgyZTIgIWltcG9ydGFudDtcbn1cblxuXG5cbiNtb3JlVGV4dE9wdGlvblNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ubW9yZVRleHRPcHRpb25XcmFwcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cblxuLmJnYy1yZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRERFREU7XG59XG5cbi5iZ2MtZ3JlZW4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XG59XG5cbi5iZ2MtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbn1cblxuLmJnYy15ZWxsb3cge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQUY0RDE7XG59XG5cbi5iZ2MtZ3JleSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcbn1cblxucCxcbm1hcmsge1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG4jdHVybkludG9TZWxlY3QgLm9wdGlvbi1pbWFnZSB7XG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xufVxuXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbn1cblxuXG5cblxuLyoqIEJsb2NrIE9wdGlvbnMgKiovXG5cbi5ibG9jay1vcHRpb25zLXdyYXBwZXIge1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMge1xuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uYmxvY2stb3B0aW9ucyB7XG4gICAgcGFkZGluZzogMCAwLjYyNXJlbTtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbn1cblxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjMzczNTJmYTY7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC13ZWlnaHQ6IDYwMCAhaW1wb3J0YW50O1xuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjMxMjVyZW07XG4gICAgcGFkZGluZy1sZWZ0OiAwLjMxMjVyZW07XG59XG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb24ge1xuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcbiAgICBtYXJnaW46IDAuMzEyNXJlbSAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG4gICAgZ2FwOiAwLjZyZW07XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xufVxuXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuLm9wdGlvbi1mb2N1c2VkIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgYm9yZGVyOiBub25lO1xufVxuXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcbi5kYW5nZXItb3B0aW9uLm9wdGlvbi1mb2N1c2VkIHN2ZyB7XG4gICAgY29sb3I6ICNFQjU3NTcgIWltcG9ydGFudDtcbn1cblxuXG5cbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xuICAgIGJvcmRlcjogaW5oZXJpdDtcbn1cblxuLyogLm9wdGlvbi1ob3Zlcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xufSAqL1xuXG4vKiAuc2VsZWN0LXdyYXBwZXI+YnV0dG9uLCAqL1xuXG4vKiAjdHVybkludG9CdXR0b24sXG4jY29sb3JUZXh0QnV0dG9uIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcbn0gKi9cblxuI2NvbG9yVGV4dEJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDAuNjI1cmVtO1xufVxuXG4jdHVybkludG9CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuI2NvbG9yVGV4dEJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIsXG4jbW9yZVRleHRPcHRpb25CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xufVxuXG5cblxuLm9wdGlvbltmb2N1c2VkPVwidHJ1ZVwiXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcbn1cblxuLm9wdGlvbi1pbWFnZSB7XG4gICAgd2lkdGg6IDIuODc1cmVtO1xuICAgIGhlaWdodDogMi44NzVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgY29sb3I6ICM0ZjRmNGY7XG5cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5vcHRpb24taW1hZ2UgaW1nIHtcbiAgICBtYXgtd2lkdGg6IDIuODc1cmVtO1xuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xufVxuXG4ub3B0aW9uLWltYWdlIHN2ZyB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgcGFkZGluZzogMC42MjVyZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxufVxuXG4ub3B0aW9uLXRleHQgKiB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbn1cblxuLm9wdGlvbi10ZXh0IC5ibG9jay10aXRsZSB7XG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5vcHRpb24tdGV4dCAuYmxvY2stZGVzY3JpcHRpb24ge1xuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xufVxuXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXG5cblxuXG4vKiAjZGVsZXRlQmxvY2tCdXR0b246aG92ZXIgc3ZnLFxuI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHtcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xufSAqL1xuXG5cblxuLmpvaGFubmVzLWVkaXRvciAqOjpzZWxlY3Rpb24ge1xuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxMCA3NSUgNTAlIC8gMSk7XG4gICAgY29sb3I6IHdoaXRlO1xufVxuXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXG4uam9oYW5uZXMtZWRpdG9yICo6bm90KGgxKSB7XG4gICAgbGluZS1oZWlnaHQ6IDEuNSAhaW1wb3J0YW50O1xufVxuXG4ub3B0aW9uIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbi50ZXh0LW9wdGlvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IDAuNjI1cmVtO1xufVxuXG5cblxuXG46cm9vdCB7XG4gICAgLyogZm9udC1zaXplOiAxNnB4OyAqL1xuICAgIC8qIFRhbWFuaG8gcGFkcsOjbyAqL1xufVxuXG4vKiBQYXJhIHRlbGFzIGNvbSBkZW5zaWRhZGUgbcOpZGlhICovXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMTkyZHBpKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDJkcHB4KSB7XG4gICAgOnJvb3Qge1xuICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgIC8qIEF1bWVudGEgbyB0YW1hbmhvIGRhIGZvbnRlIHBhcmEgdGVsYXMgZGUgYWx0YSBkZW5zaWRhZGUgKi9cbiAgICB9XG59XG5cbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDMpLFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDNkcHB4KSB7XG4gICAgOnJvb3Qge1xuICAgICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICAgIC8qIEFpbmRhIG1haW9yIHBhcmEgdGVsYXMgZGUgZGVuc2lkYWRlIG11aXRvIGFsdGEgKi9cbiAgICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgIG1heC13aWR0aDogaW5oZXJpdDtcbiAgICB3aWR0aDogYXV0bztcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbn1cblxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcbiAgICBtaW4taGVpZ2h0OiAyMHB4O1xufVxuXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XG4gICAgcGFkZGluZzogOHB4O1xuICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xuICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgIG1heC13aWR0aDogMjAwcHg7XG4gICAgLyogYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OyAqL1xuXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xuXG59XG5cbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZC5zZWxlY3RlZCxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZDpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZTtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggIzc0YjZkYiBpbnNldDtcbiAgICBib3JkZXI6IDFweCBkb3VibGUgIzc0YjZkYjtcblxufVxuXG50ZCB7XG4gICAgbWluLWhlaWdodDogMXJlbSAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxcmVtO1xufVxuXG50ZDo6cGxhY2Vob2xkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG50ZDplbXB0eTpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XG4gICAgY29sb3I6ICM4NDg4OGFjZDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG9wYWNpdHk6IDA7XG59XG5cbi50YWJsZS13cmFwcGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRhYmxlLWNvbnRyb2xsZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cbi5hZGQtdGFibGUtcm93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuMDYpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAxcmVtO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG4uYWRkLXRhYmxlLWNvbHVtbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAtMS4zMTI1cmVtO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XG4gICAgd2lkdGg6IDFyZW07XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDFyZW0gLSA1cHgpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcbiAgICBvcGFjaXR5OiAxO1xufVxuXG4uYWRkLXRhYmxlLXJvdzpob3ZlciB7XG4gICAgb3BhY2l0eTogMTtcbn1cblxuLnRhYmxlLXNoZWxsIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG59XG5cblxuXG4udGFibGUtb3B0aW9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cblxuXG4vKiogQ2FsbG91dCAqKi9cblxuLmNhbGxvdXQtd3JhcHBlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcbn1cblxuLmNhbGxvdXQ6aG92ZXIgLm9wdGlvbnMtYnV0dG9uIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuXG4uY2FsbG91dCBwIHtcbiAgICBtYXJnaW46IDA7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtcmVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkRERURFO1xuICAgIGJvcmRlci1jb2xvcjogI2U0YzhjODtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmVlbiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcbiAgICBib3JkZXItY29sb3I6ICNjMmRlYzY7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQtYmx1ZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q5RURGNjtcbiAgICBib3JkZXItY29sb3I6ICNjM2Q1ZGQ7XG59XG5cbi5jYWxsb3V0LWJhY2tncm91bmQteWVsbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2RmO1xuICAgIGJvcmRlci1jb2xvcjogI2ZiZjVkNjtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ncmV5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2VjO1xuICAgIGJvcmRlci1jb2xvcjogI2U3ZTZlNjtcbn1cblxuLmNhbGxvdXQtYmFja2dyb3VuZC1ub25lIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XG5cbn1cblxuLyoqIGVuZCBjYWxsb3V0ICovXG5cblxuLyoqIG1lZGlhSW5wdXR0ZXIgKiovXG4ubWVkaWFJbnB1dHRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG59XG5cbi8qKiBtZWRpYUlucHV0dGVyICoqL1xuXG5cbi5uby1zZWxlY3Rpb24ge1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5wb2ludGVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cblxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cblxuLnRhYi1jb250YWluZXIge1xuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xuXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XG5cblxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG5cbn1cblxuLm5hdi11bmRlcmxpbmUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi1yaWdodDogMTVweDtcbn1cblxuLm5hdi11bmRlcmxpbmUgLm5hdi1saW5rIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC41KTtcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XG59XG5cblxuLm5hdi1pdGVtLmFjdGl2ZSAubmF2LWxpbmsge1xuICAgIGNvbG9yOiAjMDAwO1xufVxuXG4udGFiLWNvbnRlbnQgLmNvbnRlbnQtZGF0YSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBwYWRkaW5nOiAyMHB4O1xuICAgIGJvcmRlci10b3A6IG5vbmU7XG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xufVxuXG4udGFiLWNvbnRlbnQgLmNvbnRlbnQtZGF0YS5hY3RpdmUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZ2FwOiAxcmVtO1xufVxuXG4udGFiLWNvbnRlbnQgLnRleHQtaW5mbyB7XG4gICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNik7XG59XG5cbi5uYXYtdW5kZXJsaW5lIC5uYXYtaXRlbSB7XG4gICAgZGlzcGxheTogaW5saW5lO1xufVxuXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG4gICAgaGVpZ2h0OiAxLjVyZW07XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmctbGVmdDogMTBweDtcbn1cblxuXG4udXBsb2FkLWNvbnRlbnQgbGFiZWwge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTUsIDUzLCA0NywgMC4xNik7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHdpZHRoOiAyMHJlbTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgcGFkZGluZzogNHB4O1xuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAvKiB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7ICovXG59XG5cbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuLyogRXN0aWxvIHBhcmEgYXMgYWzDp2FzIGRlIHJlZGltZW5zaW9uYW1lbnRvICovXG4ucmVzaXplLWhhbmRsZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMHB4O1xuICAgIGhlaWdodDogMTBweDtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG4gICAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbiAgICAvKiBDdXJzb3IgZGUgcmVkaW1lbnNpb25hbWVudG8gZGlhZ29uYWwgKi9cbn1cblxuLnJlc2l6ZS1oYW5kbGUuc2Uge1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbn1cblxuLnNwb3RpZnktZW1iZWQge1xuICAgIG1pbi1oZWlnaHQ6IDE1MnB4O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogLjc1cmVtICFpbXBvcnRhbnQ7XG59XG5cbi5naXN0LWVtYmVkIHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuLnNuaXBwZXQtZW1iZWQge1xuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogMTUwcHggIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4uZW1iZWQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcGFkZGluZy1ib3R0b206IDU2LjI1JTtcbiAgICBoZWlnaHQ6IDA7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5lbWJlZC1jb250YWluZXIgaWZyYW1lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG5cbi5pZnJhbWUtd3JhcHBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG5cblxuLnZpZGVvLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG4gICAgaGVpZ2h0OiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi52aWRlby1jb250YWluZXIgaWZyYW1lIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xufVxuXG5cblxuXG5cblxuXG4ueC1yZXNpemFibGUge1xuICAgIHJlc2l6ZTogaG9yaXpvbnRhbDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBjdXJzb3I6IG5lc3ctcmVzaXplO1xuICAgIG1pbi13aWR0aDogMjUwcHg7XG59XG5cbi55LXJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiB2ZXJ0aWNhbDtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcbiAgICBtaW4taGVpZ2h0OiAxNTBweDtcbn1cblxuLmJhY2tncm91bmQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlN2U2ZTM7XG59XG5cblxuLmZpdC1jb250ZW50IHtcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAuZW1iZWQtY29udGFpbmVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5tb3JlLW9wdGlvbnMtYnV0dG9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHotaW5kZXg6IDk5OTk5OTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG5cbn1cblxuLmNvbnRleHQtbWVudSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMjBweDtcbiAgICByaWdodDogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIHotaW5kZXg6IDEwO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5tb3JlLW9wdGlvbnMtYnV0dG9uOmFjdGl2ZSArIC5jb250ZXh0LW1lbnUsXG4ubW9yZS1vcHRpb25zLWJ1dHRvbjpmb2N1cyArIC5jb250ZXh0LW1lbnUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5cbi5iYmJ1dG9ue1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbn0gKi9cblxuXG4vKiogQmxvY2tUb29sYmFyIGNvbXBvbmVudCAqKi9cbi5ibG9jay10b29sYmFyLXdyYXBwZXIge1xuICAgIHdpZHRoOiAwO1xuICAgIGhlaWdodDogMDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogY29udGVudHM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgXG59XG5cbi5ibG9jay10b29sYmFyIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBnYXA6IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIHBhZGRpbmctbGVmdDogMTBweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xuICAgIHRyYW5zaXRpb246IHZpc2liaWxpdHkgMC4ycztcblxuICAgIHRvcDogNXB4O1xuICAgIHJpZ2h0OiA1cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xufVxuXG4uYmxvY2stdG9vbGJhciAuaXRlbSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5ibG9jay10b29sYmFyIC5pdGVtIGJ1dHRvbiB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLmJsb2NrLXRvb2xiYXIgYnV0dG9uIHtcbiAgICBjb2xvcjogYmxhY2s7XG59XG5cbi5ibG9jay10b29sYmFyIC5jb2xvci1pbnRlcmFjdGl2ZS1idXR0b24ge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG4vKiogRW5kIEJsb2NrVG9vbGJhciBjb21wb25lbnQgKiovXG5cblxuXG4uanVzdGlmeS1sZWZ0IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XG59XG5cbi5qdXN0aWZ5LWNlbnRlciB7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5qdXN0aWZ5LXJpZ2h0IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHJpZ2h0O1xufVxuXG5cbi5oaWRkZW4ge1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50O1xufVxuXG5cblxuXG5maWd1cmUge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xufVxuXG5cbi5vdmVyZmxvdy1oaWRkZW4ge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qKiBJbmxpbmUgQ29kZSAqKi9cbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgY29kZTpub3QocHJlIGNvZGUpIHtcbiAgICBmb250LXNpemU6IDFyZW07XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzdhO1xuICAgIHBhZGRpbmc6IDAgM3B4O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xufVxuXG4vKiogQ29udGVudCBwbGFjZWhvbGRlciAqL1xuXG4uY29udGVudC1wbGFjZWhvbGRlciB7XG4gICAgcGFkZGluZzogMXJlbTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBnYXA6IDVweDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuLmNvbnRlbnQtcGxhY2Vob2xkZXIgLmljb24td3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbi1yaWdodDogOHB4O1xufVxuXG5cbi8qIGVuZCBDb250ZW50IHBsYWNlaG9sZGVyICovXG5cblxuXG4vKiogQ29kZSAqKi9cblxucHJlIHtcbiAgICBtYXJnaW46IDA7XG59XG5cbnByZSBjb2RlIHtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbi5pZ25vcmUtZXZlbnRzIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jb2RlLWJsb2NrIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jb2RlLWJsb2NrIHNlbGVjdCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4uY29kZS1ibG9jayBzZWxlY3Qge1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgcGFkZGluZzogNHB4IDhweDtcbiAgICBmb250OiBpbmhlcml0O1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMTBweCBjZW50ZXI7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbi5jb2RlLWJsb2NrOmhvdmVyIHNlbGVjdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG5cblxuXG4uY29kZS1ibG9jayBjb2RlIHtcbiAgICBmb250LXNpemU6IDFyZW07XG5cbn1cblxuXG5cbkBrZXlmcmFtZXMgc2hha2Uge1xuXG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgICB9XG5cbiAgICAyNSUsXG4gICAgNzUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01cHgpO1xuICAgIH1cblxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1cHgpO1xuICAgIH1cbn1cblxuLnNoYWtlLWFuaW1hdGlvbiB7XG4gICAgYW5pbWF0aW9uOiBzaGFrZSAwLjZzIGN1YmljLWJlemllciguMzYsIC4wNywgLjE5LCAuOTcpIGJvdGg7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgcGVyc3BlY3RpdmU6IDEwMDBweDtcbn1cblxuLmJsdWUtYnV0dG9uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBcIiMyMzgzZTJcIjtcbiAgICBjb2xvcjogXCJ3aGl0ZVwiO1xuICAgIGJvcmRlcjogXCJub25lXCI7XG4gICAgcGFkZGluZzogXCIzcHhcIjtcbiAgICBib3JkZXItcmFkaXVzOiBcIjVweFwiO1xuICAgIGZvbnQtd2VpZ2h0OiBcIjUwMFwiO1xufVxuXG5cbi5ibG9jay1zZWxlY3RlZCB7XG4gICAgLyogYm9yZGVyOiAycHggZGFzaGVkIHJlZDsgKi9cbn1cblxuLnNlcGFyYXRvciB7XG4gICAgLyogcGFkZGluZzogMTBweCAwOyAqL1xufVxuXG5cbi5zZXBhcmF0b3Itd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC8qIGhlaWdodDogNTBweDsgKi9cbn1cblxuLnNlcGFyYXRvciB7XG4gICAgZmxleC1ncm93OiAxO1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbn1cblxuLyogLnNlcGFyYXRvcjo6YmVmb3JlLFxuLnNlcGFyYXRvcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZmxleC1ncm93OiAxO1xufSAqL1xuXG5cblxuLnNlcGFyYXRvci13cmFwcGVyIGhyIHtcbiAgICAvKiBPdXRyb3MgZXN0aWxvcyAqL1xuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbiAgICAvKiBSZW1vdmEgZXN0YSBsaW5oYSBzZSBlc3RpdmVyIHByZXNlbnRlICovXG59XG5cbi5zZXBhcmF0b3Itd3JhcHBlciBocjpmb2N1cyB7XG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uc2VwYXJhdG9yLXNlbGVjdGVkIHtcbiAgICAvKiBvdXRsaW5lOiAycHggc29saWQgYmx1ZTsgKi9cbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICBvdXRsaW5lOiBub25lICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIxMCA3NSUgNTAlIC8gMSk7XG59XG5cblxuLnNlcGFyYXRvci1zZWxlY3RlZCBociB7XG4gICAgLyogb3V0bGluZTogMnB4IHNvbGlkIGJsdWU7ICovXG4gICAgLyogYm9yZGVyOiAxcHggc29saWQgd2hpdGUgIWltcG9ydGFudDsgKi9cblxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGhzbCgyMTAgNzUlIDUwJSAvIDEpOyAqL1xuICAgIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcblxuXG59YCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvYXNzZXRzL2Nzcy9tYWluLmNzc1wi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QUFFQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0lBQ3hCLHNDQUFzQztBQUMxQzs7O0FBR0E7SUFDSSw2QkFBNkI7SUFDN0Isd0NBQXdDOztJQUV4Qyw0Q0FBNEM7SUFDNUMsdUJBQXVCO0lBQ3ZCLDhCQUE4Qjs7O0FBR2xDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi8qKiBjdXJzb3Igc3R5bGUgKi9cXG5bY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl0ge1xcbiAgICBjdXJzb3I6IHRleHQgIWltcG9ydGFudDtcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7XFxufVxcblxcblxcblxcbi8qKiBDU1MgcmVzZXQgKi9cXG5cXG4uYnV0dG9uLXJlc2V0IHtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICBmb250OiBpbmhlcml0O1xcbiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xcbiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBpbmhlcml0O1xcbiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogaW5oZXJpdDtcXG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbn1cXG5cXG5cXG5cXG4vKiogYWRkIGJsb2NrICovXFxuLmFkZC1ibG9jayB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbn1cXG5cXG4uYWRkLWJsb2NrLXdyYXBwZXIge1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAzLjEyNXJlbTtcXG59XFxuXFxuLmFkZC1ibG9jay13cmFwcGVyOmhvdmVyIC5hZGQtYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbn1cXG5cXG4vKiogYW5kIGFkZCBibG9jayAqL1xcblxcblxcblxcbi8qKiBMaXN0ICAqKi9cXG4ubGlzdCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIGdhcDogMTBweDtcXG5cXG59XFxuXFxuLmxpc3QtaXRlbS1jaGVja2FibGUgaW5wdXQge1xcbiAgICBtYXJnaW4tdG9wOiAwLjVyZW07XFxufVxcblxcbi5saXN0IGxpIGRpdiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xcbiAgICBtaW4td2lkdGg6IDEwMHB4O1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG59XFxuXFxub2wuam9oYW5uZXMtY29udGVudC1lbGVtZW50LFxcbnVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHBhZGRpbmctbGVmdDogMXJlbSAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IG5vbmU7ICovXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XFxuICAgIHRvcDogMDtcXG5cXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcblxcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcblxcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOjpiZWZvcmUge1xcbiAgICBtYXJnaW4tbGVmdDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IGxpOmhvdmVyPmJ1dHRvbiB7XFxuICAgIC8qIGRpc3BsYXk6IGlubGluZS1ibG9jazsgKi9cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuXFxufVxcblxcbnAuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICBsaW5lLWhlaWdodDogMTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG4uam9oYW5uZXMtY29udGVudC1lbGVtZW50IC5jaGVja2JveC1saXN0IHtcXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCAuY2hlY2tib3gtbGlzdCBsaSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogbGVmdDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB1bC5jaGVja2JveC1saXN0IGlucHV0W3R5cGU9XFxcImNoZWNrYm94XFxcIl06Y2hlY2tlZCtzcGFuIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qIHVsLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpLFxcbm9sLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudDpub3QoLmNoZWNrYm94LWxpc3QpIHtcXG4gICAgcGFkZGluZy1sZWZ0OiAxLjVyZW0gIWltcG9ydGFudDtcXG59ICovXFxuXFxuLyoqIEFkZCBsaW5lIHRocm91Z2ggdGV4dCBkZWNvcmF0aW9uIHRvIGNoZWNrZWQgY2hlY2tib3hlcyB0ZXh0IGRpdiAqL1xcbi5ibG9jayBpbnB1dFt0eXBlPVxcXCJjaGVja2JveFxcXCJdOmNoZWNrZWQrZGl2IHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XFxufVxcblxcbi8qKiBSZW1vdmUgdGhlIGRlZmF1bHQgbGlzdCBzdHlsZSBhbmQgcmVwbGFjZSBieSBhbm90aGVyIHRoYXQgd29ya3Mgd2l0aCBkaXNwbGF5IGZsZXggKi9cXG4uYmxvY2sgb2wsXFxuLmJsb2NrIHVsIHtcXG4gICAgbGlzdC1zdHlsZTogbm9uZTtcXG59XFxuXFxuLmJsb2NrIHVsIC5saXN0LWl0ZW0sXFxuLmJsb2NrIG9sIC5saXN0LWl0ZW0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXG5cXG59XFxuXFxuLmJsb2NrIG9sIGxpIHtcXG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGl0ZW07XFxufVxcblxcbi5ibG9jayBvbCBsaTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogY291bnRlcihpdGVtKSBcXFwiLlxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xcbn1cXG5cXG4uYmxvY2sgdWwgbGk6bm90KC5uby1saXN0LXN0eWxlKTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogXFxcIuKAolxcXCI7XFxuICAgIG1hcmdpbi1yaWdodDogMC4zMTI1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG59XFxuXFxuLmxpc3QtaXRlbS1jaGVja2FibGUgaW5wdXQge1xcbiAgICAvKiB3aWR0aDogMThweDsgKi9cXG4gICAgbWFyZ2luLXJpZ2h0OiAwLjMxMjVyZW07XFxufVxcblxcblxcbi8qKiBhbmQgbGlzdCAqKi9cXG5cXG5cXG5cXG4uZHJhZy1oYW5kbGVyIHtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcXG4gICAgY3Vyc29yOiBncmFiO1xcbiAgICBhbGlnbi1zZWxmOiBzdGFydDtcXG4gICAgcGFkZGluZy10b3A6IDAuMzNyZW07XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG59XFxuXFxuLmRyYWctaGFuZGxlci13cmFwcGVyIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIHdpZHRoOiAwO1xcbn1cXG5cXG5cXG5cXG4uZHJhZy1oYW5kbGVyIHN2ZyB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlciBzdmcgdXNlIHtcXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogYmx1ZTsgKi9cXG59XFxuXFxuLmRyYWctaGFuZGxlcjphY3RpdmUge1xcbiAgICBjdXJzb3I6IGdyYWJiaW5nO1xcbn1cXG5cXG4uYmxvY2sge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1heC13aWR0aDogMTAwJTtcXG59XFxuXFxuLmJsb2NrPio6bm90KC5lZGl0b3Itb25seSkge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEuMjVyZW0gIWltcG9ydGFudDtcXG59XFxuXFxuLmJsb2NrOmhvdmVyIC5kcmFnLWhhbmRsZXIge1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0YXJ0O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxufVxcblxcbi8qIC5ibG9jazpob3ZlciAuYmxvY2stdG9vbGJhciB7XFxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XFxufSAqL1xcblxcbi5kcm9wLWxpbmUge1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICM4NDg4OGQ7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG5cXG4udGl0bGUgaDEge1xcbiAgICBtYXJnaW4tbGVmdDogMS4zcmVtO1xcbiAgICBsaW5lLWhlaWdodDogM3JlbTtcXG59XFxuXFxuXFxuW2NvbnRlbnRlZGl0YWJsZT1cXFwidHJ1ZVxcXCJdOmVtcHR5OmZvY3VzIHtcXG4gICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcXG4gICAgY29sb3I6ICM4NDg4OGQ7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG5oMVtkYXRhLXBsYWNlaG9sZGVyXTplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4ZCAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuaDFbZGF0YS1wbGFjZWhvbGRlcl06Zm9jdXM6YmVmb3JlIHt9XFxuXFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpOmVtcHR5OmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2Q7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbipbY29udGVudGVkaXRhYmxlPVxcXCJ0cnVlXFxcIl06bm90KGgxKTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuY2l0ZVtjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpiZWZvcmUge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuKltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTpub3QoaDEpW2RhdGEtcGxhY2Vob2xkZXJdOmVtcHR5OmZvY3VzOmJlZm9yZSB7XFxuICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1wbGFjZWhvbGRlcik7XFxuICAgIGNvbG9yOiAjODQ4ODhhY2QgIWltcG9ydGFudDtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbmxpLmRpdltjb250ZW50ZWRpdGFibGU9XFxcInRydWVcXFwiXTplbXB0eTpob3ZlcjpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXFxuXFxuXFxuaDEge1xcbiAgICBmb250LXNpemU6IDIuNXJlbTtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlciAhaW1wb3J0YW50O1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuXFxufVxcblxcbi5jb250ZW50IHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJlZDsgKi9cXG59XFxuXFxuLmNvbnRlbnQgLmJsb2NrIC50YWJsZS13cmFwcGVyIHtcXG4gICAgb3ZlcmZsb3cteDogYXV0bztcXG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xcbn1cXG5cXG5cXG4vKiBwcmUge1xcbiAgICB3aWR0aDogMTAwJTtcXG59ICovXFxuXFxuW2NvbnRlbnRlZGl0YWJsZV0ge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbn1cXG5cXG5ib2R5IHtcXG4gICAgLyogbWluLWhlaWdodDogMjAwMHB4OyAqL1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG5cXG4gICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBcXFwiSGVsdmV0aWNhIE5ldWVcXFwiLCBcXFwiTm90byBTYW5zXFxcIiwgXFxcIkxpYmVyYXRpb24gU2Fuc1xcXCIsIEFyaWFsLCBzYW5zLXNlcmlmLCBcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgRW1vamlcXFwiLCBcXFwiU2Vnb2UgVUkgU3ltYm9sXFxcIiwgXFxcIk5vdG8gQ29sb3IgRW1vamlcXFwiO1xcbn1cXG5cXG5cXG5cXG4uZWRpdG9yIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgbWFyZ2luLXRvcDogODBweDtcXG59XFxuXFxucCB7XFxuICAgIGNvbG9yOiAjMjQyNDI0O1xcbn1cXG5cXG5cXG4uYmxvY2ssXFxuLmJsb2NrICoge1xcbiAgICB1c2VyLXNlbGVjdDogdGV4dDtcXG59XFxuXFxuXFxuLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOyAqL1xcbn1cXG5cXG5cXG4jam9oYW5uZXNFZGl0b3Ige1xcbiAgICB3aWR0aDogNjAlO1xcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcXG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGhyIHtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIGhlaWdodDogMnB4O1xcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbn1cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGJsb2NrcXVvdGUge1xcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxuICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgcmdiKDU1LCA1MywgNDcpO1xcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIGNpdGUge1xcbiAgICBwYWRkaW5nLXRvcDogMXJlbSAhaW1wb3J0YW50O1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcblxcblxcbi5qb2hhbm5lcy1lZGl0b3IgY2l0ZTo6YmVmb3JlIHtcXG4gICAgY29udGVudDogJ+KAlCAnO1xcbn1cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4jbGlua0JveCB7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgKi9cXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxufVxcblxcbiNsaW5rQm94IC5oZWFkZXIge1xcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgO1xcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxuICAgIC8qIGZvbnQtc2l6ZTogMC43NXJlbTsgKi9cXG4gICAgLyogY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTsgKi9cXG4gICAgZm9udC1zaXplOiAwLjg2cmVtO1xcbn1cXG5cXG4jbGlua0JveCAubGluay1ib3gtc2hlbGwge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBnYXA6IDFyZW07XFxuICAgIHBhZGRpbmc6IDIwcHg7XFxufVxcblxcblxcbiNsaW5rQm94IC5saW5rLWJveC1zaGVsbCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4uY3RybC1hY3RpdmUgLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCBhIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG5cXG5cXG5cXG5cXG4vKiAjbGlua0JveCB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcXG4gICAgcGFkZGluZzogMjBweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTtcXG5cXG5cXG4gICAgYm94LXNoYWRvdzpcXG4gICAgICAgIDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSksXFxuICAgICAgICAwIC0ycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAtMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMiksXFxuICAgICAgICAycHggMCA0cHggcmdiYSgwLCAwLCAwLCAwLjAyKTtcXG5cXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2QwZDBkMDtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICB6LWluZGV4OiA5OTk5OTk7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XFxufVxcblxcblxcbiNsaW5rQm94IGlucHV0IHtcXG4gICAgd2lkdGg6IDMxNnB4O1xcbiAgICBwYWRkaW5nOiA4cHggNDBweCA4cHggMTZweDtcXG5cXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzk0OTQ5NDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcblxcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuXFxuI2xpbmtCb3ggaW5wdXQ6OnNlbGVjdGlvbixcXG4jbGlua0JveCBpbnB1dDpmb2N1cyB7XFxuICAgIGJvcmRlci1yYWRpdXM6IG5vbmU7XFxufSAqL1xcblxcbi8qKiBzb2Z0LWJveC1zaGFkb3cgY2xhc3MgKi9cXG4uc29mdC1ib3gtc2hhZG93IHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XFxuICAgIGJveC1zaGFkb3c6XFxuICAgICAgICAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpLFxcbiAgICAgICAgMCAtMnB4IDRweCByZ2JhKDIxNiwgMTk2LCAxOTYsIDAuMDIpLFxcbiAgICAgICAgLTJweCAwIDRweCByZ2JhKDAsIDAsIDAsIDAuMDIpLFxcbiAgICAgICAgMnB4IDAgNHB4IHJnYmEoMCwgMCwgMCwgMC4wMik7XFxuXFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMGQwZDA7XFxufVxcblxcbi8qKiBhbmQgc29mdC1ib3gtc2hhZG93ICovXFxuXFxuXFxuLyoqIHNlbGVjdGlvbi13cmFwcGVyIGNsYXNzICovXFxuLnNlbGVjdC13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMC41cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcXG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xcbiAgICB0b3A6IDIuMnJlbTtcXG4gICAgY29sb3I6IHJnYig1NSwgNTMsIDQ3KTtcXG4gICAgcGFkZGluZy1yaWdodDogMC4zMTI1cmVtO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGkge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBnYXA6IDAuNjI1cmVtO1xcbiAgICBwYWRkaW5nOiAwLjE4NzVyZW0gMC4zMTI1cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAwLjE4NzVyZW07XFxuICAgIHVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIHNwYW4sXFxuLnNlbGVjdC13cmFwcGVyIGJ1dHRvbiBzcGFuIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB1bCBsaSAub3B0aW9uLWltYWdlIHtcXG4gICAgd2lkdGg6IDEuMzc1cmVtO1xcbiAgICBoZWlnaHQ6IDEuMzc1cmVtO1xcbiAgICBjb2xvcjogIzI0MjQyNDtcXG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xcbiAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyIHVsIGxpIC5vcHRpb24taW1hZ2Ugc3ZnIHtcXG4gICAgY29sb3I6ICM0ZjRmNGY7XFxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcXG4gICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zZWxlY3Qtd3JhcHBlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgY29sb3I6IHJnYigxMjAsIDExOSwgMTE2KTtcXG59XFxuXFxuLnNlbGVjdC13cmFwcGVyPmJ1dHRvbiB7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuODUpO1xcbn1cXG5cXG4uc2VsZWN0LXdyYXBwZXIgdWwgbGk+aDMge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbn1cXG5cXG4vKiogZW5kIHNlbGVjdGlvbiB3cmFwcGVyICoqL1xcblxcblxcblxcbi8qKiBUZXh0IGZvcm1hdHRpbmcgQmFyICoqL1xcblxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHtcXG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG5cXG4uZmxvYXRpbmctdG9vbGJhciAuaXRlbSB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMTBweDtcXG59XFxuXFxuLmZsb2F0aW5nLXRvb2xiYXIgLml0ZW0+YnV0dG9uIHtcXG5cXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcblxcbi5mbG9hdGluZy10b29sYmFyIHNlbGVjdCB7XFxuICAgIGNvbG9yOiByZ2IoMTIwLCAxMTksIDExNik7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG5cXG4udGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b24ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbn1cXG5cXG4jdHVybkludG9CdXR0b24gc3BhbiB7XFxuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZm9udC1zaXplOiAwLjlyZW07XFxuXFxufVxcblxcbiN0dXJuSW50b0J1dHRvbiBzdmcgdXNlIHtcXG4gICAgbWFyZ2luOiBhdXRvO1xcbn1cXG5cXG4vKiBjb2RlOm5vdChwcmUgY29kZSkge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY1ZjQ7XFxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gICAgZm9udC1zaXplOiAxcmVtICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAxYTtcXG4gICAgcGFkZGluZzogMCAzcHg7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn0gKi9cXG5cXG5cXG5cXG5cXG4vKiBhOm5vdChbaHJlZl0pIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZTNmZDtcXG59ICovXFxuXFxuLnRleHQtZm9ybWF0dGluZy1idXR0b24tYWN0aXZlIHtcXG4gICAgY29sb3I6ICMyMzgyZTI7XFxufVxcblxcbi50ZXh0LWZvcm1hdHRpbmctY2lyY2xlLWFjdGl2ZSB7XFxuICAgIGJvcmRlci1jb2xvcjogIzIzODJlMiAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4jbW9yZVRleHRPcHRpb25TZWxlY3Qge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5tb3JlVGV4dE9wdGlvbldyYXBwZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcblxcbi5iZ2MtcmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZEREVERTtcXG59XFxuXFxuLmJnYy1ncmVlbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEN0Y3REM7XFxufVxcblxcbi5iZ2MtYmx1ZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNEOUVERjY7XFxufVxcblxcbi5iZ2MteWVsbG93IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZBRjREMTtcXG59XFxuXFxuLmJnYy1ncmV5IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTBFMDtcXG59XFxuXFxucCxcXG5tYXJrIHtcXG4gICAgbGluZS1oZWlnaHQ6IDE7XFxufVxcblxcbiN0dXJuSW50b1NlbGVjdCAub3B0aW9uLWltYWdlIHtcXG4gICAgLyogZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyAqL1xcbn1cXG5cXG4uYm9yZGVyLWxlc3MtaW1hZ2Uge1xcbiAgICB3aWR0aDogMjRweDtcXG4gICAgaGVpZ2h0OiAyNHB4O1xcbn1cXG5cXG5cXG5cXG5cXG4vKiogQmxvY2sgT3B0aW9ucyAqKi9cXG5cXG4uYmxvY2stb3B0aW9ucy13cmFwcGVyIHtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIHtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBtYXgtaGVpZ2h0OiAxOXJlbTtcXG4gICAgb3ZlcmZsb3cteTogYXV0bztcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMge1xcbiAgICBwYWRkaW5nOiAwIDAuNjI1cmVtO1xcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgc2VjdGlvbiBoMiB7XFxuICAgIGZvbnQtc2l6ZTogc21hbGwgIWltcG9ydGFudDtcXG4gICAgY29sb3I6ICMzNzM1MmZhNjtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXdlaWdodDogNjAwICFpbXBvcnRhbnQ7XFxuICAgIG1hcmdpbi10b3A6IDAuMzEyNXJlbTtcXG4gICAgbWFyZ2luLWJvdHRvbTogMC4zMTI1cmVtO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDAuMzEyNXJlbTtcXG59XFxuXFxuLmJsb2NrLW9wdGlvbnMgLm9wdGlvbiB7XFxuICAgIHBhZGRpbmc6IDAuMzEyNXJlbSAwLjYyNXJlbTtcXG4gICAgbWFyZ2luOiAwLjMxMjVyZW0gMDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxuICAgIGdhcDogMC42cmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XFxufVxcblxcbi5ibG9jay1vcHRpb25zIC5vcHRpb246Zm9jdXMge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuICAgIGJvcmRlcjogaW5oZXJpdDtcXG59XFxuXFxuLm9wdGlvbi1mb2N1c2VkIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcXG4gICAgYm9yZGVyOiBub25lO1xcbn1cXG5cXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCxcXG4uZGFuZ2VyLW9wdGlvbi5vcHRpb24tZm9jdXNlZCBzdmcge1xcbiAgICBjb2xvcjogI0VCNTc1NyAhaW1wb3J0YW50O1xcbn1cXG5cXG5cXG5cXG4uYmxvY2stb3B0aW9ucyAub3B0aW9uOmZvY3VzLXZpc2libGUge1xcbiAgICBvdXRsaW5lOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3JkZXI6IGluaGVyaXQ7XFxufVxcblxcbi8qIC5vcHRpb24taG92ZXI6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufSAqL1xcblxcbi8qIC5zZWxlY3Qtd3JhcHBlcj5idXR0b24sICovXFxuXFxuLyogI3R1cm5JbnRvQnV0dG9uLFxcbiNjb2xvclRleHRCdXR0b24ge1xcbiAgICBwYWRkaW5nLWxlZnQ6IDRweDtcXG59ICovXFxuXFxuI2NvbG9yVGV4dEJ1dHRvbiB7XFxuICAgIG1hcmdpbi1sZWZ0OiAwLjYyNXJlbTtcXG59XFxuXFxuI3R1cm5JbnRvQnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jY29sb3JUZXh0QnV0dG9uOm5vdChbZGlzYWJsZWRdKTpob3ZlcixcXG4jbW9yZVRleHRPcHRpb25CdXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLFxcbi5mbG9hdGluZy10b29sYmFyIC5pdGVtPmJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5O1xcbiAgICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAycHggI2U5ZTllOTtcXG4gICAgYm9yZGVyLXJhZGl1czogMXB4O1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcblxcblxcbi5vcHRpb25bZm9jdXNlZD1cXFwidHJ1ZVxcXCJdIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2JkZTRmZjtcXG59XFxuXFxuLm9wdGlvbi1pbWFnZSB7XFxuICAgIHdpZHRoOiAyLjg3NXJlbTtcXG4gICAgaGVpZ2h0OiAyLjg3NXJlbTtcXG4gICAgYm9yZGVyLXJhZGl1czogMC4xODc1cmVtO1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xcbiAgICBjb2xvcjogIzRmNGY0ZjtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmO1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIGltZyB7XFxuICAgIG1heC13aWR0aDogMi44NzVyZW07XFxuICAgIG1heC1oZWlnaHQ6IDIuODc1cmVtO1xcbn1cXG5cXG4ub3B0aW9uLWltYWdlIHN2ZyB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgcGFkZGluZzogMC42MjVyZW07XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuXFxufVxcblxcbi5vcHRpb24tdGV4dCAqIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLXRpdGxlIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbn1cXG5cXG4ub3B0aW9uLXRleHQgLmJsb2NrLWRlc2NyaXB0aW9uIHtcXG4gICAgZm9udC1zaXplOiBzbWFsbCAhaW1wb3J0YW50O1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbn1cXG5cXG4vKiogRW5kIEJsb2NrIE9wdGlvbnMgKiovXFxuXFxuXFxuXFxuLyogI2RlbGV0ZUJsb2NrQnV0dG9uOmhvdmVyIHN2ZyxcXG4jZGVsZXRlQmxvY2tCdXR0b246aG92ZXIge1xcbiAgICBjb2xvcjogcmdiKDIzNSwgODcsIDg3KSAhaW1wb3J0YW50O1xcbn0gKi9cXG5cXG5cXG5cXG4uam9oYW5uZXMtZWRpdG9yICo6OnNlbGVjdGlvbiB7XFxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjExLCAyMjcsIDI1MywgMC41KSAhaW1wb3J0YW50OyAqL1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTtcXG4gICAgY29sb3I6IHdoaXRlO1xcbn1cXG5cXG4uam9oYW5uZXMtZWRpdG9yIG1hcmssXFxuLmpvaGFubmVzLWVkaXRvciAqOm5vdChoMSkge1xcbiAgICBsaW5lLWhlaWdodDogMS41ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5vcHRpb24ge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbi50ZXh0LW9wdGlvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGp1c3RpZnktY29udGVudDogc3RhcnQ7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGdhcDogMC42MjVyZW07XFxufVxcblxcblxcblxcblxcbjpyb290IHtcXG4gICAgLyogZm9udC1zaXplOiAxNnB4OyAqL1xcbiAgICAvKiBUYW1hbmhvIHBhZHLDo28gKi9cXG59XFxuXFxuLyogUGFyYSB0ZWxhcyBjb20gZGVuc2lkYWRlIG3DqWRpYSAqL1xcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXFxub25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86IDIpLFxcbm9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246IDE5MmRwaSksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMmRwcHgpIHtcXG4gICAgOnJvb3Qge1xcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgICAgICAgLyogQXVtZW50YSBvIHRhbWFuaG8gZGEgZm9udGUgcGFyYSB0ZWxhcyBkZSBhbHRhIGRlbnNpZGFkZSAqL1xcbiAgICB9XFxufVxcblxcbi8qIFBhcmEgdGVsYXMgY29tIGFsdMOtc3NpbWEgZGVuc2lkYWRlICovXFxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAzKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzogMyksXFxub25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjogMjg4ZHBpKSxcXG5vbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOiAzZHBweCkge1xcbiAgICA6cm9vdCB7XFxuICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAvKiBBaW5kYSBtYWlvciBwYXJhIHRlbGFzIGRlIGRlbnNpZGFkZSBtdWl0byBhbHRhICovXFxuICAgIH1cXG59XFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG4gICAgbWF4LXdpZHRoOiBpbmhlcml0O1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGgsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkIHtcXG4gICAgbWluLWhlaWdodDogMjBweDtcXG59XFxuXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRoLFxcbnRhYmxlLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCB0ZCB7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICM4NDg4OGQ7XFxuICAgIHBhZGRpbmc6IDhweDtcXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgYWxpZ24taXRlbXM6IHN0YXJ0O1xcbiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkO1xcbiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XFxuICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XFxuICAgIG1pbi13aWR0aDogMTAwcHg7XFxuICAgIG1heC13aWR0aDogMjAwcHg7XFxuICAgIC8qIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsgKi9cXG5cXG4gICAgdHJhbnNpdGlvbjogYm9yZGVyIDEwMG1zIGVhc2Utb3V0LCBib3gtc2hhZG93IDEwMG1zIGVhc2Utb3V0O1xcblxcbn1cXG5cXG50YWJsZS5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgdGQuc2VsZWN0ZWQsXFxudGFibGUuam9oYW5uZXMtY29udGVudC1lbGVtZW50IHRkOmZvY3VzIHtcXG4gICAgb3V0bGluZTogbm9uZTtcXG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4ICM3NGI2ZGIgaW5zZXQ7XFxuICAgIGJvcmRlcjogMXB4IGRvdWJsZSAjNzRiNmRiO1xcblxcbn1cXG5cXG50ZCB7XFxuICAgIG1pbi1oZWlnaHQ6IDFyZW0gIWltcG9ydGFudDtcXG4gICAgbGluZS1oZWlnaHQ6IDFyZW07XFxufVxcblxcbnRkOjpwbGFjZWhvbGRlciB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG50ZDplbXB0eTpiZWZvcmUge1xcbiAgICBjb250ZW50OiBhdHRyKGRhdGEtcGxhY2Vob2xkZXIpO1xcbiAgICBjb2xvcjogIzg0ODg4YWNkO1xcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG5cXG4udGFibGUtd3JhcHBlciB7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cXG4udGFibGUtY29udHJvbGxlciB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgbWF4LXdpZHRoOiAxMDAlO1xcbn1cXG5cXG4uYWRkLXRhYmxlLXJvdyB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC4wNik7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IDAuMzc1cmVtO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xcbiAgICBoZWlnaHQ6IDFyZW07XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICByaWdodDogLTEuMzEyNXJlbTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjA2KTtcXG4gICAgd2lkdGg6IDFyZW07XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbiAgICB0b3A6IDA7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAxcmVtIC0gNXB4KTtcXG4gICAgb3BhY2l0eTogMDtcXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XFxufVxcblxcbi5hZGQtdGFibGUtY29sdW1uOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuXFxuLmFkZC10YWJsZS1yb3c6aG92ZXIge1xcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG5cXG4udGFibGUtc2hlbGwge1xcbiAgICBtYXgtd2lkdGg6IDEwMCU7XFxufVxcblxcblxcblxcbi50YWJsZS1vcHRpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIHBhZGRpbmc6IDhweCAxNnB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xcbiAgICB3aWR0aDogZml0LWNvbnRlbnQ7XFxuICAgIHotaW5kZXg6IDk5OTk5OTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgcGFkZGluZzogOHB4IDE2cHg7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcblxcbi8qKiBDYWxsb3V0ICoqL1xcblxcbi5jYWxsb3V0LXdyYXBwZXIge1xcbiAgICBwYWRkaW5nOiAxcmVtO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxufVxcblxcbi5jYWxsb3V0OmhvdmVyIC5vcHRpb25zLWJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XFxufVxcblxcbi5jYWxsb3V0IHAge1xcbiAgICBtYXJnaW46IDA7XFxufVxcblxcbi5jYWxsb3V0LWJhY2tncm91bmQtcmVkIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZEREVERTtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZTRjOGM4O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLWdyZWVuIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Q3RjdEQztcXG4gICAgYm9yZGVyLWNvbG9yOiAjYzJkZWM2O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLWJsdWUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRDlFREY2O1xcbiAgICBib3JkZXItY29sb3I6ICNjM2Q1ZGQ7XFxufVxcblxcbi5jYWxsb3V0LWJhY2tncm91bmQteWVsbG93IHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdkZjtcXG4gICAgYm9yZGVyLWNvbG9yOiAjZmJmNWQ2O1xcbn1cXG5cXG4uY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXkge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWRlY2VjO1xcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XFxufVxcblxcbi5jYWxsb3V0LWJhY2tncm91bmQtbm9uZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBib3JkZXItY29sb3I6ICNlN2U2ZTY7XFxuXFxufVxcblxcbi8qKiBlbmQgY2FsbG91dCAqL1xcblxcblxcbi8qKiBtZWRpYUlucHV0dGVyICoqL1xcbi5tZWRpYUlucHV0dGVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxufVxcblxcbi8qKiBtZWRpYUlucHV0dGVyICoqL1xcblxcblxcbi5uby1zZWxlY3Rpb24ge1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTtcXG4gICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1xcbn1cXG5cXG4ucG9pbnRlciB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuXFxuLyoqIHVwbG9hZC9lbWJlZCAqKi9cXG5cXG4udGFiLWNvbnRhaW5lciB7XFxuICAgIGZvbnQtc2l6ZTogMC44NnJlbTtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgdHJhbnNpdGlvbjogMC4xcyBlYXNlO1xcblxcbiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcXG5cXG4gICAgdHJhbnNpdGlvbjogdmlzaWJpbGl0eSAwLjJzIGVhc2U7XFxuXFxuXFxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXG5cXG59XFxuXFxuLm5hdi11bmRlcmxpbmUge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDU1LCA1MywgNDcsIDAuMTYpO1xcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XFxufVxcblxcbi5uYXYtdW5kZXJsaW5lIC5uYXYtaXRlbSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIG1hcmdpbi1yaWdodDogMTVweDtcXG59XFxuXFxuLm5hdi11bmRlcmxpbmUgLm5hdi1saW5rIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgIGNvbG9yOiByZ2IoNTUsIDUzLCA0Nyk7XFxuICAgIGNvbG9yOiByZ2JhKDU1LCA1MywgNDcsIDAuNSk7XFxuICAgIHRyYW5zaXRpb246IDAuMXMgZWFzZTtcXG59XFxuXFxuXFxuLm5hdi1pdGVtLmFjdGl2ZSAubmF2LWxpbmsge1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxuLnRhYi1jb250ZW50IC5jb250ZW50LWRhdGEge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwYWRkaW5nOiAyMHB4O1xcbiAgICBib3JkZXItdG9wOiBub25lO1xcbiAgICB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7XFxufVxcblxcbi50YWItY29udGVudCAuY29udGVudC1kYXRhLmFjdGl2ZSB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgZ2FwOiAxcmVtO1xcbn1cXG5cXG4udGFiLWNvbnRlbnQgLnRleHQtaW5mbyB7XFxuICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcXG4gICAgY29sb3I6IHJnYmEoNTUsIDUzLCA0NywgMC42KTtcXG59XFxuXFxuLm5hdi11bmRlcmxpbmUgLm5hdi1pdGVtIHtcXG4gICAgZGlzcGxheTogaW5saW5lO1xcbn1cXG5cXG4uZW1iZWQtY29udGVudCBpbnB1dCB7XFxuICAgIHdpZHRoOiAyMHJlbTtcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgaGVpZ2h0OiAxLjVyZW07XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbn1cXG5cXG5cXG4udXBsb2FkLWNvbnRlbnQgbGFiZWwge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NSwgNTMsIDQ3LCAwLjE2KTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICB3aWR0aDogMjByZW07XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gICAgcGFkZGluZzogNHB4O1xcbiAgICBjb2xvcjogcmdiKDU1LCA1MywgNDcpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICAvKiB0cmFuc2l0aW9uOiAwLjFzIGVhc2U7ICovXFxufVxcblxcbi51cGxvYWQtY29udGVudCBsYWJlbDpob3ZlciB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcblxcblxcblxcbi8qIEVzdGlsbyBwYXJhIGFzIGFsw6dhcyBkZSByZWRpbWVuc2lvbmFtZW50byAqL1xcbi5yZXNpemUtaGFuZGxlIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB3aWR0aDogMTBweDtcXG4gICAgaGVpZ2h0OiAxMHB4O1xcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7XFxuICAgIGN1cnNvcjogbndzZS1yZXNpemU7XFxuICAgIC8qIEN1cnNvciBkZSByZWRpbWVuc2lvbmFtZW50byBkaWFnb25hbCAqL1xcbn1cXG5cXG4ucmVzaXplLWhhbmRsZS5zZSB7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgcmlnaHQ6IDA7XFxufVxcblxcbi5zcG90aWZ5LWVtYmVkIHtcXG4gICAgbWluLWhlaWdodDogMTUycHg7XFxuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgICBib3JkZXItcmFkaXVzOiAuNzVyZW0gIWltcG9ydGFudDtcXG59XFxuXFxuLmdpc3QtZW1iZWQge1xcbiAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xcbiAgICBtaW4taGVpZ2h0OiAxNTBweCAhaW1wb3J0YW50O1xcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xcbn1cXG5cXG4uc25pcHBldC1lbWJlZCB7XFxuICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XFxuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxufVxcblxcbi5lbWJlZC1jb250YWluZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbn1cXG5cXG4uZW1iZWQtY29udGFpbmVyIGlmcmFtZSB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICB3aWR0aDogMTAwJTtcXG4gICAgaGVpZ2h0OiAxMDAlO1xcbn1cXG5cXG5cXG4uaWZyYW1lLXdyYXBwZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcblxcblxcbi52aWRlby1jb250YWluZXIge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nLWJvdHRvbTogNTYuMjUlO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIG92ZXJmbG93OiBoaWRkZW47XFxufVxcblxcbi52aWRlby1jb250YWluZXIgaWZyYW1lIHtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICB0b3A6IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxufVxcblxcblxcblxcblxcblxcblxcblxcbi54LXJlc2l6YWJsZSB7XFxuICAgIHJlc2l6ZTogaG9yaXpvbnRhbDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGN1cnNvcjogbmVzdy1yZXNpemU7XFxuICAgIG1pbi13aWR0aDogMjUwcHg7XFxufVxcblxcbi55LXJlc2l6YWJsZSB7XFxuICAgIHJlc2l6ZTogdmVydGljYWw7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcXG4gICAgbWluLWhlaWdodDogMTUwcHg7XFxufVxcblxcbi5iYWNrZ3JvdW5kIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTZlMztcXG59XFxuXFxuXFxuLmZpdC1jb250ZW50IHtcXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xcbiAgICBoZWlnaHQ6IGZpdC1jb250ZW50O1xcbn1cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG5cXG4vKiAuZW1iZWQtY29udGFpbmVyIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4ubW9yZS1vcHRpb25zLWJ1dHRvbiB7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgdG9wOiAwO1xcbiAgICByaWdodDogMDtcXG4gICAgei1pbmRleDogOTk5OTk5O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuXFxufVxcblxcbi5jb250ZXh0LW1lbnUge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMjBweDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxuICAgIHBhZGRpbmc6IDVweDtcXG4gICAgei1pbmRleDogMTA7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxufVxcblxcbi5tb3JlLW9wdGlvbnMtYnV0dG9uOmFjdGl2ZSArIC5jb250ZXh0LW1lbnUsXFxuLm1vcmUtb3B0aW9ucy1idXR0b246Zm9jdXMgKyAuY29udGV4dC1tZW51IHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcblxcbi5iYmJ1dG9ue1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG59ICovXFxuXFxuXFxuLyoqIEJsb2NrVG9vbGJhciBjb21wb25lbnQgKiovXFxuLmJsb2NrLXRvb2xiYXItd3JhcHBlciB7XFxuICAgIHdpZHRoOiAwO1xcbiAgICBoZWlnaHQ6IDA7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgb3ZlcmZsb3c6IHZpc2libGU7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgZGlzcGxheTogY29udGVudHM7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICBcXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XFxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7XFxuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcGFkZGluZzogMDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBnYXA6IDEwcHg7XFxuICAgIHBhZGRpbmc6IDVweDtcXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xcbiAgICB0cmFuc2l0aW9uOiB2aXNpYmlsaXR5IDAuMnM7XFxuXFxuICAgIHRvcDogNXB4O1xcbiAgICByaWdodDogNXB4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIHtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxufVxcblxcbi5ibG9jay10b29sYmFyIC5pdGVtIGJ1dHRvbiB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi5ibG9jay10b29sYmFyIGJ1dHRvbiB7XFxuICAgIGNvbG9yOiBibGFjaztcXG59XFxuXFxuLmJsb2NrLXRvb2xiYXIgLmNvbG9yLWludGVyYWN0aXZlLWJ1dHRvbiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG59XFxuXFxuLyoqIEVuZCBCbG9ja1Rvb2xiYXIgY29tcG9uZW50ICoqL1xcblxcblxcblxcbi5qdXN0aWZ5LWxlZnQge1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7XFxufVxcblxcbi5qdXN0aWZ5LWNlbnRlciB7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcbn1cXG5cXG4uanVzdGlmeS1yaWdodCB7XFxuICAgIGp1c3RpZnktY29udGVudDogcmlnaHQ7XFxufVxcblxcblxcbi5oaWRkZW4ge1xcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcXG59XFxuXFxuXFxuXFxuXFxuZmlndXJlIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbn1cXG5cXG5cXG4ub3ZlcmZsb3ctaGlkZGVuIHtcXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG59XFxuXFxuLyoqIElubGluZSBDb2RlICoqL1xcbi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQgY29kZTpub3QocHJlIGNvZGUpIHtcXG4gICAgZm9udC1zaXplOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjN2E7XFxuICAgIHBhZGRpbmc6IDAgM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxufVxcblxcbi8qKiBDb250ZW50IHBsYWNlaG9sZGVyICovXFxuXFxuLmNvbnRlbnQtcGxhY2Vob2xkZXIge1xcbiAgICBwYWRkaW5nOiAxcmVtO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlNmUzO1xcbiAgICBjb2xvcjogcmdiYSg1NSwgNTMsIDQ3LCAwLjUpO1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBnYXA6IDVweDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbn1cXG5cXG4uY29udGVudC1wbGFjZWhvbGRlciAuaWNvbi13cmFwcGVyIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XFxufVxcblxcblxcbi8qIGVuZCBDb250ZW50IHBsYWNlaG9sZGVyICovXFxuXFxuXFxuXFxuLyoqIENvZGUgKiovXFxuXFxucHJlIHtcXG4gICAgbWFyZ2luOiAwO1xcbn1cXG5cXG5wcmUgY29kZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLmlnbm9yZS1ldmVudHMge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcblxcbi5jb2RlLWJsb2NrIHtcXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG5cXG4uY29kZS1ibG9jayBzZWxlY3Qge1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcblxcbi5jb2RlLWJsb2NrIHNlbGVjdCB7XFxuICAgIGFwcGVhcmFuY2U6IG5vbmU7XFxuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBwYWRkaW5nOiA0cHggOHB4O1xcbiAgICBmb250OiBpbmhlcml0O1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgMTBweCBjZW50ZXI7XFxuICAgIGNvbG9yOiB3aGl0ZTtcXG4gICAgZGlzcGxheTogbm9uZTtcXG59XFxuXFxuLmNvZGUtYmxvY2s6aG92ZXIgc2VsZWN0IHtcXG4gICAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcblxcblxcbi5jb2RlLWJsb2NrIGNvZGUge1xcbiAgICBmb250LXNpemU6IDFyZW07XFxuXFxufVxcblxcblxcblxcbkBrZXlmcmFtZXMgc2hha2Uge1xcblxcbiAgICAwJSxcXG4gICAgMTAwJSB7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxuICAgIH1cXG5cXG4gICAgMjUlLFxcbiAgICA3NSUge1xcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01cHgpO1xcbiAgICB9XFxuXFxuICAgIDUwJSB7XFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNXB4KTtcXG4gICAgfVxcbn1cXG5cXG4uc2hha2UtYW5pbWF0aW9uIHtcXG4gICAgYW5pbWF0aW9uOiBzaGFrZSAwLjZzIGN1YmljLWJlemllciguMzYsIC4wNywgLjE5LCAuOTcpIGJvdGg7XFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XFxuICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcXG4gICAgcGVyc3BlY3RpdmU6IDEwMDBweDtcXG59XFxuXFxuLmJsdWUtYnV0dG9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogXFxcIiMyMzgzZTJcXFwiO1xcbiAgICBjb2xvcjogXFxcIndoaXRlXFxcIjtcXG4gICAgYm9yZGVyOiBcXFwibm9uZVxcXCI7XFxuICAgIHBhZGRpbmc6IFxcXCIzcHhcXFwiO1xcbiAgICBib3JkZXItcmFkaXVzOiBcXFwiNXB4XFxcIjtcXG4gICAgZm9udC13ZWlnaHQ6IFxcXCI1MDBcXFwiO1xcbn1cXG5cXG5cXG4uYmxvY2stc2VsZWN0ZWQge1xcbiAgICAvKiBib3JkZXI6IDJweCBkYXNoZWQgcmVkOyAqL1xcbn1cXG5cXG4uc2VwYXJhdG9yIHtcXG4gICAgLyogcGFkZGluZzogMTBweCAwOyAqL1xcbn1cXG5cXG5cXG4uc2VwYXJhdG9yLXdyYXBwZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICAvKiBoZWlnaHQ6IDUwcHg7ICovXFxufVxcblxcbi5zZXBhcmF0b3Ige1xcbiAgICBmbGV4LWdyb3c6IDE7XFxuICAgIHBhZGRpbmc6IDAgMTBweDtcXG59XFxuXFxuLyogLnNlcGFyYXRvcjo6YmVmb3JlLFxcbi5zZXBhcmF0b3I6OmFmdGVyIHtcXG4gICAgY29udGVudDogXFxcIlxcXCI7XFxuICAgIGZsZXgtZ3JvdzogMTtcXG59ICovXFxuXFxuXFxuXFxuLnNlcGFyYXRvci13cmFwcGVyIGhyIHtcXG4gICAgLyogT3V0cm9zIGVzdGlsb3MgKi9cXG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgICAvKiBSZW1vdmEgZXN0YSBsaW5oYSBzZSBlc3RpdmVyIHByZXNlbnRlICovXFxufVxcblxcbi5zZXBhcmF0b3Itd3JhcHBlciBocjpmb2N1cyB7XFxuICAgIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcXG59XFxuXFxuLnNlcGFyYXRvci1zZWxlY3RlZCB7XFxuICAgIC8qIG91dGxpbmU6IDJweCBzb2xpZCBibHVlOyAqL1xcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgb3V0bGluZTogbm9uZSAhaW1wb3J0YW50O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTtcXG59XFxuXFxuXFxuLnNlcGFyYXRvci1zZWxlY3RlZCBociB7XFxuICAgIC8qIG91dGxpbmU6IDJweCBzb2xpZCBibHVlOyAqL1xcbiAgICAvKiBib3JkZXI6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyAqL1xcblxcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMjEwIDc1JSA1MCUgLyAxKTsgKi9cXG4gICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XFxuICAgIGJvcmRlci1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcXG5cXG5cXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdO1xuXG4gIC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuICAgICAgaWYgKG5lZWRMYXllcikge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9O1xuXG4gIC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcbiAgICBpZiAoZGVkdXBlKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGlkID0gdGhpc1trXVswXTtcbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdXBkYXRlcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuICBjc3MgKz0gb2JqLmNzcztcbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfVxuXG4gIC8vIEZvciBvbGQgSUVcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHt9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH1cbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm5jID0gdW5kZWZpbmVkOyIsImV4cG9ydCBlbnVtIENvbnRlbnRUeXBlcyB7XHJcbiAgICBQYXJhZ3JhcGggPSBcInBcIixcclxuICAgIEhlYWRpbmdfMSA9IFwiaDFcIixcclxuICAgIEhlYWRpbmdfMiA9IFwiaDJcIixcclxuICAgIEhlYWRpbmdfMyA9IFwiaDNcIixcclxuICAgIEhlYWRpbmdfNCA9IFwiaDRcIixcclxuICAgIEhlYWRpbmdfNSA9IFwiaDVcIixcclxuICAgIEhlYWRpbmdfNiA9IFwiaDZcIixcclxuICAgIENoZWNrTGlzdCA9IFwiY2hlY2tMaXN0XCIsXHJcbiAgICBCdWxsZXRlZExpc3QgPSBcImJ1bGxldGVkTGlzdFwiLFxyXG4gICAgTnVtYmVyZWRMaXN0ID0gXCJudW1iZXJlZExpc3RcIixcclxuICAgIExpc3QgPSBcImxpc3RcIixcclxuICAgIFRhYmxlID0gXCJ0YWJsZVwiLFxyXG4gICAgSW1hZ2UgPSBcImltYWdlXCIsXHJcbiAgICBTY3JpcHQgPSBcInNjcmlwdFwiLFxyXG4gICAgSWZyYW1lID0gXCJpZnJhbWVcIlxyXG59IiwiZXhwb3J0IGVudW0gSWNvbnMge1xyXG4gICAgTGluayA9IFwiaWNvbi1tYXRlcmlhbC1saW5rXCIsXHJcbiAgICBCb2xkID0gXCJpY29uLXdvcmRwcmVzcy1ib2xkXCIsXHJcbiAgICBJdGFsaWMgPSBcImljb24tbWF0ZXJpYWwtaXRhbGljXCIsXHJcbiAgICBVbmRlcmxpbmUgPSBcImljb24tbWF0ZXJpYWwtdW5kZXJsaW5lXCIsXHJcbiAgICBJbmxpbmVDb2RlID0gXCJpY29uLW1hdGVyaWFsLWNvZGUtaW5saW5lXCIsXHJcbiAgICBTdHJpa2VUaHJvdWdoID0gXCJpY29uLXdvcmRwcmVzcy1zdHJpa2UtdGhyb3VnaFwiLFxyXG4gICAgUGx1cyA9IFwiaWNvbi1wbHVzXCIsXHJcbiAgICBDb2x1bW5SaWdodCA9IFwiaWNvbi1tYXRlcmlhbC1jb2x1bW4tcmlnaHRcIixcclxuICAgIENvbHVtbkxlZnQgPSBcImljb24tbWF0ZXJpYWwtY29sdW1uLWxlZnRcIixcclxuICAgIFJvd0Fib3ZlID0gXCJpY29uLW1hdGVyaWFsLXJvdy1hYm92ZVwiLFxyXG4gICAgUm93QmVsb3cgPSBcImljb24tbWF0ZXJpYWwtcm93LWJlbG93XCIsXHJcbiAgICBkZWxldGVTd2VlcCA9IFwiaWNvbi1tYXRlcmlhbC1kZWxldGUtc3dlZXBcIixcclxuICAgIFRyYXNoID0gXCJpY29uLW1hdGVyaWFsLXRyYXNoXCIsXHJcbiAgICBDbG9zZUNpcmNsZSA9IFwiaWNvbi1pb25pYy1jbG9zZS1jaXJjbGVcIixcclxuICAgIEVtcHR5ID0gXCJFbXB0eVwiLFxyXG4gICAgQ2FsbG91dCA9IFwiaWNvbi1tYXRlcmlhbC1jYWxsb3V0XCIsXHJcbiAgICBJbWFnZSA9IFwiaWNvbi1tYXRlcmlhbC1pbWFnZVwiLFxyXG4gICAgSW1hZ2UyID0gXCJpY29uLWJvb3RzdHJhcC1pbWFnZVwiLFxyXG4gICAgVmlkZW8gPSBcImljb24tbWF0ZXJpYWwtdmlkZW9cIixcclxuICAgIEp1c3RpZnlTdGFydCA9ICBcImljb24tbWF0ZXJpYWwtanVzdGlmeS1zdGFydFwiLFxyXG4gICAgSnVzdGlmeUNlbnRlciA9IFwiaWNvbi1tYXRlcmlhbC1qdXN0aWZ5LWNlbnRlclwiLFxyXG4gICAgSnVzdGlmeUVuZCA9IFwiaWNvbi1tYXRlcmlhbC1qdXN0aWZ5LWVuZFwiLFxyXG4gICAgRHVwbGljYXRlID0gXCJpY29uLW1hdGVyaWFsLWR1cGxpY2F0ZVwiLFxyXG4gICAgU3BvdGlmeSA9IFwiaWNvbi1ib290c3RyYXAtc3BvdGlmeVwiLFxyXG4gICAgR2l0SHViID0gXCJpY29uLWJvb3RzdHJhcC1naXRodWJcIixcclxuICAgIEdpdExhYiA9IFwiaWNvbi1ib290c3RyYXAtZ2l0bGFiXCIsXHJcbiAgICBDb2RlUGVuID0gXCJpY29uLWNvZGVwZW5cIixcclxuICAgIFlvdVR1YmUgPSBcImljb24tYm9vdHN0cmFwLXlvdXR1YmVcIlxyXG5cclxufSIsIi8qKlxyXG4gKiBFbnVtIGZvciBDU1MgY2xhc3MgbmFtZXMgdGhhdCBhY3RpdmF0ZSBzcGVjaWZpYyBmdW5jdGlvbmFsaXRpZXMgaW4gdGhlIEJsb2NrVG9vbGJveC5cclxuICogRWFjaCBvcHRpb24gY29ycmVzcG9uZHMgdG8gYSBjbGFzcyB0aGF0LCB3aGVuIGFwcGxpZWQsIGVuYWJsZXMgcGFydGljdWxhciBmZWF0dXJlcyBcclxuICogcmVsYXRlZCB0byBjb250ZW50IGVkaXRpbmcgYW5kIHN0eWxpbmcgd2l0aGluIGEgYmxvY2suXHJcbiAqXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBUb29sYm94T3B0aW9ucyB7XHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdGhhdCBhY3RpdmF0ZXMgdGhlIGJsb2NrIHRvb2xiYXIgZm9yIGNvbnRlbnQgaW50ZXJhY3Rpb24uXHJcbiAgICAgKiBUaGlzIGNsYXNzIGluY2x1ZGVzIHRoZSB0b29sYmFyIGFuZCBlbmFibGVzIGJhc2ljIGludGVyYWN0aW9uIGNhcGFiaWxpdGllcy5cclxuICAgICAqL1xyXG4gICAgSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzID0gXCJpbmNsdWRlLWJsb2NrLXRvb2xiYXJcIiwgLy9ibG9jay10b29sYmFyLCBibG9jay10b29sYmFyLCBjb250ZW50LWludGVyYWN0aXZlXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdGhhdCBhY3RpdmF0ZXMgdGhlIGFsaWdubWVudCB0b29scyB3aXRoaW4gdGhlIHRvb2xib3guXHJcbiAgICAgKiBUaGlzIGNsYXNzIGVuYWJsZXMgZnVuY3Rpb25hbGl0aWVzIGZvciBhbGlnbmluZyB0aGUgY29udGVudCB3aXRoaW4gYSBibG9jay5cclxuICAgICAqL1xyXG4gICAgQWxpZ25Ub29sQ2xhc3MgPSBcImFsaWduLXRvb2xcIiwgLy9pbnRlcmFjdGl2ZS1hbGlnblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGFzcyBuYW1lIHRoYXQgZW5hYmxlcyBjb2xvciBlZGl0aW5nIHRvb2xzIHdpdGhpbiB0aGUgdG9vbGJveC5cclxuICAgICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgb3B0aW9ucyBmb3IgY2hhbmdpbmcgdGhlIGNvbG9yIG9mIHRleHQgYW5kIGJhY2tncm91bmQuXHJcbiAgICAgKi9cclxuICAgIENvbG9yVG9vbENsYXNzID0gXCJjb2xvci10b29sXCIsIC8vaW50ZXJhY3RpdmUtY29sb3JcclxuICAgIC8qKlxyXG4gICAgICogQ2xhc3MgbmFtZSB0aGF0IGFjdGl2YXRlcyBhZGRpdGlvbmFsIG9wdGlvbnMgd2l0aGluIHRoZSB0b29sYm94LlxyXG4gICAgICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSB0b29sYm94IHdpdGggbW9yZSBhZHZhbmNlZCBzZXR0aW5ncyBhbmQgZnVuY3Rpb25hbGl0aWVzLCBsaWtlIERlbGV0ZSBhbmQgRHVwbGljYXRlXHJcbiAgICAgKi9cclxuICAgIEV4dHJhT3B0aW9uc0NsYXNzID0gXCJleHRyYS1vcHRpb25zXCIsIC8vaW50ZXJhY3RpdmUtbW9yZVxyXG4gICAgTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MgPSBcImxhbmd1YWdlLXNlbGVjdGlvbi10b29sXCIgLy9pbnRlcmFjdGl2ZS1tb3JlXHJcbn0iLCJleHBvcnQgZW51bSBDb21tb25DbGFzc2VzIHtcclxuICAgIC8qKiBcclxuICAgICAqIENsYXNzIG5hbWUgZm9yIHRoZSBtYWluIGNvbnRlbnQgZWxlbWVudHMgd2l0aGluIGJsb2Nrcy4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluZGljYXRlXHJcbiAgICAgKiB3aGljaCBlbGVtZW50cyBjb250YWluIHRoZSBhY3R1YWwgY29udGVudCB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBvcGVyYXRpb25zIGxpa2VcclxuICAgICAqIHN0eWxpbmcgb3IgaW50ZXJhY3Rpb24uXHJcbiAgICAgKi9cclxuICAgIENvbnRlbnRFbGVtZW50ID0gXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIixcclxuICAgICAvKipcclxuICAgICogQ2xhc3MgbmFtZSBmb3IgZWxlbWVudHMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBkdXJpbmcgc2F2ZSBvciBleHBvcnQgb3BlcmF0aW9ucy5cclxuICAgICogQXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gZWRpdGluZyBVSSBjb21wb25lbnRzIHdpdGhpbiB0aGUgYC5jb250ZW50YCBlbGVtZW50IHRvIGVuc3VyZVxyXG4gICAgKiB0aGV5IGFyZSBub3QgcHJlc2VydmVkIGluIHRoZSBzYXZlZCBvciBleHBvcnRlZCBvdXRwdXQuIEVsZW1lbnRzIG91dHNpZGUgdGhlIGAuY29udGVudGBcclxuICAgICogc2hvdWxkIG5vdCByZWNlaXZlIHRoaXMgY2xhc3MgYXMgaXQgd291bGQgbGVhZCB0byB0aGUgbG9zcyBvZiBldmVudCBsaXN0ZW5lcnMgdXBvbiBhY3Rpb25zXHJcbiAgICAqIGxpa2UgdW5kbyBvciByZWRvLCB3aGljaCByZWx5IG9uIHRoZXNlIGVsZW1lbnRzIGJlaW5nIGNvbnNpc3RlbnRseSBhdmFpbGFibGUuXHJcbiAgICAqIEVsZW1lbnRzIG1hcmtlZCB3aXRoIGBFZGl0b3JPbmx5YCBpbnNpZGUgdGhlIGNvbnRlbnQgZG8gbm90IHJldGFpbiBwZXJzaXN0ZW50IGxpc3RlbmVycztcclxuICAgICogdGhleSBleGlzdCBvbmx5IHRyYW5zaWVudGx5IGR1cmluZyB0aGUgZWRpdCBzZXNzaW9uLCBzdWNoIGFzIHRoZSBgQmxvY2tUb29sYm94YCwgd2hpY2hcclxuICAgICogaXMgcmVjcmVhdGVkIHJhdGhlciB0aGFuIHNhdmVkLlxyXG4gICAgKi9cclxuICAgIEVkaXRvck9ubHkgPSBcImVkaXRvci1vbmx5XCIsXHJcbiAgICAvKipcclxuICAgICAqIENsYXNzIG5hbWUgdXNlZCB0byBkZWZpbmUgYSBjb250ZW50IGJsb2NrLiBCbG9ja3MgYXJlIGZ1bmRhbWVudGFsIHN0cnVjdHVyYWwgZWxlbWVudHNcclxuICAgICAqIGluIHRoZSBsYXlvdXQgdGhhdCBtYXkgY29udGFpbiB0ZXh0LCBpbWFnZXMsIG9yIG90aGVyIHR5cGVzIG9mIGNvbnRlbnQuIFRoaXMgY2xhc3NcclxuICAgICAqIGhlbHBzIGluIGFwcGx5aW5nIGNvbnNpc3RlbnQgc3R5bGluZyBhbmQgYmVoYXZpb3IgdG8gY29udGVudCBibG9ja3MuXHJcbiAgICAgKi9cclxuICAgIEJsb2NrID0gXCJibG9ja1wiLFxyXG4gICAgLyoqXHJcbiAgICAqIENsYXNzIG5hbWUgdXNlZCB0byB0cmlnZ2VyIHRoZSBkaXNwbGF5IG9mIHRoZSBNZWRpYUlucHV0dGVyIGNvbXBvbmVudCB1cG9uIGEgY2xpY2sgZXZlbnQuXHJcbiAgICAqIFdoZW4gYW4gZWxlbWVudCB3aXRoIHRoaXMgY2xhc3MgaXMgY2xpY2tlZCwgdGhlIE1lZGlhSW5wdXR0ZXIgbGlzdGVucyBmb3IgdGhlIGV2ZW50XHJcbiAgICAqIGFuZCBhY3RpdmF0ZXMsIHByb3ZpZGluZyBhIHVzZXIgaW50ZXJmYWNlIGZvciBlbnRlcmluZyBhIFVSTCBmb3IgYW4gZW1iZWQgb3IgdXBsb2FkaW5nIGEgZmlsZS5cclxuICAgICpcclxuICAgICogVGhpcyBjbGFzcyBmYWNpbGl0YXRlcyB1c2VyIGludGVyYWN0aW9uIGZvciBlbWJlZGRpbmcgbWVkaWEgY29udGVudCBkaXJlY3RseSBpbnRvIHRoZSBkb2N1bWVudCxcclxuICAgICogc3RyZWFtbGluaW5nIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBtdWx0aW1lZGlhIGVsZW1lbnRzIGxpa2UgaW1hZ2VzLCB2aWRlb3MsIG9yIG90aGVyIGVtYmVkZGVkIGNvbnRlbnQuXHJcbiAgICAqL1xyXG4gICAgU2hvd01lZGlhSW5wdXRPbkNsaWNrID0gXCJzaG93LW1lZGlhLWlucHV0LW9uLWNsaWNrXCIsXHJcbiAgICBTaG93TWVkaWFJbnB1dFVwbG9hZCA9ICBcInNob3ctbWVkaWEtaW5wdXQtdXBsb2FkXCIsXHJcbiAgICBTaG93TWVkaWFJbnB1dEVtYmVkID0gIFwic2hvdy1tZWRpYS1pbnB1dC1lbWJlZFwiLFxyXG59IiwiZXhwb3J0IGVudW0gQ3VzdG9tVUlFdmVudHMge1xyXG4gICAgXHJcbiAgICBDb2xvckNoYW5nZVJlcXVlc3QgPSBcIkNvbG9yQ2hhbmdlUmVxdWVzdFwiLFxyXG4gICAgU2hvd0hpZGVBY3RpdmVCdXR0b24gPSBcIlNob3dIaWRlQWN0aXZlQnV0dG9uXCIsXHJcbiAgICBSZXNldEFjdGl2ZUJ1dHRvbnMgPSBcIlJlc2V0QWN0aXZlQnV0dG9uc1wiLFxyXG4gICAgQ2xvc2VFbGVtZW50ID0gXCJIaWRlQ29tcG9uZW50XCIsXHJcbiAgICBTaG93RWxlbWVudCA9IFwiU2hvd0VsZW1lbnRcIixcclxuICAgIENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlID0gXCJDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZVwiXHJcbiAgICBcclxufSIsIi8qKlxyXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IGV2ZW50cyBmb3IgbW91c2UsIGtleWJvYXJkLCBhbmQgZm9jdXMgYWN0aW9ucy5cclxuICogVGhpcyBlbnVtZXJhdGlvbiBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgc3RyaW5ncyBmb3IgYXR0YWNoaW5nIGV2ZW50IGxpc3RlbmVycyB0byBET00gZWxlbWVudHMuXHJcbiAqIFVzZSB0aGVzZSBlbnVtIHZhbHVlcyB0byBlbnN1cmUgY29uc2lzdGVuY3kgYW5kIGF2b2lkIHR5cG9zIGluIGV2ZW50IG5hbWVzIHRocm91Z2hvdXQgeW91ciBhcHBsaWNhdGlvbi5cclxuICovXHJcbmV4cG9ydCBlbnVtIERlZmF1bHRKU0V2ZW50cyB7XHJcbiAgICBMb2FkID0gIFwibG9hZFwiLFxyXG4gICAgTW91c2VlbnRlciA9IFwibW91c2VlbnRlclwiLFxyXG4gICAgTW91c2VsZWF2ZSA9IFwibW91c2VsZWF2ZVwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIGRvd24uICovXHJcbiAgICBNb3VzZWRvd24gPSBcIm1vdXNlZG93blwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIG1vdXNlIGlzIG1vdmVkIG92ZXIgYW4gZWxlbWVudC4gKi9cclxuICAgIE1vdXNlbW92ZSA9IFwibW91c2Vtb3ZlXCIsXHJcbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkLiAqL1xyXG4gICAgTW91c2V1cCA9IFwibW91c2V1cFwiLFxyXG4gICAgTW91c2VvdmVyID0gXCJtb3VzZW92ZXJcIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGEga2V5IGlzIHJlbGVhc2VkIG9uIHRoZSBrZXlib2FyZC4gKi9cclxuICAgIEtleXVwID0gXCJrZXl1cFwiLFxyXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCBkb3duIG9uIHRoZSBrZXlib2FyZC4gKi9cclxuICAgIEtleWRvd24gPSBcImtleWRvd25cIixcclxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGFuIGVsZW1lbnQgbG9zZXMgZm9jdXMuICovXHJcbiAgICBCbHVyID0gXCJibHVyXCIsXHJcbiAgICBTZWxlY3RTdGFydCA9IFwic2VsZWN0c3RhcnRcIixcclxuICAgIFNlbGVjdGlvbkNoYW5nZSA9IFwic2VsZWN0aW9uY2hhbmdlXCIsXHJcbiAgICBDbGljayA9IFwiY2xpY2tcIixcclxuICAgIEZvY3VzaW4gPSBcImZvY3VzaW5cIixcclxuICAgIEZvY3Vzb3V0ID0gXCJmb2N1c291dFwiLFxyXG4gICAgRE9NQ29udGVudExvYWRlZCA9IFwiRE9NQ29udGVudExvYWRlZFwiLFxyXG4gICAgSW5wdXQgPSBcImlucHV0XCIsXHJcbiAgICBCYmxDbGljayA9IFwiZGJsY2xpY2tcIlxyXG59IiwiZXhwb3J0IGVudW0gQ3VzdG9tRXZlbnRzIHtcclxuICAgIC8vQ29tcG9uZW50IGV2ZW50c1xyXG4gICAgZmxvYXRpbmdUb29sYmFyRGlzcGxheWVkID0gXCJmbG9hdGluZ1Rvb2xiYXJEaXNwbGF5ZWRcIixcclxuXHJcbiAgICAvL1RleHQgY2xpY2sgZWRpdCBldmVudHNcclxuICAgIGFuY2hvckJ1dHRvbkNsaWNrZWQgPSBcImFuY2hvckJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGJvbGRCdXR0b25DbGlja2VkID0gXCJib2xkQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaXRhbGljQnV0dG9uQ2xpY2tlZCA9IFwiaXRhbGljQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgdW5kZXJsaW5lQnV0dG9uQ2xpY2tlZCA9IFwidW5kZXJsaW5lQnV0dG9uQ2xpY2tlZFwiLFxyXG4gICAgaW5saW5lQ29kZUJ1dHRvbkNsaWNrZWQgPSBcImlubGluZUNvZGVCdXR0b25DbGlja2VkXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoQnV0dG9uQ2xpY2tlZCA9IFwic3RyaWtlVGhyb3VnaEJ1dHRvbkNsaWNrZWRcIixcclxuICAgIGhpbGl0ZUNvbG9yQnV0dG9uQ2xpY2tlZCA9IFwiaGlsaXRlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBmb3JlQ29sb3JCdXR0b25DbGlja2VkID0gXCJmb3JlQ29sb3JCdXR0b25DbGlja2VkXCIsXHJcbiAgICBcclxuICAgIGJ1dHRvbkdyb3VwSXRlbUNsaWNrZWQgPSBcImJ1dHRvbkdyb3VwSXRlbUNsaWNrZWRcIixcclxuICAgIGZvY3VzT25GaXJzdFJlcXVlc3RlZCA9IFwiZm9jdXNPbkZpcnN0UmVxdWVzdGVkXCIsXHJcbiAgICBwcmVzc2VkRW50ZXJPblRpdGxlID0gXCJwcmVzc2VkRW50ZXJPblRpdGxlXCIsXHJcbiAgICBcclxuICAgIHRyYW5zZm9ybUJsb2NrUmVxdWVzdGVkID0gXCJ0cmFuc2Zvcm1CbG9ja1JlcXVlc3RlZFwiLFxyXG4gICAgZHVwbGljYXRlQmxvY2tSZXF1ZXN0ZWQgPSBcImR1cGxpY2F0ZUJsb2NrUmVxdWVzdGVkXCIsXHJcblxyXG4gICAgLy9UZXh0IGVkaXQgZXZlbnRzXHJcbiAgICBhbmNob3IgPSBcImFuY2hvclwiLFxyXG4gICAgYm9sZCA9IFwiYm9sZFwiLFxyXG4gICAgaXRhbGljID0gXCJpdGFsaWNcIixcclxuICAgIHVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICBpbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICBzdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICBoaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcblxyXG5cclxuICAgIHRleHRGb3JtYXRDaGFuZ2VkID0gXCJ0ZXh0Rm9ybWF0Q2hhbmdlZFwiLFxyXG4gICAgZW1pdHRlZENvbW1hbmQgPSBcImVtaXR0ZWRDb21tYW5kXCIsXHJcbiAgICBibG9ja1R5cGVDaGFuZ2VkID0gXCJibG9ja1R5cGVDaGFuZ2VkXCIsXHJcbiAgICBibG9ja0RlbGV0ZWQgPSBcImJsb2NrRGVsZXRlZFwiLFxyXG4gICAgYmxvY2tDbG9uZWQgPSBcImJsb2NrQ2xvbmVkXCIsXHJcbiAgICB0YWJsZUNlbGxDaGFuZ2VkID0gXCJ0YWJsZUNlbGxDaGFuZ2VkXCIsXHJcblxyXG5cclxuXHJcbiAgICAvL0Jsb2NrIGNvbW1hbmRzXHJcbiAgICBcclxufSIsImV4cG9ydCBlbnVtIFpJbmRleCB7XHJcbiAgICBMb3dJbXBvcnRhbmNlID0gXCIxMDBcIiwgXHJcbiAgICBTbGlnaHRseUltcG9ydGFudCA9IFwiMjAwXCIsXHJcbiAgICBOZXV0cmFsID0gXCIzMDBcIixcclxuICAgIE1vZGVyYXRlbHlJbXBvcnRhbnQgPSBcIjQwMFwiLFxyXG4gICAgVmVyeUltcG9ydGFudCA9IFwiNTAwXCIsIFxyXG4gICAgRXh0cmVtZWx5SW1wb3J0YW50ID0gXCI2MDBcIlxyXG59IiwiZXhwb3J0IGVudW0gQ29sb3JzIHtcclxuXHJcbiAgICBIaWxpdGVDb2xvclJlZCA9IFwiI0ZEREVERVwiLFxyXG4gICAgSGlsaXRlQ29sb3JHcmVlbiA9IFwiI0Q3RjdEQ1wiLFxyXG4gICAgSGlsaXRlQ29sb3JCbHVlID0gXCIjRDlFREY2XCIsXHJcbiAgICBIaWxpdGVDb2xvclllbGxvdyA9IFwiI0ZBRjREMVwiLFxyXG4gICAgSGlsaXRlQ29sb3JHcmV5ID0gXCIjRTFFMEUwXCIsXHJcbiAgICBIaWxpdGVDb2xvck5vbmUgPSBcInRyYW5zcGFyZW50XCIsXHJcblxyXG4gICAgRm9yZUNvbG9yUmVkID0gXCIjRDQ0QzQ3XCIsXHJcbiAgICBGb3JlQ29sb3JHcmVlbiA9IFwiIzQ0ODM2MVwiLFxyXG4gICAgRm9yZUNvbG9yQmx1ZSA9IFwiIzMzN0VBOVwiLFxyXG4gICAgRm9yZUNvbG9yWWVsbG93ID0gXCIjQ0I5MTJGXCIsXHJcbiAgICBGb3JlQ29sb3JHcmV5ID0gXCIjNzg3Nzc0XCIsXHJcbiAgICBGb3JlQ29sb3JJbml0aWFsID0gXCJpbml0aWFsXCIsXHJcblxyXG4gICAgQmFja2dyb3VuZENvbG9yUmVkID0gXCIjRkRERURFXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JHcmVlbiA9IFwiI0Q3RjdEQ1wiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yQmx1ZSA9IFwiI0Q5RURGNlwiLFxyXG4gICAgQmFja2dyb3VuZENvbG9yWWVsbG93ID0gXCIjRkFGNEQxXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JHcmV5ID0gXCIjRTFFMEUwXCIsXHJcbiAgICBCYWNrZ3JvdW5kQ29sb3JOb25lID0gXCJ0cmFuc3BhcmVudFwiLFxyXG5cclxuICAgIEljb25BY3RpdmVCbHVlID0gXCIjMjM4MmUyXCIsXHJcbiAgICBJY29uRGVmYXVsdEJsYWNrID0gXCJyZ2JhKDU1LCA1MywgNDcsIDAuODUpXCIsXHJcbiAgICBSZWQgPSBcInJlZFwiLFxyXG4gICAgVG9tYXRvID0gXCIjRUI1NzU3XCIsXHJcbiAgICBPcmlnaW5hbFRhYmxlQ29sb3IgPSBcIiM4NDg4OGRcIlxyXG5cclxufVxyXG5cclxuZXhwb3J0IGVudW0gQ29sb3JzTmFtZXMge1xyXG4gICAgQ2FsbG91dEJhY2tncm91bmRSZWQgPSBcImNhbGxvdXQtYmFja2dyb3VuZC1yZWRcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JlZW4gPSBcImNhbGxvdXQtYmFja2dyb3VuZC1ncmVlblwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRCbHVlID0gXCJjYWxsb3V0LWJhY2tncm91bmQtYmx1ZVwiLFxyXG4gICAgQ2FsbG91dEJhY2tncm91bmRZZWxsb3cgPSBcImNhbGxvdXQtYmFja2dyb3VuZC15ZWxsb3dcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kR3JleSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIixcclxuICAgIENhbGxvdXRCYWNrZ3JvdW5kTm9uZSA9IFwiY2FsbG91dC1iYWNrZ3JvdW5kLW5vbmVcIixcclxufSIsImV4cG9ydCBlbnVtIENvbW1hbmRzIHtcclxuICAgIC8qKiBUZXh0IG9wZXJhdGlvbnMgY29tbWFuZHMgKi9cclxuICAgIHRvZ2dsZUJvbGQgPSBcImJvbGRcIixcclxuICAgIHRvZ2dsZUl0YWxpYyA9IFwiaXRhbGljXCIsXHJcbiAgICB0b2dnbGVIaWxpdGVDb2xvciA9IFwiaGlsaXRlQ29sb3JcIixcclxuICAgIGNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IgPSBcImNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3JcIixcclxuICAgIHRvZ2dsZUZvcmVDb2xvciA9IFwiZm9yZUNvbG9yXCIsXHJcbiAgICB0b2dnbGVJbmxpbmVDb2RlID0gXCJpbmxpbmVDb2RlXCIsXHJcbiAgICB0b2dnbGVMaW5rID0gXCJjcmVhdGVMaW5rXCIsXHJcbiAgICBsaW5rUmVhZHlUb0luc2VydCA9IFwibGlua1JlYWR5VG9JbnNlcnRcIixcclxuICAgIHRvZ2dsZVVuZGVybGluZSA9IFwidW5kZXJsaW5lXCIsXHJcbiAgICB0b2dnbGVTdHJpa2VUaHJvdWdoID0gXCJzdHJpa2VUaHJvdWdoXCIsXHJcbiAgICByZW1vdmVGb3JtYXQgPSBcInJlbW92ZUZvcm1hdFwiLFxyXG4gICAgY29weVNlbGVjdGVkID0gXCJjb3B5U2VsZWN0ZWRcIixcclxuICAgIGN1dFNlbGVjdGVkID0gXCJjdXRTZWxlY3RlZFwiLFxyXG4gICAgcGFzdCA9IFwicGFzdFwiLFxyXG5cclxuICAgIC8qKiBCbG9jayBvcGVyYXRpb25zIGNvbW1hbmRzICovXHJcbiAgICB0cmFuc2Zvcm1CbG9jayA9IFwidHJhbnNmb3JtQmxvY2tcIixcclxuICAgIGR1cGxpY2F0ZUJsb2NrID0gXCJkdXBsaWNhdGVCbG9ja1wiLFxyXG4gICAgZGVsZXRlQmxvY2sgPSBcImRlbGV0ZUJsb2NrXCIsXHJcbiAgICBjcmVhdGVEZWZhdWx0QmxvY2sgPSBcImNyZWF0ZURlZmF1bHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbk5leHRCbG9jayA9IFwiZm9jdXNPbk5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPblByZXZpb3VzQmxvY2sgPSBcImZvY3VzT25QcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhQcmV2aW91c0Jsb2NrID0gXCJtZXJnZVdpdGhQcmV2aW91c0Jsb2NrXCIsXHJcbiAgICBtZXJnZVdpdGhOZXh0QmxvY2sgPSBcIm1lcmdlV2l0aE5leHRCbG9ja1wiLFxyXG4gICAgZm9jdXNPbkZpcnN0QmxvY2sgPSBcImZvY3VzT25GaXJzdEJsb2NrXCIsXHJcbiAgICBkZWxldGVCbG9ja0FuZEZvY3VzT25QcmV2aW91cyA9IFwiZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXNcIixcclxuICAgIGRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQgPSBcImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHRcIixcclxuXHJcbiAgICBKdXN0aWZ5TGVmdCA9IFwianVzdGlmeUxlZnRcIixcclxuICAgIEp1c3RpZnlDZW50ZXIgPSBcImp1c3RpZnlDZW50ZXJcIixcclxuICAgIEp1c3RpZnlSaWdodCA9IFwianVzdGlmeVJpZ2h0XCIsXHJcblxyXG4gICAgXHJcbiAgICAvKiogd2lsZGNhcmQgY29tbWFuZCBjb250ZXh0IGJhc2VkKi9cclxuICAgIGluc2VydE5ldyA9IFwiaW5zZXJ0TmV3XCIsXHJcblxyXG4gICAgLyoqIHRhYmxlIGNvbW1hbmRzICovXHJcbiAgICBpbnNlcnRUYWJsZVJvd0Fib3ZlID0gXCJpbnNlcnRUYWJsZVJvd0Fib3ZlXCIsXHJcbiAgICBpbnNlcnRUYWJsZVJvd0JlbG93ID0gXCJpbnNlcnRUYWJsZVJvd0JlbG93XCIsXHJcbiAgICBpbnNlcnRUYWJsZUNvbHVtbkxlZnQgPSBcImluc2VydFRhYmxlQ29sdW1uTGVmdFwiLFxyXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5SaWdodCA9IFwiaW5zZXJ0VGFibGVDb2x1bW5SaWdodFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgc2hvd0luc2VydFRhYmxlUm93RWxlbWVudCA9IFwic2hvd0luc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudFwiLFxyXG4gICAgaGlkZUluc2VydFRhYmxlUm93RWxlbWVudCA9IFwiaGlkZUluc2VydFRhYmxlUm93RWxlbWVudFwiLFxyXG4gICAgdG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yID0gXCJ0b2dnbGVDZWxsSGlsaXRlQ29sb3JcIixcclxuICAgIHJlbW92ZUNvbHVtbiA9IFwicmVtb3ZlQ29sdW1uXCIsXHJcbiAgICByZW1vdmVSb3cgPSBcInJlbW92ZVJvd1wiLFxyXG4gICAgY2hhbmdlVGFibGVCb3JkZXJDb2xvciA9IFwiY2hhbmdlVGFibGVCb3JkZXJDb2xvclwiLFxyXG5cclxuXHJcblxyXG4gICAgY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UgPSBcImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlXCJcclxufSIsImV4cG9ydCBlbnVtIEJ1dHRvbklEcyB7XHJcbiAgICBMaW5rID0gXCJsaW5rQnV0dG9uXCIsXHJcbiAgICBCb2xkID0gXCJib2xkQnV0dG9uXCIsXHJcbiAgICBJdGFsaWMgPSBcIml0YWxpY0J1dHRvblwiLFxyXG4gICAgVW5kZXJsaW5lID0gXCJ1bmRlcmxpbmVCdXR0b25cIixcclxuICAgIElubGluZUNvZGUgPSBcImlubGluZUNvZGVCdXR0b25cIixcclxuICAgIFN0cmlrZXRocm91Z2ggPSBcInN0cmlrZXRocm91Z2hCdXR0b25cIixcclxuXHJcbiAgICBBbGlnbkxlZnQgPSBcImFsaWduTGVmdFwiLFxyXG4gICAgQWxpZ25DZW50ZXIgPSBcImFsaWduQ2VudGVyXCIsXHJcbiAgICBBbGlnblJpZ2h0ID0gXCJhbGlnblJpZ2h0XCJcclxufSIsImV4cG9ydCBlbnVtIEtleWJvYXJkS2V5cyB7XHJcbiAgICBTaGlmdCA9IFwiU2hpZnRcIixcclxuICAgIEVudGVyID0gXCJFbnRlclwiLFxyXG4gICAgRXNjYXBlID0gXCJFc2NhcGVcIixcclxuICAgIEJhY2tzcGFjZSA9IFwiQmFja3NwYWNlXCIsXHJcbiAgICBDb250cm9sID0gXCJDb250cm9sXCIsXHJcbiAgICBTcGFjZSA9IFwiIFwiLFxyXG4gICAgRGVsZXRlID0gXCJEZWxldGVcIlxyXG59IiwiZXhwb3J0IGVudW0gRHJvcGRvd25JdGVtSURzIHtcclxuICAgIEJhY2tncm91bmRPcHRpb25SZWQgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmVlbiA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiLFxyXG4gICAgQmFja2dyb3VuZE9wdGlvbkJsdWUgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25ZZWxsb3cgPSBcIkJhY2tncm91bmRPcHRpb25SZWRcIixcclxuICAgIEJhY2tncm91bmRPcHRpb25HcmV5ID0gXCJCYWNrZ3JvdW5kT3B0aW9uUmVkXCIsXHJcbiAgICBCYWNrZ3JvdW5kT3B0aW9uTm9uZSA9IFwiQmFja2dyb3VuZE9wdGlvblJlZFwiXHJcbn0iLCJleHBvcnQgZW51bSBET01FbGVtZW50cyB7XHJcbiAgICBURCA9IFwidGRcIixcclxuICAgIFRBQkxFID0gXCJ0YWJsZVwiXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bkxpc3RJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uU2VsZWN0ID0gXCJjb2xvclRleHRPcHRpb25TZWxlY3RcIixcclxuXHJcbn0iLCJleHBvcnQgZW51bSBEcm9wZG93bk1lbnVJRHMge1xyXG4gICAgQ29sb3JUZXh0T3B0aW9uc01lbnUgPSBcImNvbG9yVGV4dE9wdGlvbnNNZW51XCJcclxufSIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9tYWluLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xub3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL21haW4uY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgICBzdGF0aWMgZ2VuZXJhdGVVbmlxdWVJZCgpIHtcbiAgICAgICAgY29uc3QgdGltZVBhcnQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgY29uc3QgcmFuZG9tQXJyYXkgPSBuZXcgVWludDMyQXJyYXkoMSk7XG4gICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbUFycmF5KTtcbiAgICAgICAgY29uc3QgcmFuZG9tUGFydCA9IHJhbmRvbUFycmF5WzBdLnRvU3RyaW5nKDM2KTtcbiAgICAgICAgcmV0dXJuIHRpbWVQYXJ0ICsgcmFuZG9tUGFydDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmdiVG9IZXgocmdiOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZ2JBcnJheSA9IHJnYi5tYXRjaCgvXFxkKy9nKSEubWFwKE51bWJlcik7XG4gICAgICAgIHJldHVybiBcIiNcIiArIHJnYkFycmF5Lm1hcCh4ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9IHgudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICAgICAgfSkuam9pbihcIlwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNWYWxpZFVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKGh0dHBzPzpcXFxcL1xcXFwvKScgK1xuICAgICAgICAgICAgJyg/IS0pW2EtekEtWlxcXFxkLV17MSw2M30oPzwhLSlcXFxcLicgK1xuICAgICAgICAgICAgJyhbYS16QS1aXFxcXGQtXStcXFxcLikqW2EtekEtWl17Mix9JyArXG4gICAgICAgICAgICAnKFxcXFw6XFxcXGR7MSw1fSk/JyArXG4gICAgICAgICAgICAnKFxcXFwvWy1hLXpBLVpcXFxcZCVfLn4rXSopKicgK1xuICAgICAgICAgICAgJyhcXFxcP1stYS16QS1aXFxcXGQlXy5+Kz0mXSopPycgK1xuICAgICAgICAgICAgJygjWy1hLXpBLVpcXFxcZF9dKik/JCcsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICBcbiAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnLi4vJykgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJyUyZSUyZScpIHx8IHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCclMDAnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodXJsKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgQ29udGVudFR5cGVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbnRlbnRUeXBlc1wiO1xuaW1wb3J0IHsgSUVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuL0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xuaW1wb3J0IHsgVG9vbGJveE9wdGlvbnMgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuXG5pbnRlcmZhY2UgRWxlbWVudENyZWF0b3Ige1xuICAgIChjb250ZW50OiBzdHJpbmcgfCBudWxsKTogSFRNTEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgY3JlYXRvcnM6IHsgW3R5cGU6IHN0cmluZ106IEVsZW1lbnRDcmVhdG9yIH07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5U2VydmljZTtcblxuICAgIHN0YXRpYyBFTEVNRU5UX1RZUEVTID0ge1xuICAgICAgICBCTE9DS19QQVJBR1JBUEg6IFwiYmxvY2stcFwiLFxuICAgICAgICBQQVJBR1JBUEg6IFwicFwiLFxuICAgICAgICBDSEVDS0JPWF9JVEVNOiBcImNoZWNrYm94SXRlbVwiLFxuICAgICAgICBMSVNUX0lURU06IFwibGlzdEl0ZW1cIixcbiAgICAgICAgQ09ERTogXCJjb2RlXCIsXG4gICAgICAgIFFVT1RFOiBcImJsb2NrcXVvdGVcIixcbiAgICAgICAgQlVMTEVURURfTElTVDogXCJ1bFwiLFxuICAgICAgICBOVU1CRVJFRF9MSVNUOiBcIm9sXCIsXG4gICAgICAgIENIRUNLX0xJU1Q6IFwiY2hlY2tMaXN0c1wiLFxuICAgICAgICBIRUFERVJfMTogXCJoMVwiLFxuICAgICAgICBIRUFERVJfMjogXCJoMlwiLFxuICAgICAgICBIRUFERVJfMzogXCJoM1wiLFxuICAgICAgICBIRUFERVJfNDogXCJoNFwiLFxuICAgICAgICBIRUFERVJfNTogXCJoNVwiLFxuICAgICAgICBIRUFERVJfNjogXCJoNlwiLFxuICAgICAgICBEUkFHX0hBTkRMRV9CVVRUT046IFwiZHJhZy1oYW5kbGUtYnV0dG9uXCIsXG4gICAgICAgIFRBQkxFOiBcInRhYmxlXCIsXG4gICAgICAgIElNQUdFOiBcImltYWdlXCIsXG4gICAgICAgIFZJREVPOiBcInZpZGVvXCIsXG4gICAgICAgIFNQT1RJRlk6IFwic3BvdGlmeVwiLFxuICAgICAgICBHSVRIVUJfR0lTVDogXCJnaXRodWItZ2lzdFwiLFxuICAgICAgICBHSVRMQUJfU05JUFBFVDogXCJnaXRsYWItc25pcHBldFwiLFxuICAgICAgICBDT0RFUEVOOiBcImNvZGVwZW5cIixcbiAgICAgICAgQ0FMTE9VVDogXCJjYWxsb3V0XCIsXG4gICAgICAgIFNFUEFSQVRPUjogXCJzZXBhcmF0b3JcIlxuICAgIH1cblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgaWYgKEVsZW1lbnRGYWN0b3J5U2VydmljZS5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVhdG9ycyA9IHt9O1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQkxPQ0tfUEFSQUdSQVBILCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGhDcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBhcmFncmFwaENyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tCT1hfSVRFTSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbUNyZWF0b3IoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTElTVF9JVEVNLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1DcmVhdG9yKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jb2RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnF1b3RlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYnVsbGV0ZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBFbGVtZW50RmFjdG9yeVNlcnZpY2UubnVtYmVyZWRMaXN0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDEpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDIpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmhlYWRpbmdDcmVhdG9yKDYpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5kcmFnSGFuZGxlQnV0dG9uQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5UQUJMRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnRhYmxlQ3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSW1hZ2UsIEljb25zLkltYWdlMiwgXCJVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2VcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRVcGxvYWQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJpbWFnZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU8sIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuWW91VHViZSwgXCJFbWJlZCBhIFlvdVR1YmUgdmlkZW9cIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJ5b3V0dWJlLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIl0pKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TUE9USUZZLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGxhY2Vob2xkZXJDcmVhdG9yKENvbnRlbnRUeXBlcy5JZnJhbWUsIEljb25zLlNwb3RpZnksIFwiRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrXCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWQsIFwic3BvdGlmeS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuR0lUSFVCX0dJU1QsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5wbGFjZWhvbGRlckNyZWF0b3IoQ29udGVudFR5cGVzLklmcmFtZSwgSWNvbnMuR2l0SHViLCBcIkVtYmVkIGEgR2l0SHViIEdpc3RcIiwgW0NvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRFbWJlZCwgXCJnaXRodWItZ2lzdC1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCJdKSk7XG4gICAgICAgIC8vdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRMQUJfU05JUFBFVCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuU2NyaXB0LCBJY29ucy5HaXRMYWIsIFwiRW1iZWQgYSBzbmlwcGV0XCIsIFtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0RW1iZWRdKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERVBFTiwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLnBsYWNlaG9sZGVyQ3JlYXRvcihDb250ZW50VHlwZXMuSWZyYW1lLCBJY29ucy5Db2RlUGVuLCBcIkVtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtb1wiLCBbQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dEVtYmVkLCBcImNvZGVwZW4tZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiXSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5jYWxsb3V0Q3JlYXRvcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5zZXBhcmF0b3JDcmVhdG9yKCkpO1xuXG5cbiAgICAgICAgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLl9pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEVsZW1lbnRGYWN0b3J5U2VydmljZSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgRWxlbWVudEZhY3RvcnlTZXJ2aWNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3Rlcih0eXBlOiBzdHJpbmcsIGNyZWF0b3I6IEVsZW1lbnRDcmVhdG9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3JlYXRvcnNbdHlwZV0gPSBjcmVhdG9yO1xuICAgIH1cblxuICAgIGNyZWF0ZSh0eXBlOiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JzW3R5cGVdO1xuXG4gICAgICAgIGlmICghY3JlYXRvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gY3JlYXRvciByZWdpc3RlcmVkIGZvciB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3JlYXRvcihjb250ZW50IHx8IFwiXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGJsb2NrUGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuYmxvY2tQYXJhZ3JhcGgoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcGFyYWdyYXBoQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UucGFyYWdyYXBoKGNvbnRlbnQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmdDcmVhdG9yKGxldmVsOiBudW1iZXIpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuaGVhZGluZyhsZXZlbCwgY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tib3hJdGVtQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuY2hlY2tib3hJdGVtKGNvbnRlbnQgfHwgXCJcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbGlzdEl0ZW1DcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcblxuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZHJhZ0hhbmRsZUJ1dHRvbkNyZWF0b3IoKTogRWxlbWVudENyZWF0b3Ige1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmRyYWdIYW5kbGVCdXR0b24oKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb2RlQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJpZ25vcmUtZXZlbnRzXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgY29kZUJsb2NrLmNsYXNzTGlzdC5hZGQoXCJjb2RlLWJsb2NrXCIsIFwiaWdub3JlLXF1aWNrLW1lbnVcIiwgXCJpZ25vcmUtdGV4dC1mbG9hdGluZy10b29sYmFyXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgICAgIHByZS5jbGFzc0xpc3QuYWRkKFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MsIFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcblxuICAgICAgICAgICAgY29uc3QgY29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgICAgICAgIGNvZGUuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICBjb2RlLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCIvKiBDb2RlIHNuaXBwZXQgKi9cIik7XG4gICAgICAgICAgICBjb2RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgY29kZS5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb2RlJywgXCJmb2N1c2FibGVcIiwgXCJobGpzXCIsIFwibGFuZ3VhZ2UtcGxhaW50ZXh0XCIpO1xuICAgICAgICAgICAgY29kZS5zZXRBdHRyaWJ1dGUoXCJzcGVsbENoZWNrXCIsIFwiZmFsc2VcIik7XG5cbiAgICAgICAgICAgIHByZS5hcHBlbmRDaGlsZChjb2RlKTtcblxuICAgICAgICAgICAgY29kZS5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29kZS5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWhpZ2hsaWdodGVkXCIpO1xuICAgICAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBjb2RlQmxvY2suYXBwZW5kQ2hpbGQobGFuZ3VhZ2VTZWxlY3Rvcik7XG4gICAgICAgICAgICBjb2RlQmxvY2suYXBwZW5kQ2hpbGQocHJlKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjb2RlQmxvY2spO1xuXG4gICAgICAgICAgICBobGpzLmhpZ2hsaWdodEVsZW1lbnQoY29kZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZW50RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiam9oYW5uZXMtY29udGVudC1lbGVtZW50XCIsIFwic3dpdHRhYmxlXCIpO1xuXG4gICAgICAgICAgICBjb25zdCBibG9ja3F1b3RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJsb2NrcXVvdGVcIik7XG4gICAgICAgICAgICBibG9ja3F1b3RlLmNsYXNzTGlzdC5hZGQoXCJmb2N1c2FibGVcIik7XG4gICAgICAgICAgICBibG9ja3F1b3RlLnRleHRDb250ZW50ID0gY29udGVudCB8fCBcIlwiO1xuICAgICAgICAgICAgYmxvY2txdW90ZS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICAgIGJsb2NrcXVvdGUuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0UmFuZG9tUXVvdGUoKSk7XG5cbiAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGJsb2NrcXVvdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gY29udGVudEVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFJhbmRvbVF1b3RlKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHF1b3RhdGlvbnMgPSBbXG4gICAgICAgICAgICBcIlRhbGsgaXMgY2hlYXAuIFNob3cgbWUgdGhlIGNvZGUuIC0gTGludXMgVG9ydmFsZHNcIixcbiAgICAgICAgICAgIFwiUHJlbWF0dXJlIG9wdGltaXphdGlvbiBpcyB0aGUgcm9vdCBvZiBhbGwgZXZpbC4gLSBEb25hbGQgS251dGhcIixcbiAgICAgICAgICAgIFwiVGhlIG1vc3QgZGFuZ2Vyb3VzIHBocmFzZSBpbiB0aGUgbGFuZ3VhZ2UgaXMsICdXZSd2ZSBhbHdheXMgZG9uZSBpdCB0aGlzIHdheS4nIC0gR3JhY2UgSG9wcGVyXCIsXG4gICAgICAgICAgICBcIlNpbXBsaWNpdHkgaXMgcHJlcmVxdWlzaXRlIGZvciByZWxpYWJpbGl0eS4gLSBFZHNnZXIgVy4gRGlqa3N0cmFcIixcbiAgICAgICAgICAgIFwiQW55IGZvb2wgY2FuIHdyaXRlIGNvZGUgdGhhdCBhIGNvbXB1dGVyIGNhbiB1bmRlcnN0YW5kLiBHb29kIHByb2dyYW1tZXJzIHdyaXRlIGNvZGUgdGhhdCBodW1hbnMgY2FuIHVuZGVyc3RhbmQuIC0gTWFydGluIEZvd2xlclwiLFxuICAgICAgICAgICAgXCJGaXJzdCwgc29sdmUgdGhlIHByb2JsZW0uIFRoZW4sIHdyaXRlIHRoZSBjb2RlLiAtIEpvaG4gSm9obnNvblwiLFxuICAgICAgICAgICAgXCJJbiBwcm9ncmFtbWluZywgdGhlIGhhcmQgcGFydCBpc24ndCBzb2x2aW5nIHByb2JsZW1zLCBidXQgZGVjaWRpbmcgd2hhdCBwcm9ibGVtcyB0byBzb2x2ZS4gLSBQYXVsIEdyYWhhbVwiLFxuICAgICAgICAgICAgXCJDb2RlIGlzIGxpa2UgaHVtb3IuIFdoZW4geW91IGhhdmUgdG8gZXhwbGFpbiBpdCwgaXQncyBiYWQuIC0gQ29yeSBIb3VzZVwiLFxuICAgICAgICAgICAgXCJNYWtlIGl0IHdvcmssIG1ha2UgaXQgcmlnaHQsIG1ha2UgaXQgZmFzdC4gLSBLZW50IEJlY2tcIixcbiAgICAgICAgICAgIFwiQmVmb3JlIHNvZnR3YXJlIGNhbiBiZSByZXVzYWJsZSBpdCBmaXJzdCBoYXMgdG8gYmUgdXNhYmxlLiAtIFJhbHBoIEpvaG5zb25cIlxuICAgICAgICBdO1xuICAgIFxuICAgICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHF1b3RhdGlvbnMubGVuZ3RoKTsgICAgXG4gICAgICAgIHJldHVybiBxdW90YXRpb25zW2luZGV4XTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjaGVja0xpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgLy8gdWwuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB1bC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIHVsLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnbGlzdCcpO1xuICAgICAgICAgICAgdWwuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gtbGlzdCcpO1xuICAgICAgICAgICAgdWwuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgQ29udGVudFR5cGVzLkNoZWNrTGlzdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNoZWNrYm94SXRlbShjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICB1bC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB1bDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBidWxsZXRlZExpc3RDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtY29udGVudC10eXBlXCIsIENvbnRlbnRUeXBlcy5CdWxsZXRlZExpc3QpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc3dpdHRhYmxlJyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QnKTtcblxuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEl0ZW0gPSBFbGVtZW50RmFjdG9yeVNlcnZpY2UubGlzdEl0ZW1fMihjb250ZW50IHx8IFwiXCIpO1xuXG4gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGluaXRpYWxJdGVtKTtcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbnVtYmVyZWRMaXN0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuTnVtYmVyZWRMaXN0KTtcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnam9oYW5uZXMtY29udGVudC1lbGVtZW50Jyk7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaXN0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJdGVtID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmxpc3RJdGVtXzIoY29udGVudCB8fCBcIlwiKTtcblxuICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChpbml0aWFsSXRlbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdGFibGVDcmVhdG9yKCk6IEVsZW1lbnRDcmVhdG9yIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCB0YWJsZVNoZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRhYmxlU2hlbGwuY2xhc3NMaXN0LmFkZChcInRhYmxlLXNoZWxsXCIsIFwiaWdub3JlLXF1aWNrLW1lbnVcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlQ29udHJvbGxlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuY2xhc3NMaXN0LmFkZChcInRhYmxlLWNvbnRyb2xsZXJcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0YWJsZVdyYXBwZXIuY2xhc3NMaXN0LmFkZChcInRhYmxlLXdyYXBwZXJcIik7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTtcbiAgICAgICAgICAgIHRhYmxlLmNsYXNzTGlzdC5hZGQoXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgXCJ0YWJsZVwiLCBUb29sYm94T3B0aW9ucy5JbmNsdWRlQmxvY2tUb29sYmFyQ2xhc3MsIFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzLCBUb29sYm94T3B0aW9ucy5FeHRyYU9wdGlvbnNDbGFzcyk7XG4gICAgICAgICAgICB0YWJsZS5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiLCBDb250ZW50VHlwZXMuVGFibGUpO1xuXG4gICAgICAgICAgICB0YWJsZVNoZWxsLmFwcGVuZENoaWxkKHRhYmxlQ29udHJvbGxlcik7XG4gICAgICAgICAgICB0YWJsZUNvbnRyb2xsZXIuYXBwZW5kQ2hpbGQodGFibGVXcmFwcGVyKTtcbiAgICAgICAgICAgIHRhYmxlV3JhcHBlci5hcHBlbmRDaGlsZCh0YWJsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIHRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTtcblxuICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGNvbnRlbnQgPyBjb250ZW50LnNwbGl0KCcsJykgOiBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7XG4gICAgICAgICAgICByb3dEYXRhLmZvckVhY2goY2VsbENvbnRlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpO1xuICAgICAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImZvY3VzYWJsZVwiKTtcbiAgICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xuICAgICAgICAgICAgICAgIGNlbGwudGV4dENvbnRlbnQgPSBjZWxsQ29udGVudDtcbiAgICAgICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJztcbiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoY2VsbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgICAgICAgICAgY29uc3QgYWRkUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGFkZFJvdy5jbGFzc0xpc3QuYWRkKFwiYWRkLXRhYmxlLXJvd1wiKTtcbiAgICAgICAgICAgIGFkZFJvdy5pbm5lckhUTUwgPSBgPHN2ZyB3aWR0aD1cIjFyZW1cIiBoZWlnaHQ9XCIxcmVtXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjx1c2UgeGxpbms6aHJlZj1cIiNpY29uLXBsdXNcIj48L3VzZT48L3N2Zz5gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmNsYXNzTGlzdC5hZGQoXCJhZGQtdGFibGUtY29sdW1uXCIpO1xuICAgICAgICAgICAgYWRkQ29sdW1uLmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMXJlbVwiIGhlaWdodD1cIjFyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSB4bGluazpocmVmPVwiI2ljb24tcGx1c1wiPjwvdXNlPjwvc3ZnPmA7XG5cbiAgICAgICAgICAgIHRhYmxlQ29udHJvbGxlci5hcHBlbmRDaGlsZChhZGRSb3cpO1xuICAgICAgICAgICAgdGFibGVDb250cm9sbGVyLmFwcGVuZENoaWxkKGFkZENvbHVtbik7XG5cbiAgICAgICAgICAgIHJldHVybiB0YWJsZVNoZWxsO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHBsYWNlaG9sZGVyQ3JlYXRvcihjb250ZW50VHlwZTogQ29udGVudFR5cGVzLCBpY29uOiBJY29ucywgdGV4dDogc3RyaW5nLCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdKTogRWxlbWVudENyZWF0b3Ige1xuICAgICAgICByZXR1cm4gY29udGVudCA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKENvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnQsIFwic3dpdHRhYmxlXCIsIFwibm8tc2VsZWN0aW9uXCIsIFRvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIiwgY29udGVudFR5cGUpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZChcImNvbnRlbnQtcGxhY2Vob2xkZXJcIiwgQ29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2ssIC4uLmNsYXNzZXMpO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlckljb24gPSB0aGlzLmNyZWF0ZUljb24oaWNvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0LmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XG4gICAgICAgICAgICBwbGFjZWhvbGRlclRleHQuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgICAgICAgICAgY29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgcGxhY2Vob2xkZXIuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXJJY29uKTtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyLmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyVGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZW50RWxlbWVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjYWxsb3V0Q3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiBjb250ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGpvaGFubmVzQ2FsbG91dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgam9oYW5uZXNDYWxsb3V0LmNsYXNzTGlzdC5hZGQoXCJpZ25vcmUtcXVpY2stbWVudVwiLCBcImNhbGxvdXRcIiwgXCJqb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIiwgXCJzd2l0dGFibGVcIiwgVG9vbGJveE9wdGlvbnMuSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzLCBUb29sYm94T3B0aW9ucy5Db2xvclRvb2xDbGFzcywgVG9vbGJveE9wdGlvbnMuRXh0cmFPcHRpb25zQ2xhc3MpO1xuXG4gICAgICAgICAgICBjb25zdCBjYWxsb3V0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjYWxsb3V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC1iYWNrZ3JvdW5kLWdyZXlcIiwgXCJjYWxsb3V0LXdyYXBwZXJcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgICAgICAgICAgdGV4dEFyZWEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlR5cGUgc29tZXRoaW5nLi4uXCIpO1xuICAgICAgICAgICAgdGV4dEFyZWEuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgICAgICB0ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKFwiY2FsbG91dC10ZXh0XCIsIFwiZWRpdGFibGVcIiwgXCJmb2N1c2FibGVcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNhbGxvdXRXcmFwcGVyLmFwcGVuZENoaWxkKHRleHRBcmVhKTtcbiAgICAgICAgICAgIGpvaGFubmVzQ2FsbG91dC5hcHBlbmRDaGlsZChjYWxsb3V0V3JhcHBlcik7XG5cbiAgICAgICAgICAgIHJldHVybiBqb2hhbm5lc0NhbGxvdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2VwYXJhdG9yQ3JlYXRvcigpOiBFbGVtZW50Q3JlYXRvciB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcblxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB3cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJzZXBhcmF0b3Itd3JhcHBlclwiKTtcblxuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKTtcbiAgICAgICAgICAgIHNlcGFyYXRvci5jbGFzc0xpc3QuYWRkKCdzZXBhcmF0b3InKTtcbiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJhZ3JhcGgoY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICAgICAgcC5pbm5lclRleHQgPSBjb250ZW50IHx8IFwiXCI7XG4gICAgICAgIHAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLWNvbnRlbnQtdHlwZScsIENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBwLmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIHAuc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1dyaXRlIHNvbWV0aGluZyBvciB0eXBlIC8gKHNsYXNoKSB0byBjaG9vc2UgYSBibG9jay4uLicpO1xuXG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGhlYWRpbmcobGV2ZWw6IG51bWJlciwgY29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGBoJHtsZXZlbH1gKTtcblxuICAgICAgICBoLmlubmVyVGV4dCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgICAgaC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudC10eXBlJywgYGgke2xldmVsfWApO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2pvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ3N3aXR0YWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBoLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGguY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAgICAgaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCBgSGVhZGluZyAke2xldmVsfWApO1xuXG4gICAgICAgIHJldHVybiBoO1xuICAgIH1cblxuICAgIHN0YXRpYyBjaGVja2JveEl0ZW0oY29udGVudDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGlkID0gVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpO1xuXG4gICAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGVsZXRhYmxlXCIsIFwibm8tbGlzdC1zdHlsZVwiLCBcImxpc3QtaXRlbVwiLCBcImxpc3QtaXRlbS1jaGVja2FibGVcIik7XG5cbiAgICAgICAgLy8gaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcblxuICAgICAgICBsZXQgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBjaGVja2JveC5pZCA9IGlkO1xuICAgICAgICBjaGVja2JveC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTtcbiAgICAgICAgLy8gY2hlY2tib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG5cbiAgICAgICAgbGV0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ1RvLWRvJyk7XG4gICAgICAgIHNwYW4uY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiZm9yXCIsIGlkKTtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJ0cnVlXCIpO1xuXG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKCdmb2N1cycpO1xuXG4gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIHByaXZhdGUgc3RhdGljIGxpc3RJdGVtKHRleHQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcblxuICAgIC8vICAgICBsZXQgaW5pdGlhbEl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuXG4gICAgLy8gICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgIC8vICAgICBpbml0aWFsSXRlbS5jbGFzc0xpc3QuYWRkKCdkZWxldGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgna2V5LXRyaWdnZXInKTtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtJyk7XG5cbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uaW5uZXJUZXh0ID0gdGV4dDtcblxuICAgIC8vICAgICBpbml0aWFsSXRlbS5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAvLyAgICAgaW5pdGlhbEl0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0l0ZW0nKTtcblxuICAgIC8vICAgICByZXR1cm4gaW5pdGlhbEl0ZW07XG5cbiAgICAvLyB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBsaXN0SXRlbV8yKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGxldCBpbml0aWFsSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG5cbiAgICAgICAgaW5pdGlhbEl0ZW0uY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIGluaXRpYWxJdGVtLmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbScpO1xuXG4gICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzYWJsZScpO1xuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZCgnZWRpdGFibGUnKTtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIGRpdi5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2tleS10cmlnZ2VyJyk7XG4gICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnSXRlbScpO1xuXG4gICAgICAgIGluaXRpYWxJdGVtLmFwcGVuZENoaWxkKGRpdik7XG5cblxuICAgICAgICBkaXYuaW5uZXJUZXh0ID0gY29udGVudCB8fCBcIlwiO1xuXG4gICAgICAgIC8vIGluaXRpYWxJdGVtLmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxJdGVtO1xuICAgIH1cblxuXG4gICAgc3RhdGljIGJsb2NrUGFyYWdyYXBoKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG5cbiAgICAgICAgbGV0IG5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBuZXdEaXYuaWQgPSBgYi0ke1V0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKX1gO1xuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IEVsZW1lbnRGYWN0b3J5U2VydmljZS5wYXJhZ3JhcGgoY29udGVudCk7XG5cbiAgICAgICAgLy8gbGV0IGRyYWdIYW5kbGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmlubmVySFRNTCA9ICc8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjaWNvbi1tYXRlcmlhbC1kcmFnXCI+PC91c2U+PC9zdmc+JztcblxuICAgICAgICAvLyBuZXdEaXYuYXBwZW5kQ2hpbGQobmV3QnV0dG9uKTtcbiAgICAgICAgbmV3RGl2LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgIG5ld0Rpdi5jbGFzc0xpc3QuYWRkKCdibG9jaycpO1xuICAgICAgICBuZXdEaXYuY2xhc3NMaXN0LmFkZCgnZGVsZXRhYmxlJyk7XG4gICAgICAgIC8vIGRyYWdIYW5kbGVyLmNsYXNzTGlzdC5hZGQoJ2RyYWctaGFuZGxlcicpO1xuICAgICAgICAvLyBkcmFnSGFuZGxlci5jbGFzc0xpc3QuYWRkKCdidXR0b24tcmVzZXQnKTtcbiAgICAgICAgLy8gZHJhZ0hhbmRsZXIuZHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gbmV3RGl2O1xuICAgIH1cblxuICAgIHN0YXRpYyBkcmFnSGFuZGxlQnV0dG9uKCkge1xuXG4gICAgICAgIGNvbnN0IGRyYWdIYW5kbGVyV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGRyYWdIYW5kbGVyV3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiZHJhZy1oYW5kbGVyLXdyYXBwZXJcIiwgQ29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5KTtcblxuICAgICAgICBsZXQgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGJ1dHRvbi5pbm5lckhUTUwgPSAnPHN2ZyB3aWR0aD1cIjEuMzc1cmVtXCIgaGVpZ2h0PVwiMS4zNzVyZW1cIiBmaWxsPVwiY3VycmVudENvbG9yXCI+PHVzZSBocmVmPVwiI2ljb24tbWF0ZXJpYWwtZHJhZ1wiPjwvdXNlPjwvc3ZnPic7XG5cbiAgICAgICAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoQ29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5LCBcImRyYWctaGFuZGxlclwiLCBcImJ1dHRvbi1yZXNldFwiKTtcbiAgICAgICAgYnV0dG9uLmRyYWdnYWJsZSA9IHRydWU7XG5cblxuICAgICAgICBkcmFnSGFuZGxlcldyYXBwZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgICAgICByZXR1cm4gZHJhZ0hhbmRsZXJXcmFwcGVyO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVJY29uKGljb25JZDogc3RyaW5nKSB7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaWNvbi13cmFwcGVyXCIpO1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGA8c3ZnIHdpZHRoPVwiMS4zNzVyZW1cIiBoZWlnaHQ9XCIxLjM3NXJlbVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48dXNlIGhyZWY9XCIjJHtpY29uSWR9XCI+PC91c2U+PC9zdmc+YDtcblxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVVJQ29tcG9uZW50PFQgZXh0ZW5kcyBIVE1MRWxlbWVudCA9IEhUTUxFbGVtZW50PiB7XHJcblxyXG4gICAgaWQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9jYW5IaWRlOiBib29sZWFuO1xyXG5cclxuICAgIGNsYXNzTGlzdDogc3RyaW5nW10gPSBbXTtcclxuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xyXG4gICAgaHRtbEVsZW1lbnQ6IFQ7XHJcbiAgICBwYXJlbnQ/OiBCYXNlVUlDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50ID0gdGhpcy5pbml0KCkgYXMgVDtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYW4gSFRNTEVsZW1lbnQgdXNpbmcgdGhlIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgQVBJLlxyXG4gICAgKiBUaGlzIGFic3RyYWN0IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZlxyXG4gICAgKiBIVE1MRWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCBwb3NzaWJseSBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMgb3Igc3R5bGVzLlxyXG4gICAgKiBEZXBlbmRlbmNpZXMgbmVlZGVkIGJ5IHRoZSBzdWJjbGFzc2VzIGFyZSBwYXNzZWQgdGhyb3VnaCB0aGUgY29uc3RydWN0b3IgYW5kXHJcbiAgICAqIGFyZSB0eXBpY2FsbHkgbWFkZSBhdmFpbGFibGUgdmlhIHRoaXMucHJvcHMgZm9yIHVzZSB3aXRoaW4gdGhpcyBtZXRob2QuXHJcbiAgICAqXHJcbiAgICAqIEBhYnN0cmFjdFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBFeGFtcGxlIHN1YmNsYXNzIHRoYXQgdXNlcyBhIGRlcGVuZGVuY3kgcGFzc2VkIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yLlxyXG4gICAgKiBjbGFzcyBUb29sYmFyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuICAgICogICAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY3kpIHtcclxuICAgICogICAgICAgICBzdXBlcih7ZGVwZW5kZW5jeTogZGVwZW5kZW5jeX0pO1xyXG4gICAgKiAgICAgICAgIHRoaXMuZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3k7XHJcbiAgICAqICAgICB9XHJcbiAgICAqXHJcbiAgICAqICAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICogICAgICAgICBjb25zdCB0b29sYmFyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmNsYXNzTmFtZSA9ICd0b29sYmFyJztcclxuICAgICogICAgICAgICAvLyBVc2luZyB0aGUgZGVwZW5kZW5jeVxyXG4gICAgKiAgICAgICAgIHRvb2xiYXJFbGVtZW50LmF0dHJpYnV0ZShcImN1c3RvbURlcGVuZGVuY3lCYXNlZFwiLCB0aGlzLmRlcGVuZGVuY3kuZGF0YSk7XHJcbiAgICAqICAgXHJcbiAgICAqICAgICAgICAgcmV0dXJuIHRvb2xiYXJFbGVtZW50O1xyXG4gICAgKiAgICAgfVxyXG4gICAgKiB9XHJcbiAgICAqXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG5ld2x5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgSFRNTEVsZW1lbnQuXHJcbiAgICAqL1xyXG4gICAgYWJzdHJhY3QgaW5pdCgpOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnYmxvY2snO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElkKGlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENzc0NsYXNzKC4uLnRva2Vuczogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5wdXNoKC4uLnRva2Vucyk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLnRva2Vucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFwcGVuZHMgdGhpcyBjb21wb25lbnQncyBIVE1MIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgY29tcG9uZW50J3MgSFRNTCBlbGVtZW50LlxyXG4gICAgKiBUaGlzIG1ldGhvZCBlc3RhYmxpc2hlcyBhIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgaW4gdGhlIERPTSBieSBhcHBlbmRpbmcgdGhpcyBpbnN0YW5jZSdzXHJcbiAgICAqIGVsZW1lbnQgYXMgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50J3MgZWxlbWVudC4gSXQgYWxzbyB1cGRhdGVzIHRoZSBwYXJlbnQgcHJvcGVydHkgb2YgdGhpc1xyXG4gICAgKiBpbnN0YW5jZSB0byByZWZlciB0byB0aGUgcHJvdmlkZWQgcGFyZW50IGNvbXBvbmVudC5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtCYXNlVUlDb21wb25lbnR9IHBhcmVudCBUaGUgcGFyZW50IGNvbXBvbmVudCB0byB3aGljaCB0aGlzIGNvbXBvbmVudCdzIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZC5cclxuICAgICogVGhpcyBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgQmFzZVVJQ29tcG9uZW50IG9yIGFueSBvZiBpdHMgc3ViY2xhc3NlcywgZW5zdXJpbmcgdGhhdCBpdCBoYXMgYW4gaHRtbEVsZW1lbnQgcHJvcGVydHkuXHJcbiAgICAqL1xyXG4gICAgYXBwZW5kVG8ocGFyZW50OiBCYXNlVUlDb21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICBwYXJlbnQuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5odG1sRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQgPSB0aGlzLmh0bWxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJyB8fCAhZG9jdW1lbnQuY29udGFpbnMoZWxlbWVudCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCkge1xyXG4gICAgICAgIC8vIHRoaXMuX2NhbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICB0aGlzLl9jYW5IaWRlID0gdHJ1ZTtcclxuICAgICAgICAvLyB9LCAxMDApO1xyXG5cclxuICAgICAgICBcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIC8vIGlmICghdGhpcy5fY2FuSGlkZSkge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc29sZS53YXJuKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gICAgIC8vIHJldHVybjtcclxuICAgICAgICAvLyAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdGVkIHRvIGhpZGUgdGhlIGVsZW1lbnQgYmVmb3JlIDEwMCBtaWxsaXNlY29uZHMgaGF2ZSBwYXNzZWQgc2luY2UgdGhlIGxhc3QgZGlzcGxheS5cIik7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICB9XHJcblxyXG4gICAgbG9ja0hpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5fY2FuSGlkZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja0hpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5fY2FuSGlkZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhbkhpZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkhpZGUgJiYgdGhpcy5pc1Zpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhbkhpZGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9jYW5IaWRlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUNvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQ29sb3IoKSB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiaW5oZXJpdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRvZXNFbGVtZW50T3ZlcmZsb3dTY3JlZW4oKTogYm9vbGVhbiB7XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcGxheSA9IHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFZpc2liaWxpdHkgPSB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxQb3NpdGlvbiA9IHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb247XHJcblxyXG4gICAgICAgIGlmIChvcmlnaW5hbERpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuaHRtbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgc2NyZWVuV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKG9yaWdpbmFsRGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IG9yaWdpbmFsRGlzcGxheTtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gb3JpZ2luYWxWaXNpYmlsaXR5O1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSaWdodEVkZ2UgPSBlbGVtZW50UmVjdC5yaWdodDtcclxuXHJcbiAgICAgICAgaWYgKGVsZW1lbnRSaWdodEVkZ2UgPiBzY3JlZW5XaWR0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbGVtZW50UmVjdC5sZWZ0IDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBlbnN1cmVWaXNpYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlbGV2YW50Q29udGFpbmVyID0gdGhpcy5odG1sRWxlbWVudC5jbG9zZXN0KCdzZWxlY3QsIHVsJyk7XHJcblxyXG4gICAgICAgIGlmIChyZWxldmFudENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnLCBpbmxpbmU6ICdzdGFydCcgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdBdHRlbXB0ZWQgdG8gbWFrZSBhIG5vbi1yZWxldmFudCBpdGVtIHZpc2libGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlkICYmIHRoaXMuaWQgPT0gZGV0YWlscy50YXJnZXRJZCEpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTaG93RWxlbWVudEV2ZW50KGV2ZW50OiBFdmVudCkge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPjtcclxuICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICBpZiAoZGV0YWlscy50YXJnZXRJZCA9PSB0aGlzLmlkKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy9CYXNpYyBVSSBldmVudHNcclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHRoaXMuaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93RWxlbWVudCwgdGhpcy5oYW5kbGVTaG93RWxlbWVudEV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGNsYXNzIERlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IERlcGVuZGVuY3lDb250YWluZXIgPSBuZXcgRGVwZW5kZW5jeUNvbnRhaW5lcigpO1xyXG4gICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXM6IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb24gfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IERlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiBEZXBlbmRlbmN5Q29udGFpbmVyLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWdpc3RlcihrZXk6IHN0cmluZywgY29uc3RydWN0b3I6IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNba2V5XSA9IGNvbnN0cnVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNvbHZlPFQ+KGtleTogc3RyaW5nKTogVCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRlcGVuZGVuY2llc1trZXldKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwZW5kZW5jeSAke2tleX0gbm90IGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXNba2V5XSgpO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIi4vVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBET01VdGlscyB7XHJcblxyXG5cclxuICAgIHN0YXRpYyBpc1NlbGVjdGlvbkluVGFibGVDZWxsKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24/LnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcclxuICAgICAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICAgICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS50YWdOYW1lID09PSAnVEQnIHx8IChub2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUgPT09ICdUSCcpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgIC8vIFRoZSBzZWxlY3Rpb24gc3RhcnRzIGluc2lkZSBhIHRhYmxlIGNlbGxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOyAgLy8gTW92ZSB1cCBpbiB0aGUgRE9NIHRyZWVcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gU2VsZWN0aW9uIGlzIG5vdCBpbnNpZGUgYSB0YWJsZSBjZWxsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50LlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGFwdGVkIGZyb20gYSBTdGFja092ZXJmbG93IGFuc3dlci5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgLSBUaGUgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgdG8gY2hlY2suXHJcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHR3byBib29sZWFuIHByb3BlcnRpZXM6IGBhdFN0YXJ0YCBhbmQgYGF0RW5kYC5cclxuICAgICpcclxuICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzQ1MTQ2OC9jb250ZW50ZWRpdGFibGUtZGl2LWhvdy1jYW4taS1kZXRlcm1pbmUtaWYtdGhlLWN1cnNvci1pcy1hdC10aGUtc3RhcnQtb3ItZW5kLW8jYW5zd2VyLTc0Nzg0MjB8U3RhY2tPdmVyZmxvdyBSZXNwb25zZX1cclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gUmV0dXJucyB7IGF0U3RhcnQ6IHRydWUsIGF0RW5kOiBmYWxzZSB9IGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LCBidXQgbm90IGF0IHRoZSBlbmQuXHJcbiAgICAqIGNvbnN0IHJlc3VsdCA9IGdldFNlbGVjdGlvblRleHRJbmZvKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0YWJsZScpKTtcclxuICAgICovXHJcbiAgICBzdGF0aWMgZ2V0U2VsZWN0aW9uVGV4dEluZm8oZWw6IEhUTUxFbGVtZW50KTogeyBhdFN0YXJ0OiBib29sZWFuOyBhdEVuZDogYm9vbGVhbiB9IHtcclxuXHJcbiAgICAgICAgbGV0IGF0U3RhcnQgPSBmYWxzZSwgYXRFbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ID09IFwiXCIpIHtcclxuICAgICAgICAgICAgYXRTdGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7IGF0U3RhcnQsIGF0RW5kIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzZWxSYW5nZTogUmFuZ2UsIHRlc3RSYW5nZTogUmFuZ2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBzZWxSYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgICAgICB0ZXN0UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZXRFbmQoc2VsUmFuZ2Uuc3RhcnRDb250YWluZXIsIHNlbFJhbmdlLnN0YXJ0T2Zmc2V0KTtcclxuICAgICAgICAgICAgYXRTdGFydCA9IHRlc3RSYW5nZS50b1N0cmluZygpID09PSBcIlwiO1xyXG5cclxuICAgICAgICAgICAgdGVzdFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbCk7XHJcbiAgICAgICAgICAgIHRlc3RSYW5nZS5zZXRTdGFydChzZWxSYW5nZS5lbmRDb250YWluZXIsIHNlbFJhbmdlLmVuZE9mZnNldCk7XHJcbiAgICAgICAgICAgIGF0RW5kID0gdGVzdFJhbmdlLnRvU3RyaW5nKCkgPT09IFwiXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBhdFN0YXJ0LCBhdEVuZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBJbnNlcnRzIGEgbmV3IG5vZGUgaW50byB0aGUgRE9NIGltbWVkaWF0ZWx5IGFmdGVyIGEgc3BlY2lmaWVkIHJlZmVyZW5jZSBub2RlLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGR5bmFtaWNhbGx5IG1vZGlmeWluZyB0aGUgZG9jdW1lbnQgc3RydWN0dXJlIGJ5IGFkZGluZyBuZXcgY29udGVudFxyXG4gICAgKiBvciBjb21wb25lbnRzIGluIHJlbGF0aW9uIHRvIGV4aXN0aW5nIGVsZW1lbnRzLlxyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBUaGUgbmV3IG5vZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxyXG4gICAgKiBAcGFyYW0ge05vZGV9IHJlZmVyZW5jZU5vZGUgLSBUaGUgbm9kZSBhZnRlciB3aGljaCB0aGUgbmV3IG5vZGUgc2hvdWxkIGJlIGluc2VydGVkLlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgcGVyZm9ybXMgYSBET00gbWFuaXB1bGF0aW9uIG9wZXJhdGlvbi5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gU3VwcG9zZSB5b3Ugd2FudCB0byBpbnNlcnQgYSBuZXcgcGFyYWdyYXBoIGFmdGVyIGFuIGV4aXN0aW5nIGRpdiBlbGVtZW50OlxyXG4gICAgKiBjb25zdCBuZXdQYXJhZ3JhcGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAqIG5ld1BhcmFncmFwaC50ZXh0Q29udGVudCA9ICdIZWxsbywgd29ybGQhJztcclxuICAgICogY29uc3QgcmVmZXJlbmNlRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215RGl2Jyk7XHJcbiAgICAqIGluc2VydEFmdGVyKG5ld1BhcmFncmFwaCwgcmVmZXJlbmNlRGl2KTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSByZWZlcmVuY2VOb2RlIGhhcyBhIHBhcmVudCBub2RlLiBJZiBhIHBhcmVudCBub2RlIGV4aXN0cywgaXQgdXNlc1xyXG4gICAgKiBgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKWAgdG8gaW5zZXJ0IHRoZSBuZXdOb2RlIGludG8gdGhlIERPTSByaWdodCBhZnRlciB0aGUgcmVmZXJlbmNlTm9kZS5cclxuICAgICogVGhpcyBpcyBhY2hpZXZlZCBieSBzcGVjaWZ5aW5nIGByZWZlcmVuY2VOb2RlLm5leHRTaWJsaW5nYCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB0byBgaW5zZXJ0QmVmb3JlKClgLFxyXG4gICAgKiB3aGljaCBlZmZlY3RpdmVseSBwbGFjZXMgdGhlIG5ld05vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZmVyZW5jZU5vZGUgaW4gdGhlIGRvY3VtZW50J3Mgc3RydWN0dXJlLlxyXG4gICAgKiBJZiB0aGUgcmVmZXJlbmNlTm9kZSBoYXMgbm8gcGFyZW50LCB0aGUgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCBhcyBpbnNlcnRpb24gaXMgbm90IHBvc3NpYmxlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBpbnNlcnRBZnRlcihuZXdOb2RlOiBOb2RlLCByZWZlcmVuY2VOb2RlOiBOb2RlKSB7XHJcbiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICByZWZlcmVuY2VOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gRE9NIE5vZGUgaGFzIGFueSB2aXNpYmxlIHRleHQgY29udGVudC4gVGhlIGZ1bmN0aW9uIGNvbnNpZGVycyB0ZXh0IGNvbnRlbnQgZGlyZWN0bHkgd2l0aGluIHRoZSBub2RlXHJcbiAgICAqIGFzIHdlbGwgYXMgcmVjdXJzaXZlbHkgY2hlY2tpbmcgYWxsIGNoaWxkIG5vZGVzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBvciBhbnkgcGFydCBvZiBhIHN1YnRyZWVcclxuICAgICogaGFzIHRleHR1YWwgc2lnbmlmaWNhbmNlLCB3aGljaCBtaWdodCBhZmZlY3QgZGlzcGxheSBsb2dpYywgdmFsaWRhdGlvbiwgb3IgcHJvY2Vzc2luZy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBOb2RlIHRvIGNoZWNrIGZvciB0ZXh0IGNvbnRlbnQuXHJcbiAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBub2RlIGl0c2VsZiBvciBhbnkgb2YgaXRzIGNoaWxkcmVuIGhhcyBub24tZW1wdHkgdGV4dCBjb250ZW50LCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFN1cHBvc2UgeW91IHdhbnQgdG8gY2hlY2sgaWYgYSBwYXJhZ3JhcGggZWxlbWVudCBpcyBlbXB0eSBvciBub3Q6XHJcbiAgICAqIGNvbnN0IHBhcmFncmFwaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlUGFyYWdyYXBoJyk7XHJcbiAgICAqIGNvbnN0IGhhc0NvbnRlbnQgPSBoYXNUZXh0Q29udGVudChwYXJhZ3JhcGgpO1xyXG4gICAgKiBjb25zb2xlLmxvZygnRG9lcyB0aGUgcGFyYWdyYXBoIGhhdmUgY29udGVudD8nLCBoYXNDb250ZW50KTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2hlY2tzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUgaXRzZWxmLiBJZiB0aGUgbm9kZSdzIHRleHRDb250ZW50LCB3aGVuIHRyaW1tZWQsIGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcsXHJcbiAgICAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUsIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIHZpc2libGUgdGV4dC4gSWYgdGhlIGluaXRpYWwgY2hlY2sgZmFpbHMsIHRoZSBmdW5jdGlvbiB0aGVuIHJlY3Vyc2l2ZWx5XHJcbiAgICAqIGNoZWNrcyBlYWNoIGNoaWxkIG5vZGUgdG8gZGV0ZXJtaW5lIGlmIGFueSBjaGlsZCBjb250YWlucyB2aXNpYmxlIHRleHQuIFRoaXMgcmVjdXJzaW9uIGVuc3VyZXMgdGhhdCBldmVuIGRlZXBseSBuZXN0ZWQgdGV4dCBub2Rlc1xyXG4gICAgKiB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIHZpc2libGUgY29udGVudCBhcmUgYWNjb3VudGVkIGZvci4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBhdCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgZmluZGluZyB2aXNpYmxlIHRleHQsXHJcbiAgICAqIG9wdGltaXppbmcgdGhlIHNlYXJjaCBwcm9jZXNzIHdpdGhpbiBwb3RlbnRpYWxseSBsYXJnZSBET00gc3RydWN0dXJlcy5cclxuICAgICovXHJcbiAgICBzdGF0aWMgaGFzVGV4dENvbnRlbnQobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBub2RlLnRleHRDb250ZW50Py50cmltKCkgIT09ICcnIHx8XHJcbiAgICAgICAgICAgIChub2RlLmhhc0NoaWxkTm9kZXMoKSAmJiBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2Rlcykuc29tZShjaGlsZE5vZGUgPT4gdGhpcy5oYXNUZXh0Q29udGVudChjaGlsZE5vZGUpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENsb25lcyBhIHNwZWNpZmllZCBIVE1MRWxlbWVudCBhbmQgaW5zZXJ0cyB0aGUgY2xvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaW4gdGhlIERPTS5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGR1cGxpY2F0aW5nIGludGVyYWN0aXZlIGNvbXBvbmVudHMgb3IgY29udGVudCBibG9ja3Mgd2l0aGluIGEgZHluYW1pYyBpbnRlcmZhY2UuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgSFRNTEVsZW1lbnQgdG8gYmUgY2xvbmVkIGFuZCByZWluc2VydGVkLlxyXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgY2xvbmVkIEhUTUxFbGVtZW50IGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgbnVsbCBpZiB0aGUgb3JpZ2luYWwgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWUgeW91IGhhdmUgYSBsaXN0IGl0ZW0gdGhhdCB5b3Ugd2FudCB0byBkdXBsaWNhdGU6XHJcbiAgICAqIGNvbnN0IGxpc3RJdGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGkubXktaXRlbScpO1xyXG4gICAgKiBjb25zdCBuZXdMaXN0SXRlbSA9IGNsb25lQW5kSW5zZXJ0QWZ0ZXIobGlzdEl0ZW0pO1xyXG4gICAgKiBpZiAobmV3TGlzdEl0ZW0pIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdJdGVtIHdhcyBjbG9uZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG4gICAgKiB9XHJcbiAgICAqXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IGF0dGVtcHRzIHRvIGNsb25lIHRoZSBwcm92aWRlZCBgZWxlbWVudGAgdXNpbmcgYGNsb25lTm9kZSh0cnVlKWAsIHdoaWNoIGVuc3VyZXMgdGhhdCBhbGwgY2hpbGQgbm9kZXMgYW5kIGF0dHJpYnV0ZXMgYXJlIGNvcGllZC5cclxuICAgICogVGhlIGZ1bmN0aW9uIHRoZW4gY2hlY2tzIGlmIHRoZSBvcmlnaW5hbCBlbGVtZW50IGhhcyBhIHBhcmVudCBub2RlLiBJZiBpdCBkb2VzIG5vdCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBzaW5jZSBpbnNlcnRpb24gY2Fubm90IHByb2NlZWQuXHJcbiAgICAqIElmIGEgcGFyZW50IG5vZGUgZXhpc3RzLCB0aGUgY2xvbmVkIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgYHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKClgLlxyXG4gICAgKiBUaGlzIGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gZWZmZWN0aXZlbHkgZHVwbGljYXRlIGFuZCBwbGFjZSB0aGUgbmV3IGVsZW1lbnQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gd2l0aGluIHRoZSBET00gdHJlZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgY2xvbmVBbmRJbnNlcnRBZnRlcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgY2xvbmVkRWxlbWVudCA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShjbG9uZWRFbGVtZW50LCBlbGVtZW50Lm5leHRTaWJsaW5nKTtcclxuXHJcbiAgICAgICAgaWYgKGNsb25lZEVsZW1lbnQuaWQpIHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBjbG9uZWRFbGVtZW50LmlkLm1hdGNoKC9eKC4rPyktLyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdO1xyXG4gICAgICAgICAgICAgICAgY2xvbmVkRWxlbWVudC5pZCA9IHByZWZpeCArICctJyArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNsb25lZEVsZW1lbnQuaWQgPSBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9uZWRFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICogU2VhcmNoZXMgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgZWxlbWVudCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIENTUyBjbGFzcy5cclxuICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdXAgZnJvbSB0aGUgYWN0aXZlIGVsZW1lbnQgaW4gdGhlIERPTSB0cmVlIGFuZCBjaGVja3MgZWFjaCBhbmNlc3RvciB0byBzZWUgaWYgaXQgbWF0Y2hlc1xyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBUaGUgY2xhc3MgbmFtZSB0byBtYXRjaCBhZ2FpbnN0IGFuY2VzdG9yIGVsZW1lbnRzLlxyXG4gICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfSBUaGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcywgb3IgbnVsbCBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBTdXBwb3NlIHlvdSB3YW50IHRvIGZpbmQgdGhlIGNsb3Nlc3QgZm9ybSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGlucHV0IGZpZWxkOlxyXG4gICAgKiBjb25zdCBjbG9zZXN0Rm9ybSA9IGZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKCdteS1mb3JtLWNsYXNzJyk7XHJcbiAgICAqIGNvbnNvbGUubG9nKGNsb3Nlc3RGb3JtKTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50IHVzaW5nIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YC5cclxuICAgICogSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGVsZW1lbnQsIG9yIHRoZSBhY3RpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFueSBhbmNlc3RvciB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MsXHJcbiAgICAqIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGwuIE90aGVyd2lzZSwgaXQgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgYW5jZXN0b3JzIG9mIHRoZSBhY3RpdmUgZWxlbWVudCB1bnRpbCBpdCBmaW5kc1xyXG4gICAgKiBhbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBvciByZWFjaGVzIHRoZSByb290IG9mIHRoZSBkb2N1bWVudC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIGNvbXBsZXhcclxuICAgICogZm9ybXMgb3IgaW50ZXJhY3RpdmUgYXJlYXMgd2hlcmUgY29udGV4dC1iYXNlZCBhY3Rpb25zIGRlcGVuZCBvbiBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgRE9NIHN0cnVjdHVyZS5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY3VycmVudEVsZW1lbnQ6IE5vZGUgfCBudWxsID0gYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJlxyXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBhbmNlc3RvciBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIGZyb20gdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uXHJcbiAgICAqIElmIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSB0ZXh0IG5vZGUsIGl0IGNsaW1icyB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCB0aGUgY2xvc2VzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNsYXNzLlxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY29udGV4dC1zZW5zaXRpdmUgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gZG9jdW1lbnQgZWRpdGluZyBvciBwcm9jZXNzaW5nIGVudmlyb25tZW50cy5cclxuICAgICpcclxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIFRoZSBjbGFzcyBuYW1lIHRvIHNlYXJjaCBmb3IgaW4gYW5jZXN0b3IgZWxlbWVudHMuXHJcbiAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9IFRoZSBjbG9zZXN0IGFuY2VzdG9yIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzLCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudCBpcyBmb3VuZC5cclxuICAgICovXHJcbiAgICBzdGF0aWMgZmluZENsb3Nlc3RBbmNlc3Rvck9mU2VsZWN0aW9uQnlDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgc2VsZWN0aW9uIGFuZCBpZiBpdCBoYXMgYXQgbGVhc3Qgb25lIHJhbmdlXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0aW5nIG5vZGUgb2YgdGhlIHNlbGVjdGlvblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudDogTm9kZSB8IG51bGwgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBhIHRleHQgbm9kZSwgc3RhcnQgZnJvbSBpdHMgcGFyZW50IGVsZW1lbnRcclxuICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBET00gdHJlZSB0byBmaW5kIHRoZSBjbG9zZXN0IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzXHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBSZWFycmFuZ2UgY29udGVudCBhcm91bmQgdGhlIHNwbGl0IHBvaW50IGJhc2VkIG9uIHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcHJvY2VzcyBvZiBzcGxpdHRpbmcgdGhlIGNvbnRlbnQgYXQgdGhlIGN1cnNvcixcclxuICAgICogdGhlbiByZWFycmFuZ2luZyB0aGUgY29udGVudCBieSBkZWxldGluZyBhcHByb3ByaWF0ZSBwYXJ0cyBpbiB0aGUgb3JpZ2luYWxcclxuICAgICogYW5kIGNsb25lZCBub2Rlcy4gSXQgZW5zdXJlcyB0aGF0IGFmdGVyIHRoZSBzcGxpdCwgdGhlIG9yaWdpbmFsIG5vZGUgY29udGFpbnNcclxuICAgICogb25seSB0aGUgY29udGVudCBiZWZvcmUgdGhlIGN1cnNvciBhbmQgdGhlIGNsb25lZCBub2RlIGNvbnRhaW5zIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIEltcG9ydGFudGx5LCB0aGlzIGZ1bmN0aW9uIG1haW50YWlucyB0aGUgdmFsaWRpdHkgb2YgdGhlIERPTSBzdHJ1Y3R1cmUgYWZ0ZXIgbW9kaWZpY2F0aW9ucyxcclxuICAgICogcHJldmVudGluZyBhbnkgZGlzcnVwdGlvbnMgaW4gZG9jdW1lbnQgc3RydWN0dXJlIHRoYXQgY291bGQgYWZmZWN0IHJlbmRlcmluZyBvciBmdXJ0aGVyIHNjcmlwdGluZy5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gY3VycmVudE5vZGUgLSBUaGUgbm9kZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBjb250ZW50IGJlZm9yZSB0aGUgc3BsaXQuXHJcbiAgICAqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZSAtIFRoZSBjbG9uZWQgbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgY29udGVudCBhZnRlciB0aGUgc3BsaXQuXHJcbiAgICAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlOyBpdCBtb2RpZmllcyBET00gbm9kZXMgZGlyZWN0bHkuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyBjdXJyZW50Tm9kZSBpcyBhbiBlbGVtZW50IHdpdGggdGV4dCBjb250ZW50IGFuZCBhIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gaXQsXHJcbiAgICAqIC8vIGFuZCBuZXdOb2RlIGlzIGl0cyBjbG9uZWQgY291bnRlcnBhcnQ6XHJcbiAgICAqIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlLCBuZXdOb2RlKTtcclxuICAgICogXHJcbiAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgcGFydCBvZiBhbiBlZGl0aW5nIHN5c3RlbSB3aGVyZSBjb250ZW50IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5XHJcbiAgICAqIHNwbGl0IGFuZCByZWFycmFuZ2VkLiBJdCB1c2VzIGEgY3Vyc29yLWJhc2VkIGFwcHJvYWNoIHRvIGRldGVybWluZSB0aGUgc3BsaXQgcG9pbnQsXHJcbiAgICAqIHJlbW92ZXMgY29udGVudCBmcm9tIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGNsb25lIGJhc2VkIG9uIHRoZSBjdXJzb3IncyBwb3NpdGlvbixcclxuICAgICogYW5kIHNldHMgdXAgdGhlIG5vZGVzIGZvciBzdWJzZXF1ZW50IHVzZXIgaW50ZXJhY3Rpb25zLiBUaGUgRE9NIHJlbWFpbnMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLFxyXG4gICAgKiBlbnN1cmluZyB0aGF0IHN1YnNlcXVlbnQgb3BlcmF0aW9ucywgc3VjaCBhcyBmdXJ0aGVyIHNwbGl0cyBvciBzdHlsZSBjaGFuZ2VzLCBjYW4gYmUgcGVyZm9ybWVkXHJcbiAgICAqIHdpdGhvdXQgYWRkaXRpb25hbCBjaGVja3Mgb3IgY29ycmVjdGlvbnMuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHJlYXJyYW5nZUNvbnRlbnRBZnRlclNwbGl0KGN1cnJlbnROb2RlOiBOb2RlLCBuZXdOb2RlOiBOb2RlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSBET01VdGlscy5nZXRDdXJzb3JQb3NpdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZXMxID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjdXJyZW50Tm9kZSBhcyBOb2RlKTtcclxuXHJcbiAgICAgICAgLy8gY2hhbmdlIHRoZSBvcmlnaW5hbFxyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMVsxXSk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmRlbGV0ZUZyb21Eb2N1bWVudCgpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgdGhlIGNsb25lXHJcbiAgICAgICAgaWYgKG5ld05vZGUgJiYgY3Vyc29yUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDdXJzb3JQb3NpdGlvbihuZXdOb2RlLCBjdXJzb3JQb3NpdGlvbik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZXMyID0gdGhpcy5zcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihuZXdOb2RlIGFzIE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uYWRkUmFuZ2UocmFuZ2VzMlswXSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5kZWxldGVGcm9tRG9jdW1lbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIENhbGN1bGF0ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCBub2RlLiBUaGUgcG9zaXRpb24gaXMgZGV0ZXJtaW5lZFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBub2RlIHRvIHRoZSBjdXJzb3IncyBsb2NhdGlvbiB3aXRoaW4gdGhlIG5vZGUuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgZXNzZW50aWFsIGZvciBzY2VuYXJpb3Mgd2hlcmUgcHJlY2lzZSB0ZXh0IG1hbmlwdWxhdGlvbiBpcyByZXF1aXJlZCwgc3VjaCBhc1xyXG4gICAgKiB0ZXh0IGVkaXRvcnMgb3IgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGNvbnRlbnQgZmllbGRzLlxyXG4gICAgKiBcclxuICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIG5vZGUgd2l0aGluIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLlxyXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gVGhlIHplcm8tYmFzZWQgaW5kZXggcmVwcmVzZW50aW5nIHRoZSBjdXJzb3IncyBwb3NpdGlvbiB3aXRoaW4gdGhlIG5vZGUsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBpbnRlcnNlY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5vZGUgb3IgaWYgdGhlcmUgYXJlIGFueSBpc3N1ZXNcclxuICAgICogcmV0cmlldmluZyB0aGUgc2VsZWN0aW9uLlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBhbmQgdGhlIGN1cnNvciBpcyBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IHBvc2l0aW9uID0gZ2V0Q3Vyc29yUG9zaXRpb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ215LWVkaXRhYmxlLWRpdicpKTtcclxuICAgICogY29uc29sZS5sb2coJ0N1cnNvciBwb3NpdGlvbjonLCBwb3NpdGlvbik7XHJcbiAgICAqIFxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uJ3MgcmFuZ2UgYW5kIGRldGVybWluZXMgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZVxyXG4gICAgKiBnaXZlbiBub2RlLiBJZiBhbiBpbnRlcnNlY3Rpb24gaXMgZm91bmQsIGl0IHVzZXMgYSBUcmVlV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSB0ZXh0IG5vZGVzIHVuZGVyXHJcbiAgICAqIHRoZSBnaXZlbiBub2RlLCBjb3VudGluZyBjaGFyYWN0ZXJzIHVudGlsIGl0IHJlYWNoZXMgdGhlIHN0YXJ0IGNvbnRhaW5lciBvZiB0aGUgcmFuZ2UuXHJcbiAgICAqIFRoaXMgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYW4gYWNjdXJhdGUgY2hhcmFjdGVyIGluZGV4IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIG5lc3RlZCBlbGVtZW50c1xyXG4gICAgKiBvciBtaXhlZCBjb250ZW50ICh0ZXh0IGNvbWJpbmVkIHdpdGggZWxlbWVudHMpLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDdXJzb3JQb3NpdGlvbihub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8ICFub2RlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBub2RlLFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiBub2RlID0+IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVCB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGNoYXJDb3VudCA9IDA7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5maXJzdENoaWxkKCk7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgPT09IHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjaGFyQ291bnQgKz0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hhckNvdW50ICs9IGN1cnJlbnROb2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSB0cmVlV2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2hhckNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gd2l0aGluIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBiYXNlZCBvbiBhIGNoYXJhY3RlciBpbmRleC5cclxuICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHJhbmdlIGFuZCB1c2VzIGEgVHJlZVdhbGtlciB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSB0ZXh0IG5vZGVzXHJcbiAgICAqIHdpdGhpbiB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBleGFjdCBsb2NhdGlvbiB0byBzZXQgdGhlIGN1cnNvci4gVGhlIHBvc2l0aW9uIGlzIHNldFxyXG4gICAgKiBieSBjb3VudGluZyBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gc2V0IHRoZSBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3NpdGlvbiAtIFRoZSB6ZXJvLWJhc2VkIGNoYXJhY3RlciBpbmRleCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwb3NpdGlvbmVkLlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbW9kaWZpZXMgdGhlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50LlxyXG4gICAgKiBcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gQXNzdW1pbmcgdGhlcmUgaXMgYSBwYXJhZ3JhcGggZWxlbWVudCBhbmQgeW91IHdhbnQgdG8gc2V0IHRoZSBjdXJzb3IgYXQgdGhlIDEwdGggY2hhcmFjdGVyOlxyXG4gICAgKiBjb25zdCBwYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXktcGFyYWdyYXBoJyk7XHJcbiAgICAqIHNldEN1cnNvclBvc2l0aW9uKHBhcmFncmFwaCwgMTApO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoZSBmdW5jdGlvbiBjbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMsIGNhbGN1bGF0ZXMgdGhlIGNvcnJlY3QgdGV4dCBub2RlIGFuZCBvZmZzZXQgd2l0aGluIHRoYXQgbm9kZSxcclxuICAgICogYW5kIHRoZW4gc2V0cyBhIG5ldyByYW5nZSBhdCB0aGF0IHBvc2l0aW9uLiBJdCBlbnN1cmVzIHRoYXQgdGhlIGN1cnNvciBpcyBtb3ZlZCBhY2N1cmF0ZWx5LCBldmVuIHdpdGhpblxyXG4gICAgKiBjb21wbGV4IG5lc3RlZCBjb250ZW50IHN0cnVjdHVyZXMuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgdGV4dCBlZGl0aW5nIGFwcGxpY2F0aW9ucyBhbmQgZHluYW1pY1xyXG4gICAgKiBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtcyB3aGVyZSBwcmVjaXNlIGN1cnNvciBjb250cm9sIGlzIHJlcXVpcmVkLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzZXRDdXJzb3JQb3NpdGlvbihlbGVtZW50OiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4gICAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgICAgeyBhY2NlcHROb2RlOiAoKSA9PiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHRyZWVXYWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICBsZXQgY3VycmVudFBvcyA9IDA7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFBvcyArIHRleHRMZW5ndGggPj0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGN1cnJlbnROb2RlLCBwb3NpdGlvbiAtIGN1cnJlbnRQb3MpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50UG9zICs9IHRleHRMZW5ndGg7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHR5cGUgYXR0cmlidXRlIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGVudCBibG9jayBpbiB0aGUgZG9jdW1lbnQuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWQgaW4gY29udGV4dHMgd2hlcmUgZGlmZmVyZW50IGFjdGlvbnMgb3IgYmVoYXZpb3JzIGFyZSBjb25kaXRpb25lZFxyXG4gICAgKiB1cG9uIHRoZSB0eXBlIG9mIGNvbnRlbnQgdGhlIHVzZXIgaXMgaW50ZXJhY3Rpbmcgd2l0aC5cclxuICAgICpcclxuICAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSB2YWx1ZSBvZiB0aGUgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgaWYgaXQgZXhpc3RzIG9uIHRoZSBjb250ZW50IGVsZW1lbnQsXHJcbiAgICAqIG9yIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBkb2VzIG5vdCBleGlzdC5cclxuICAgICpcclxuICAgICogQGV4YW1wbGVcclxuICAgICogLy8gSWYgeW91IG5lZWQgdG8gYXBwbHkgc3BlY2lmaWMgbG9naWMgYmFzZWQgb24gdGhlIHR5cGUgb2YgY29udGVudCBjdXJyZW50bHkgYmVpbmcgZWRpdGVkOlxyXG4gICAgKiBjb25zdCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlRnJvbUFjdGl2ZUVsZW1lbnQoKTtcclxuICAgICogaWYgKGNvbnRlbnRUeXBlID09PSAncCcpIHtcclxuICAgICogICAgIGNvbnNvbGUubG9nKCdFZGl0aW5nIGEgdGV4dCBibG9jaycpO1xyXG4gICAgKiB9IGVsc2UgaWYgKGNvbnRlbnRUeXBlID09PSAnaDEnKSB7XHJcbiAgICAqICAgICBjb25zb2xlLmxvZygnRWRpdGluZyBhbiBoZWFkaW5nJyk7XHJcbiAgICAqIH1cclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gYmVnaW5zIGJ5IGNhbGxpbmcgYGdldEN1cnJlbnRBY3RpdmVCbG9jaygpYCwgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBibG9jayBlbGVtZW50XHJcbiAgICAqIGluIHRoZSBVSS4gSXQgdGhlbiBzZWFyY2hlcyBmb3IgYW4gZWxlbWVudCB3aXRoaW4gdGhpcyBibG9jayB3aXRoIHRoZSBjbGFzcyAnLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcsXHJcbiAgICAqIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGNhcnJ5IGEgJ2RhdGEtY29udGVudC10eXBlJyBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjb250ZW50IChlLmcuLCAndGV4dCcsICdpbWFnZScsIGV0Yy4pLlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gcmV0cmlldmVzIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50LlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBnZXRDb250ZW50VHlwZUZyb21BY3RpdmVFbGVtZW50KCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnRcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFjb250ZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBjb250ZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbnRlbnQtdHlwZVwiKTtcclxuICAgICAgICByZXR1cm4gY29udGVudFR5cGUgfHwgbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU3BsaXRzIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcm9vdCBub2RlIGludG8gdHdvIHJhbmdlcyBiYXNlZCBvbiB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0d28gcmFuZ2VzOiBvbmUgZm9yIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yIGFuZCBvbmUgZm9yIHRoZSBjb250ZW50IGFmdGVyLlxyXG4gICAgKiBUaGUgb3BlcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHByb3ZpZGVkIHJvb3Qgbm9kZSwgZW5zdXJpbmcgdGhhdCB0aGUgZGl2aXNpb24gcmVzcGVjdHNcclxuICAgICogdGhlIHN0cnVjdHVyYWwgaW50ZWdyaXR5IG9mIHRoZSBjb250ZW50IHdpdGhpbiB0aGF0IG5vZGUuXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0ge05vZGV9IHJvb3ROb2RlIC0gVGhlIHJvb3Qgbm9kZSB3aXRoaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgdG8gYmUgc3BsaXQuIFRoaXMgbm9kZSBzZXRzIHRoZSBib3VuZGFyeSBmb3IgdGhlIHNwbGl0IG9wZXJhdGlvbi5cclxuICAgICogQHJldHVybnMge1JhbmdlW119IEFuIGFycmF5IG9mIHR3byBgUmFuZ2VgIG9iamVjdHM6IHRoZSBmaXJzdCBjb250YWluaW5nIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgY3Vyc29yLCBhbmQgdGhlIHNlY29uZCBjb250YWluaW5nIHRoZSBjb250ZW50IGFmdGVyIHRoZSBjdXJzb3IuXHJcbiAgICAqIFxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWUgdGhlcmUgaXMgYSBkaXYgZWxlbWVudCB3aXRoIGNvbnRlbnQgYW5kIGEgY3Vyc29yIHBvc2l0aW9uIHNvbWV3aGVyZSBpbnNpZGUgaXQ6XHJcbiAgICAqIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGVudERpdicpO1xyXG4gICAgKiBjb25zdCByYW5nZXMgPSBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihjb250ZW50RGl2KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYmVmb3JlIGN1cnNvcjonLCByYW5nZXNbMF0uY2xvbmVDb250ZW50cygpLnRleHRDb250ZW50KTtcclxuICAgICogY29uc29sZS5sb2coJ0NvbnRlbnQgYWZ0ZXIgY3Vyc29yOicsIHJhbmdlc1sxXS5jbG9uZUNvbnRlbnRzKCkudGV4dENvbnRlbnQpO1xyXG4gICAgKiBcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbidzIHJhbmdlIGFuZCBjaGVja3MgaWYgaXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCByb290Tm9kZS5cclxuICAgICogSWYgc28sIGl0IGNvbnN0cnVjdHMgdHdvIG5ldyByYW5nZXMgdXNpbmcgdGhlIHJvb3ROb2RlIGFzIHRoZSBjb250ZXh0OlxyXG4gICAgKiAtIFRoZSBmaXJzdCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBzdGFydCBvZiByb290Tm9kZSB1cCB0byB0aGUgY3Vyc29yJ3Mgc3RhcnQuXHJcbiAgICAqIC0gVGhlIHNlY29uZCByYW5nZSBjYXB0dXJlcyBhbGwgY29udGVudCBmcm9tIHRoZSBjdXJzb3IncyBlbmQgdG8gdGhlIGVuZCBvZiByb290Tm9kZSwgb3B0aW9uYWxseSBleHRlbmRpbmcgdG8gdGhlIGxhc3QgY2hpbGQgb2Ygcm9vdE5vZGUgaWYgbmVjZXNzYXJ5LlxyXG4gICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGludm9sdmluZyByaWNoIHRleHQgZWRpdGluZyBvciBhbnkgc2NlbmFyaW8gd2hlcmUgY29udGVudCBuZWVkcyB0byBiZSBzZWdtZW50ZWQgYXJvdW5kIGEgdXNlcidzIHBvaW50IG9mIGZvY3VzLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbihyb290Tm9kZTogTm9kZSk6IFJhbmdlW10ge1xyXG4gICAgICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiByYW5nZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUJlZm9yZS5zZWxlY3ROb2RlQ29udGVudHMocm9vdE5vZGUpO1xyXG4gICAgICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZUFmdGVyID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhyb290Tm9kZSk7XHJcbiAgICAgICAgcmFuZ2VBZnRlci5zZXRTdGFydChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCk7XHJcbiAgICAgICAgaWYgKHJvb3ROb2RlLmxhc3RDaGlsZCkge1xyXG4gICAgICAgICAgICByYW5nZUFmdGVyLnNldEVuZEFmdGVyKHJvb3ROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByYW5nZXMucHVzaChyYW5nZUJlZm9yZSk7XHJcbiAgICAgICAgcmFuZ2VzLnB1c2gocmFuZ2VBZnRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIFBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydCBvZiBhIHNwZWNpZmllZCBlZGl0YWJsZSBIVE1MIGVsZW1lbnQuIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGlmIHRoZSBlbGVtZW50IGlzIFxyXG4gICAgKiBjb250ZW50LWVkaXRhYmxlLCB0aGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIHVzZXIgaW50ZXJmYWNlc1xyXG4gICAgKiB3aGVyZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzIGFyZSBkeW5hbWljYWxseSBlbmFibGVkLCBhbmQgaW1tZWRpYXRlIHVzZXIgaW50ZXJhY3Rpb24gaXMgZXhwZWN0ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVkaXRhYmxlRWxlbWVudCAtIFRoZSBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudCB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIHN0YXJ0LlxyXG4gICAgKiBAcmV0dXJucyB7dm9pZH0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZTsgaXQgZGlyZWN0bHkgbWFuaXB1bGF0ZXMgdGhlIERPTSBhbmQgc2VsZWN0aW9uIHN0YXRlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBBc3N1bWluZyB0aGVyZSBpcyBhIGNvbnRlbnQtZWRpdGFibGUgcGFyYWdyYXBoIGluIHRoZSBkb2N1bWVudDpcclxuICAgICogY29uc3QgZWRpdGFibGVQYXJhZ3JhcGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdGFibGVQYXJhZ3JhcGgnKTtcclxuICAgICogcGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZWRpdGFibGVQYXJhZ3JhcGgpO1xyXG4gICAgKlxyXG4gICAgKiBAZGVzY3JpcHRpb25cclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgaWYgdGhlIGBlZGl0YWJsZUVsZW1lbnRgIGlzIGNvbnRlbnQtZWRpdGFibGUuIElmIGl0IGlzIG5vdCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgY29uc29sZS5cclxuICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZWRpdGFibGUsIGl0OlxyXG4gICAgKiAxLiBTZXRzIGZvY3VzIG9uIHRoZSBlbGVtZW50IHRvIGVuc3VyZSB0aGF0IGl0IGlzIHJlYWR5IGZvciB1c2VyIGlucHV0LlxyXG4gICAgKiAyLiBDcmVhdGVzIGEgbmV3IFJhbmdlIG9iamVjdCwgc2VsZWN0cyBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50LCBhbmQgY29sbGFwc2VzIHRoaXMgcmFuZ2UgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LlxyXG4gICAgKiAzLiBDbGVhcnMgYW55IGV4aXN0aW5nIHNlbGVjdGlvbnMgYW5kIGFwcGxpZXMgdGhlIG5ldyByYW5nZSwgZWZmZWN0aXZlbHkgcG9zaXRpb25pbmcgdGhlIGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAqIFRoaXMgYXBwcm9hY2ggaXMgY3J1Y2lhbCBmb3IgZWRpdGluZyBpbnRlcmZhY2VzLCBlbnN1cmluZyB0aGF0IHVzZXIgaW50ZXJhY3Rpb24gaXMgaW50dWl0aXZlIGFuZCBpbW1lZGlhdGVseSByZXNwb25zaXZlLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChlZGl0YWJsZUVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0YWJsZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVGhlIGVsZW1lbnQgaXMgbm90IGVkaXRhYmxlLlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSBmb2N1cyBhbmQgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQgd2l0aGluIGEgc3BlY2lmaWVkIGNvbnRlbnQtZWRpdGFibGUgSFRNTCBlbGVtZW50LlxyXG4gICAgKiBUaGlzIG1ldGhvZCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gaGFuZGxlIGNvbnRlbnQtZWRpdGFibGUgZWxlbWVudHMgYnkgcG9zaXRpb25pbmcgdGhlIGN1cnNvclxyXG4gICAgKiBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGVsZW1lbnQncyBjb250ZW50LCByZWdhcmRsZXNzIG9mIHRoZSBjb250ZW50J3MgY29tcG9zaXRpb24gKHRleHQsIGVsZW1lbnRzLCBldGMuKS5cclxuICAgICpcclxuICAgICogVGhlIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyBjb250ZW50LWVkaXRhYmxlLiBJZiBpdCBpcywgaXQgdXNlcyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYFxyXG4gICAgKiB0byBlbnN1cmUgdGhhdCBhbGwgRE9NIHVwZGF0ZXMgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHNldHRpbmcgZm9jdXMgYW5kIGFkanVzdGluZyB0aGUgY3Vyc29yIHBvc2l0aW9uLlxyXG4gICAgKiBJdCB0aGVuIGNyZWF0ZXMgYSByYW5nZSBzcGFubmluZyB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudCwgZmluZHMgdGhlIGRlZXBlc3QgbGFzdCBub2RlLCBhbmQgc2V0cyB0aGVcclxuICAgICogY3Vyc29yIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhpcyBub2RlLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHJpY2ggdGV4dCBlZGl0b3JzIG9yIGFueSBhcHBsaWNhdGlvblxyXG4gICAgKiB0aGF0IHJlcXVpcmVzIHByZWNpc2UgY29udHJvbCBvdmVyIGN1cnNvciBwbGFjZW1lbnQgaW4gZWRpdGFibGUgY29udGVudC5cclxuICAgICpcclxuICAgICogSWYgdGhlIGVsZW1lbnQgaXMgbm90IGNvbnRlbnQtZWRpdGFibGUsIGEgd2FybmluZyBpcyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50IGNhbm5vdCBiZSBlZGl0ZWQuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRlbnRCbG9jayAtIFRoZSBjb250ZW50LWVkaXRhYmxlIEhUTUwgZWxlbWVudCB3aGVyZSB0aGUgY3Vyc29yIHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBlbmQuXHJcbiAgICAqL1xyXG4gICAgc3RhdGljIHBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRCbG9jay5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBsYXN0Tm9kZTogTm9kZSB8IG51bGwgPSBjb250ZW50QmxvY2s7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAobGFzdE5vZGUubGFzdENoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBsYXN0Tm9kZS5sYXN0Q2hpbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGxhc3ROb2RlLCBsYXN0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBsYXN0Tm9kZS50ZXh0Q29udGVudCEubGVuZ3RoIDogMCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgZWxlbWVudCBpcyBub3QgZWRpdGFibGUuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk6IEVsZW1lbnQgfCBudWxsIHtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jbG9zZXN0KFwiLmJsb2NrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKHBhcmVudFNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gKGVsZW1lbnQgYXMgRWxlbWVudCkuY2xvc2VzdChwYXJlbnRTZWxlY3RvcikgIT09IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZUZpbHRlclRleHQoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGxhc3RTbGFzaFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgY29udGFpbmVyLnBhcmVudEVsZW1lbnQ/LmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBjb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUgJiYgb2Zmc2V0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRCZWZvcmVDdXJzb3IgPSBub2RlLnRleHRDb250ZW50Py5zdWJzdHJpbmcoMCwgb2Zmc2V0KSB8fCBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaFBvc2l0aW9uID0gdGV4dEJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZihcIi9cIik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hQb3NpdGlvbiAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgbGFzdFNsYXNoUG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlLnBhcmVudE5vZGU/LnRleHRDb250ZW50Py5sYXN0SW5kZXhPZihcIi9cIikgfHwgLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUaGUgY3Vyc29yIGlzIG5vdCB3aXRoaW4gYSBjb250ZW50RWRpdGFibGUgZWxlbWVudCBvciBhIHRleHQgbm9kZS5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJObyBhY3RpdmUgc2VsZWN0aW9uLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBsYXN0U2xhc2hQb3NpdGlvbjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlEYXRhQ29udGVudFR5cGUoZXZlbnQ6IE1vdXNlRXZlbnQsIGRhdGFDb250ZW50VHlwZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBsZXQgY2xpY2tlZEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgY2xpY2tlZEVsZW1lbnQgPSBjbGlja2VkRWxlbWVudC5wYXJlbnRFbGVtZW50ITtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjbGlja2VkRWxlbWVudC5kYXRhc2V0LmNvbnRlbnRUeXBlID09PSBkYXRhQ29udGVudFR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNsaWNrZWRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmRhdGFzZXQuY29udGVudFR5cGUgPT09IGRhdGFDb250ZW50VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudDogTW91c2VFdmVudCwgaWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGNsaWNrZWRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIGNsaWNrZWRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudCE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2xpY2tlZEVsZW1lbnQuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjbGlja2VkRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5pZCA9PT0gaWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQ6IE1vdXNlRXZlbnQsIGNsYXNzS2V5OiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCBjbGlja2VkRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBjbGlja2VkRWxlbWVudCA9IGNsaWNrZWRFbGVtZW50LnBhcmVudEVsZW1lbnQhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0tleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNsaWNrZWRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gY2xpY2tlZEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0tleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHNlbGVjdG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgdGFyZ2V0OiBFbGVtZW50IHwgbnVsbCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRQYXJlbnRUYXJnZXRCeVNlbGVjdG9yKGV2ZW50OiBNb3VzZUV2ZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGxldCB0YXJnZXQ6IEVsZW1lbnQgfCBudWxsID0gKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpID8gZXZlbnQudGFyZ2V0IDogZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgTm9kZSA/IGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50IDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0UGFyZW50RnJvbVNlbGVjdGlvbihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uIHwgbnVsbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIFxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGxldCByYW5nZTogUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICBsZXQgY29tbW9uQW5jZXN0b3JDb250YWluZXI6IE5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgIFxyXG4gICAgICAgIGlmIChjb21tb25BbmNlc3RvckNvbnRhaW5lciBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgY29tbW9uQW5jZXN0b3JDb250YWluZXIubWF0Y2hlcyhzZWxlY3RvcikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGxldCBwYXJlbnRFbGVtZW50OiBFbGVtZW50IHwgbnVsbCA9IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudFxyXG4gICAgICAgICAgICA/IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyXHJcbiAgICAgICAgICAgIDogY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcclxuICAgIFxyXG4gICAgICAgIHdoaWxlIChwYXJlbnRFbGVtZW50ICYmIHBhcmVudEVsZW1lbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlQ2xhc3Nlc1dpdGhQcmVmaXgoZWxlbWVudDogRWxlbWVudCwgcHJlZml4OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBjbGFzc2VzVG9SZW1vdmUgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KS5maWx0ZXIoY2xzID0+IGNscy5zdGFydHNXaXRoKHByZWZpeCkpO1xyXG4gICAgICAgIGNsYXNzZXNUb1JlbW92ZS5mb3JFYWNoKGNscyA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzVGFyZ2V0RGVzY2VuZGFudE9mU2VsZWN0b3IoZXZlbnQ6IEV2ZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFRleHQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0ID0gKGV2ZW50LnRhcmdldCBhcyBUZXh0KS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSB0YXJnZXQuY2xvc2VzdChzZWxlY3Rvcik7XHJcblxyXG4gICAgICAgIHJldHVybiBhbmNlc3RvciAhPT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmllZCBzZWxlY3RvciwgY2hlY2tpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCBpdHMgZGVzY2VuZGFudHMuXHJcbiAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLCBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoLlxyXG4gICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIENTUyBzZWxlY3RvciB0byBtYXRjaCBhZ2FpbnN0LlxyXG4gICAgKiBAcmV0dXJucyBUaGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCBpbmNsdWRpbmcgdGhlIGVsZW1lbnQgaXRzZWxmLCBvciBudWxsIGlmIG5vIG1hdGNoIGlzIGZvdW5kLlxyXG4gICAgKi9cclxuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9ySW5jbHVkaW5nU2VsZihlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGUgZWxlbWVudCBpdHNlbGYgbWF0Y2hlcyB0aGUgc2VsZWN0b3JcclxuICAgICAgICBpZiAoZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSWYgbm90LCB1c2UgdGhlIHN0YW5kYXJkIHF1ZXJ5U2VsZWN0b3IgdG8gZmluZCBhIG1hdGNoaW5nIGRlc2NlbmRhbnRcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzdGF0aWMgc2FuaXRpemVDb250ZW50RWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vICAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICAvLyAgICAgaWYgKGNvbnRlbnQuZW5kc1dpdGgoJzxicj4nKSkge1xyXG4gICAgLy8gICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQuc2xpY2UoMCwgLTQpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBzdGF0aWMgc2FuaXRpemVDb250ZW50RWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2hvdWxkUmVzdG9yZUNhcmV0ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGNhcmV0UG9zID0gMDtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRW5kc0F0Q29udGVudEVuZCA9IHJhbmdlLmVuZE9mZnNldCA9PT0gZWxlbWVudC5pbm5lclRleHQubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlRW5kc0F0Q29udGVudEVuZCAmJiBjb250ZW50LmVuZHNXaXRoKCc8YnI+JykpIHtcclxuICAgICAgICAgICAgICAgIHNob3VsZFJlc3RvcmVDYXJldCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjYXJldFBvcyA9IHJhbmdlLmVuZE9mZnNldDsgLy8gTWFudGVyIGEgcG9zacOnw6NvIG9yaWdpbmFsIGRvIGNhcmV0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZXIgPGJyPiBmaW5hbCwgc2UgZXhpc3RpciwgdXNhbmRvIG1hbmlwdWxhw6fDo28gZG8gRE9NXHJcbiAgICAgICAgaWYgKGNvbnRlbnQuZW5kc1dpdGgoJzxicj4nKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0Q2hpbGQgPSBlbGVtZW50Lmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubm9kZU5hbWUgPT09ICdCUicpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobGFzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3VsZFJlc3RvcmVDYXJldCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IG5ldyBSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZXMgPSB0aGlzLmdldFRleHROb2Rlc0luKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBsZXQgY2hhckNvdW50ID0gMDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGV4dE5vZGUgb2YgdGV4dE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlTGVuZ3RoID0gdGV4dE5vZGUubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYXJDb3VudCArIG5vZGVMZW5ndGggPj0gY2FyZXRQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgY2FyZXRQb3MgLSBjaGFyQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZCh0ZXh0Tm9kZSwgY2FyZXRQb3MgLSBjaGFyQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2hhckNvdW50ICs9IG5vZGVMZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGV4dE5vZGVzSW4obm9kZTogTm9kZSk6IFRleHRbXSB7XHJcbiAgICAgICAgbGV0IHRleHROb2RlczogVGV4dFtdID0gW107XHJcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHRleHROb2Rlcy5wdXNoKG5vZGUgYXMgVGV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRleHROb2RlcyA9IHRleHROb2Rlcy5jb25jYXQodGhpcy5nZXRUZXh0Tm9kZXNJbihjaGlsZHJlbltpXSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0ZXh0Tm9kZXM7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0UHJldmlvdXNDb250ZW50RWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IGFsbENvbnRlbnRFZGl0YWJsZXM6IEhUTUxFbGVtZW50W10gPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBhbGxDb250ZW50RWRpdGFibGVzLmluZGV4T2YoZWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWxsQ29udGVudEVkaXRhYmxlc1tpbmRleCAtIDFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmV4dENvbnRlbnRFZGl0YWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKSkgYXMgSFRNTEVsZW1lbnRbXTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBhbGxDb250ZW50RWRpdGFibGVzLmluZGV4T2YoZWxlbWVudCk7XHJcbiAgICAgICAgaWYgKGluZGV4IDwgYWxsQ29udGVudEVkaXRhYmxlcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhbGxDb250ZW50RWRpdGFibGVzW2luZGV4ICsgMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwYXJlbnQgPSBhY3RpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgd2hpbGUgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIERPTVV0aWxzLmZpbmRDb250ZW50RWRpdGFibGVJbkRlc2NlbmRhbnRzKGFjdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kQ29udGVudEVkaXRhYmxlSW5EZXNjZW5kYW50cyhlbGVtZW50OiBFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgICAgICBpZiAoKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBlbGVtZW50LmNoaWxkcmVuW2ldO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBET01VdGlscy5maW5kQ29udGVudEVkaXRhYmxlSW5EZXNjZW5kYW50cyhjaGlsZCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNhdmVDYXJldFBvc2l0aW9uMmQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIgfSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgY2hhckluZGV4ID0gQXJyYXkuZnJvbShlbGVtZW50LnRleHRDb250ZW50IHx8ICcnKS5zbGljZSgwLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0KS5sZW5ndGg7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGNoYXJJbmRleCwgaG9yaXpvbnRhbFBvczogcmVjdC5sZWZ0IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGNoYXJJbmRleDogMCwgaG9yaXpvbnRhbFBvczogMCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjogeyBjaGFySW5kZXg6IG51bWJlciwgaG9yaXpvbnRhbFBvczogbnVtYmVyIH0pOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGVsZW1lbnQsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcclxuICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICAgICAgbGV0IGJlc3ROb2RlID0gbm9kZTtcclxuICAgICAgICAgICAgbGV0IGJlc3RPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLm5vZGVWYWx1ZSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcclxuICAgICAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVzdFJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC5sZWZ0IC0gcG9zaXRpb24uaG9yaXpvbnRhbFBvcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gaG9yaXpvbnRhbERpc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBjbG9zZSBlbm91Z2gsIGJyZWFrIGVhcmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCA1KSBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoYmVzdE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgc2F2ZUNhcmV0UG9zaXRpb24zZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBjaGFySW5kZXggPSBBcnJheS5mcm9tKGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpLnNsaWNlKDAsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQpLmxlbmd0aDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgY2hhckluZGV4LCBob3Jpem9udGFsUG9zOiByZWN0LmxlZnQsIHZlcnRpY2FsUG9zOiByZWN0LnRvcCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBjaGFySW5kZXg6IDAsIGhvcml6b250YWxQb3M6IDAsIHZlcnRpY2FsUG9zOiAwIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlc3RvcmVDYXJldFBvc2l0aW9uM2QoZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIsIHZlcnRpY2FsUG9zOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZWxlbWVudCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xyXG4gICAgICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE5vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcclxuXHJcbiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUubm9kZVZhbHVlKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKHRlc3RSZWN0LmxlZnQgLSBwb3NpdGlvbi5ob3Jpem9udGFsUG9zKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3RhbmNlID0gTWF0aC5hYnModGVzdFJlY3QudG9wIC0gcG9zaXRpb24udmVydGljYWxQb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsRGlzdGFuY2UgPSBNYXRoLnNxcnQoaG9yaXpvbnRhbERpc3RhbmNlICoqIDIgKyB2ZXJ0aWNhbERpc3RhbmNlICoqIDIpOyAgLy8gVXNlIEV1Y2xpZGVhbiBkaXN0YW5jZVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxEaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSB0b3RhbERpc3RhbmNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyBjbG9zZSBlbm91Z2gsIGJyZWFrIGVhcmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbERpc3RhbmNlIDwgNSkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJlc3ROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChiZXN0Tm9kZSwgYmVzdE9mZnNldCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzdGF0aWMgbWVyZ2VBbmROb3JtYWxpemVJbmxpbmVFbGVtZW50cyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgIC8vICAgICBlbGVtZW50Lm5vcm1hbGl6ZSgpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBtZXJnZUlubGluZUVsZW1lbnRzID0gKG5vZGU6IENoaWxkTm9kZSkgPT4ge1xyXG4gICAgLy8gICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBbJ1NQQU4nLCAnQ09ERScsICdFTScsICdTVFJPTkcnLCAnQicsICdJJ10uaW5jbHVkZXMoY3VycmVudE5vZGUubm9kZU5hbWUpKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgbWVyZ2VJbmxpbmVFbGVtZW50cyhjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbmV4dE5vZGUubm9kZU5hbWUgPT09IGN1cnJlbnROb2RlLm5vZGVOYW1lKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0Tm9kZS5maXJzdENoaWxkKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5hcHBlbmRDaGlsZChuZXh0Tm9kZS5maXJzdENoaWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlVG9SZW1vdmUgPSBuZXh0Tm9kZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgbm9kZVRvUmVtb3ZlLnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKG5vZGVUb1JlbW92ZSk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0U2libGluZztcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH07XHJcblxyXG4gICAgLy8gICAgIG1lcmdlSW5saW5lRWxlbWVudHMoZWxlbWVudCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3RhdGljIG1lcmdlSW5saW5lRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBlbGVtZW50Lm5vcm1hbGl6ZSgpOyAgLy8gTm9ybWFsaXphIG9zIG7Ds3MgZGUgdGV4dG8gcHJpbWVpcm9cclxuXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVMaXN0T2Y8Q2hpbGROb2RlPiA9IGVsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IGNoaWxkcmVuW2ldIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKFsnU1BBTicsICdDT0RFJywgJ0VNJywgJ1NUUk9ORycsICdCJywgJ0knXS5pbmNsdWRlcyhjaGlsZEVsZW1lbnQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxICYmIGNoaWxkRWxlbWVudC5uZXh0U2libGluZyAmJiBjaGlsZEVsZW1lbnQubmV4dFNpYmxpbmcubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkRWxlbWVudC5ub2RlTmFtZSA9PT0gKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkubm9kZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjaGlsZEVsZW1lbnQubmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50LmFwcGVuZENoaWxkKChjaGlsZEVsZW1lbnQubmV4dFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpLmZpcnN0Q2hpbGQhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkRWxlbWVudC5uZXh0U2libGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLm1lcmdlSW5saW5lRWxlbWVudHMoY2hpbGRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cclxuXHJcblxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gJy4vZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnUnO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tICcuL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3InO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cCB9IGZyb20gJy4vYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzJztcclxuaW1wb3J0IHsgWkluZGV4IH0gZnJvbSAnQC9jb21tb24vWkluZGV4JztcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGRyb3Bkb3duczogRHJvcGRvd25NZW51W107XHJcbiAgICBzZXBhcmF0b3JzOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JbXTtcclxuICAgIGN1cnJlbnRTZWxlY3Rpb25SYW5nZTogUmFuZ2UgfCBudWxsO1xyXG4gICAgaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudTogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvcnMgPSBbXTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJmbG9hdGluZy10b29sYmFyXCIsIFwic2VsZWN0LXdyYXBwZXJcIiwgXCJzb2Z0LWJveC1zaGFkb3dcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4LlNsaWdodGx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZWN0V3JhcHBlcik7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnZmxleCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2hvdygpOiB2b2lkIHtcclxuICAgIC8vICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51ID0gRE9NVXRpbHMuZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MoXCIuZm9jdXNhYmxlXCIpO1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2VsZWN0aW9uIGZvdW5kJyk7XHJcbiAgICAvLyAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgLy8gICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgLy8gICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgLy8gICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgLy8gICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgLy8gICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKHRvcFBvc2l0aW9uIDwgMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG5cclxuICAgIC8vICAgICAgICAgc3VwZXIuc2hvdygpO1xyXG5cclxuICAgIC8vICAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmZsb2F0aW5nVG9vbGJhckRpc3BsYXllZCwge1xyXG4gICAgLy8gICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgIC8vICAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcclxuICAgIC8vICAgICAgICAgLy8gfSkpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQWxsRHJvcGRvd25WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmREcm9wZG93bihkcm9wZG93bjogRHJvcGRvd25NZW51KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bnMucHVzaChkcm9wZG93bilcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGRyb3Bkb3duLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRCdXR0b25Hcm91cChidXR0b25Hcm91cDogQnV0dG9uR3JvdXApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRTZXBhcmF0b3Ioc2VwYXJhdG9yOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvcnMucHVzaChzZXBhcmF0b3IpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VwYXJhdG9yLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRUZXh0VG9vbGJhcihidXR0b246IEJ1dHRvbkdyb3VwKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hcHBlbmRDaGlsZChidXR0b24uaHRtbEVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFueURyb3Bkb3duVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRyb3Bkb3duIG9mIHRoaXMuZHJvcGRvd25zKSB7XHJcbiAgICAgICAgICAgIGlmIChkcm9wZG93bi5kcm9wZG93bkxpc3QuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVBbGxEcm9wZG93blZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBkcm9wZG93biBvZiB0aGlzLmRyb3Bkb3ducykge1xyXG4gICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd25MaXN0LmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKSB7XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgZm9jdXMgY2hhbmdlIHdoZW4gY2xpY2tpbmcgb24gdGhpcyBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIFByZXZlbnQgZm9jdXMgY2hhbmdlIHdoZW4gY2xpY2tpbmcgb24gdGhpcyBlbGVtZW50XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWRvd24sIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNob3dJbnB1dExpbmtCb3hSZXF1ZXN0ZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmNhbkhpZGUgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNob3dJbnB1dExpbmtCb3hGaW5pc2hlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuSGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZVJhbmdlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfSBpZiAodGhpcy5jYW5IaWRlICYmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGlvbkVtcHR5KCkpIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmICgoZXZlbnQua2V5ID09PSAnRXNjYXBlJyB8fCBldmVudC5rZXkgPT09ICdEZWxldGUnKSAmJiB0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZUFsbERyb3Bkb3duVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jYW5IaWRlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhdGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgLy8gICAgIH0gXHJcbiAgICAgICAgLy8gICAgIC8vIGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5odG1sRWxlbWVudC5pZH1gKSAmJiAhdGhpcy5pbnB1dExpbmtCb3hXcmFwcGVyLmlzVmlzaWJsZSkge1xyXG4gICAgICAgIC8vICAgICAvLyAgICAgdGhpcy5yZXN0b3JlUmFuZ2VTZWxlY3Rpb24oKTtcclxuICAgICAgICAvLyAgICAgLy8gfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja0RlbGV0ZWQsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmJsb2NrVHlwZUNoYW5nZWQsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTZWxlY3Rpb25FbXB0eSgpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICByZXR1cm4gIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkgPT09ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc3RvcmVSYW5nZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LmFkZFJhbmdlKHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlISk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbmdlQ29sb3Ige1xyXG5cclxuICAgIGNvbG9yOiBDb2xvcnM7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IENvbG9ycykge1xyXG4gICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbiB7XHJcblxyXG4gICAgY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICAgIGludGVudGlvbjogXCJzaG93XCIgfCBcImhpZGVcIjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlOiBzdHJpbmcsIGludGVudGlvbjogXCJzaG93XCIgfCBcImhpZGVcIikge1xyXG4gICAgICAgIHRoaXMuY2xhc3NLZXkgPSBjbGFzc0tleTtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5pbnRlbnRpb24gPSBpbnRlbnRpb247XHJcbiAgICB9XHJcbn0iLCJleHBvcnQgY2xhc3MgUmVzZXRBY3RpdmVCdXR0b25zIHtcclxuXHJcbiAgICBjbGFzc0tleTogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY2xhc3NLZXk6IFwiaGlsaXRlQ29sb3JcIiB8IFwiZm9yZUNvbG9yXCIgfCBcImJhY2tncm91bmRDb2xvclwiKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0tleSA9IGNsYXNzS2V5O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSVVJQWN0aW9uIH0gZnJvbSBcIi4vSVVJQWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2xvc2VFbGVtZW50IGltcGxlbWVudHMgSVVJQWN0aW9uIHtcclxuXHJcbn0iLCJpbXBvcnQgeyBJVUlBY3Rpb24gfSBmcm9tIFwiLi9JVUlBY3Rpb25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTaG93RWxlbWVudCBpbXBsZW1lbnRzIElVSUFjdGlvbiB7XHJcblxyXG59IiwiaW1wb3J0IHsgSVVJQWN0aW9uIH0gZnJvbSBcIi4vSVVJQWN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgaW1wbGVtZW50cyBJVUlBY3Rpb24ge1xyXG5cclxuICAgIGxhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBibG9ja0lkOiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja0lkOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmJsb2NrSWQgPSBibG9ja0lkO1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgVGFibGVTY29wZXMgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL1RhYmxlU2NvcGVzXCI7XHJcbmltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiLi9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IEN1c3RvbUV2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9DdXN0b21FdmVudHNcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiLi9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJVUlFdmVudERldGFpbCB9IGZyb20gXCIuL0lVSUV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIi4vVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IFNob3dIaWRlQWN0aXZlQnV0dG9uIH0gZnJvbSBcIi4vVUlBY3Rpb25zL1Nob3dIaWRlQWN0aXZlQnV0dG9uXCI7XHJcbmltcG9ydCB7IFJlc2V0QWN0aXZlQnV0dG9ucyB9IGZyb20gXCIuL1VJQWN0aW9ucy9SZXNldEFjdGl2ZUJ1dHRvbnNcIjtcclxuaW1wb3J0IHsgQ2xvc2VFbGVtZW50IH0gZnJvbSBcIi4vVUlBY3Rpb25zL0Nsb3NlRWxlbWVudFwiO1xyXG5pbXBvcnQgeyBTaG93RWxlbWVudCB9IGZyb20gXCIuL1VJQWN0aW9ucy9TaG93RWxlbWVudFwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSB9IGZyb20gXCIuL1VJQWN0aW9ucy9DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcblxyXG5cclxuICAgIHN0YXRpYyBlbWl0Q29kZUJsb2NrTGFuZ3VhZ2VDaGFuZ2VkRXZlbnQodGFyZ2V0Q2xhc3M6IHN0cmluZywgYmxvY2tJZDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENsYXNzOiB0YXJnZXRDbGFzcyxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlKGJsb2NrSWQsIGxhbmd1YWdlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0U2hvd0VsZW1lbnRFdmVudCh0YXJnZXRJZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5TaG93RWxlbWVudCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldElkOiB0YXJnZXRJZCxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IFNob3dFbGVtZW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRDbG9zZUVsZW1lbnRFdmVudCh0YXJnZXRJZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElVSUV2ZW50RGV0YWlsPihDdXN0b21VSUV2ZW50cy5DbG9zZUVsZW1lbnQsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGFyZ2V0SWQsXHJcbiAgICAgICAgICAgICAgICBhY3Rpb246IG5ldyBDbG9zZUVsZW1lbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQodGFyZ2V0SWQ6IHN0cmluZywgY29sb3I6IENvbG9ycykge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuQ29sb3JDaGFuZ2VSZXF1ZXN0LCB7XHJcbiAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldElkLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uOiBuZXcgQ2hhbmdlQ29sb3IoY29sb3IpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudCh0YXJnZXRDbGFzczogXCJoaWxpdGVDb2xvclwiIHwgXCJmb3JlQ29sb3JcIiB8IFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlOiBzdHJpbmcsIGludGVuc2lvbjogXCJzaG93XCIgfCBcImhpZGVcIikge1xyXG5cclxuICAgICAgICBpZiAodGFyZ2V0Q2xhc3MgPT0gXCJoaWxpdGVDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5IaWxpdGVDb2xvck5vbmUpIHtcclxuICAgICAgICAgICAgaW50ZW5zaW9uID0gXCJoaWRlXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGFyZ2V0Q2xhc3MgPT0gXCJmb3JlQ29sb3JcIiAmJiB2YWx1ZSA9PSBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCkge1xyXG4gICAgICAgICAgICBpbnRlbnNpb24gPSBcImhpZGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRDbGFzcyA9PSBcImJhY2tncm91bmRDb2xvclwiICYmIHZhbHVlID09IENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JOb25lKSB7XHJcbiAgICAgICAgICAgIGludGVuc2lvbiA9IFwiaGlkZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+KEN1c3RvbVVJRXZlbnRzLlNob3dIaWRlQWN0aXZlQnV0dG9uLCB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENsYXNzOiB0YXJnZXRDbGFzcyxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IFNob3dIaWRlQWN0aXZlQnV0dG9uKHRhcmdldENsYXNzLCB2YWx1ZSwgaW50ZW5zaW9uKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KHRhcmdldENsYXNzOiBcImhpbGl0ZUNvbG9yXCIgfCBcImZvcmVDb2xvclwiIHwgXCJiYWNrZ3JvdW5kQ29sb3JcIikge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD4oQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB7XHJcblxyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIHRhcmdldENsYXNzOiB0YXJnZXRDbGFzcyxcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogbmV3IFJlc2V0QWN0aXZlQnV0dG9ucyh0YXJnZXRDbGFzcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE86IHJld3JpdGUgdGhpcyBkb2NcclxuICAgIC8qKlxyXG4gICAgKiBFbWl0cyBhIGN1c3RvbSBldmVudCB3aXRoIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgc3RhdGVzIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSB0ZXh0IHNlbGVjdGlvbi5cclxuICAgICogVGhpcyBmdW5jdGlvbiBpcyBjcnVjaWFsIGluIGEgdGV4dCBlZGl0aW5nIGVudmlyb25tZW50IHdoZXJlIG11bHRpcGxlIGNvbXBvbmVudHMgbWlnaHQgbmVlZCB0b1xyXG4gICAgKiB1cGRhdGUgdGhlaXIgc3RhdGUgYmFzZWQgb24gY2hhbmdlcyBpbiB0ZXh0IGZvcm1hdHRpbmcuIFRoZSBlbWl0dGVkIGV2ZW50IChgQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkYClcclxuICAgICogY2FycmllcyBmb3JtYXR0aW5nIHN0YXRlIGRhdGEsIHdoaWNoIGNvbXBvbmVudHMgY2FuIHVzZSB0byBzeW5jaHJvbml6ZSB0aGVpciBVSSBlbGVtZW50cyB3aXRoIHRoZVxyXG4gICAgKiBjdXJyZW50IHRleHQgZm9ybWF0dGluZyAoZS5nLiwgdXBkYXRpbmcgYnV0dG9uIHN0YXRlcywgZGlzcGxheWluZyBhY3RpdmUgZm9ybWF0dGluZyBvcHRpb25zKS5cclxuICAgICpcclxuICAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCBjaGVja3MgZm9yIGFuIGFjdGl2ZSBhbmQgbm9uLWVtcHR5IHRleHQgc2VsZWN0aW9uLlxyXG4gICAgKiBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGUgZnVuY3Rpb24gZXhpdHMgZWFybHkgdG8gYXZvaWQgcHJvY2Vzc2luZyB1bm5lY2Vzc2FyeSBldmVudHMsXHJcbiAgICAqIGVzcGVjaWFsbHkgdG8gbWl0aWdhdGUgaXNzdWVzIGluIGJyb3dzZXJzIGxpa2UgRmlyZWZveCB3aGVyZSBgc2VsZWN0aW9uY2hhbmdlYCBtaWdodCBmaXJlIGR1cmluZyB0eXBpbmdcclxuICAgICogd2l0aG91dCBhbiBhY3R1YWwgY2hhbmdlIGluIHNlbGVjdGlvbi5cclxuICAgICpcclxuICAgICogQHByaXZhdGVcclxuICAgICogQHJldHVybnMge3ZvaWR9IE5vIHJldHVybiB2YWx1ZSBhcyB0aGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGVtaXQgZXZlbnRzIGJhc2VkIG9uIHRoZSBmb3JtYXR0aW5nIHN0YXRlLlxyXG4gICAgKlxyXG4gICAgKiBAZXhhbXBsZVxyXG4gICAgKiAvLyBUbyBpbnZva2UgdGhpcyBmdW5jdGlvbiB3aXRoaW4gYSBjbGFzcyB0aGF0IGhhbmRsZXMgdGV4dCBmb3JtYXR0aW5nOlxyXG4gICAgKiB0aGlzLmVtaXRGb3JtYXRDaGFuZ2VFdmVudHMoKTtcclxuICAgICpcclxuICAgICogQGRlc2NyaXB0aW9uXHJcbiAgICAqIEhlcmUncyBob3cgdGhlIGZ1bmN0aW9uIHdvcmtzOlxyXG4gICAgKiAxLiBDaGVja3MgZm9yIGFuIGFjdGl2ZSBhbmQgbm9uLWVtcHR5IHRleHQgc2VsZWN0aW9uLiBJZiBlbXB0eSwgcmV0dXJucyBlYXJseS5cclxuICAgICogMi4gR2F0aGVycyBjdXJyZW50IHN0YXRlIG9mIHRleHQgZm9ybWF0dGluZyBjb21tYW5kcyBzdWNoIGFzICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCBhbmQgJ3N0cmlrZVRocm91Z2gnLFxyXG4gICAgKiAgICBhbmQgZHluYW1pY2FsbHkgY29sbGVjdHMgdGhlIHN0YXRlIG9mIHZhcmlvdXMgaGlnaGxpZ2h0IGNvbG9ycyB1c2luZyBhIHNlcnZpY2UuXHJcbiAgICAqIDMuIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgKGBDdXN0b21FdmVudHMudGV4dEZvcm1hdENoYW5nZWRgKSB3aXRoIHRoZXNlIGZvcm1hdHRpbmcgc3RhdGVzLlxyXG4gICAgKiAgICBDb21wb25lbnRzIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIGxpc3RlbiB0byB0aGlzIGV2ZW50IGFuZCB1cGRhdGUgdGhlaXIgc3RhdGVzIGFjY29yZGluZ2x5LFxyXG4gICAgKiAgICBlbnN1cmluZyB0aGF0IFVJIGNvbnRyb2xzIGxpa2UgdG9vbGJhciBidXR0b25zIHJlZmxlY3QgdGhlIGN1cnJlbnQgZm9ybWF0dGluZyBvZiB0aGUgc2VsZWN0ZWQgdGV4dC5cclxuICAgICovXHJcbiAgICAvLyBzdGF0aWMgZW1pdEZvcm1hdENoYW5nZUV2ZW50ID0gKFxyXG5cclxuICAgIC8vICAgICBib2xkOiBib29sZWFuLFxyXG4gICAgLy8gICAgIGl0YWxpYzogYm9vbGVhbixcclxuICAgIC8vICAgICB1bmRlcmxpbmU6IGJvb2xlYW4sXHJcbiAgICAvLyAgICAgc3RyaWtlVGhyb3VnaDogYm9vbGVhbixcclxuICAgIC8vICAgICBoaWxpdGVDb2xvcjogeyBba2V5OiBzdHJpbmddIDogYm9vbGVhbiB9LCBcclxuICAgIC8vICAgICBmb3JlQ29sb3I6IHsgW2tleTogc3RyaW5nXSA6IGJvb2xlYW59KTogdm9pZCA9PiB7XHJcblxyXG4gICAgLy8gICAgIC8vIFRoaXMgYmxvY2sgY2hlY2tzIGZvciBhbiBhY3RpdmUgc2VsZWN0aW9uIGFuZCB3aGV0aGVyIGl0IGNvbnRhaW5zIGFueSBjb250ZW50LlxyXG4gICAgLy8gICAgIC8vIEluIEZpcmVmb3gsIHRoZSBgc2VsZWN0aW9uY2hhbmdlYCBldmVudCBtYXkgYmUgZmlyZWQgZXZlbiB3aGlsZSB0eXBpbmcsXHJcbiAgICAvLyAgICAgLy8gd2hpY2ggaXMgbm90IHRoZSBpbnRlbmRlZCB0cmlnZ2VyIHNpbmNlIHdlIG9ubHkgd2FudCB0byByZWFjdCB0byBhY3R1YWwgY2hhbmdlcyBpbiBzZWxlY3Rpb24uXHJcbiAgICAvLyAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBvciBudWxsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBlYXJseSwgZWZmZWN0aXZlbHkgaWdub3JpbmdcclxuICAgIC8vICAgICAvLyB0aGVzZSB1bndhbnRlZCBgc2VsZWN0aW9uY2hhbmdlYCBldmVudHMgZHVyaW5nIHR5cGluZy5cclxuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24/LnRvU3RyaW5nKCkudHJpbSgpID09PSAnJykge1xyXG4gICAgLy8gICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb21tYW5kU3RhdGVzOiBJRm9ybWF0Q29tbWFuZCA9IHtcclxuICAgIC8vICAgICAgICAgYm9sZDogYm9sZCxcclxuICAgIC8vICAgICAgICAgaXRhbGljOiBpdGFsaWMsXHJcbiAgICAvLyAgICAgICAgIHVuZGVybGluZTogdW5kZXJsaW5lLFxyXG4gICAgLy8gICAgICAgICBzdHJpa2VUaHJvdWdoOiBzdHJpa2VUaHJvdWdoLFxyXG4gICAgLy8gICAgICAgICBoaWxpdGVDb2xvcjogaGlsaXRlQ29sb3IsXHJcbiAgICAvLyAgICAgICAgIGZvcmVDb2xvcjogZm9yZUNvbG9yLFxyXG4gICAgLy8gICAgICAgICBjZWxsSGlsaXRlQ29sb3I6IHt9XHJcbiAgICAvLyAgICAgfTtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+KEN1c3RvbUV2ZW50cy50ZXh0Rm9ybWF0Q2hhbmdlZCwge1xyXG4gICAgLy8gICAgICAgICBkZXRhaWw6IGNvbW1hbmRTdGF0ZXNcclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgc3RhdGljIGVtaXRDaGFuZ2VUYWJsZUJvcmRlckNvbG9yRXZlbnQoc2NvcGU6IFRhYmxlU2NvcGVzLCBjb2xvcjogQ29sb3JzKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3IsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29sb3IsXHJcbiAgICAgICAgICAgICAgICBzY29wZTogc2NvcGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gc3RhdGljIGVtaXRDZWxsQ2hhbmdlRXZlbnQgPSAoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkID0+IHtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgY2VsbEhpbGl0ZUNvbG9yOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG5cclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yUmVkXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvclJlZCk7XHJcbiAgICAvLyAgICAgY2VsbEhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvckdyZWVuKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZV0gPSBUYWJsZVV0aWxzLmlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsLCBDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKTtcclxuICAgIC8vICAgICBjZWxsSGlsaXRlQ29sb3JbQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93XSA9IFRhYmxlVXRpbHMuaXNDZWxsQmFja2dyb3VuZENvbG9yKGNlbGwsIENvbG9ycy5IaWxpdGVDb2xvclllbGxvdyk7XHJcbiAgICAvLyAgICAgY2VsbEhpbGl0ZUNvbG9yW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gVGFibGVVdGlscy5pc0NlbGxCYWNrZ3JvdW5kQ29sb3IoY2VsbCwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSk7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGNvbW1hbmRTdGF0ZXM6IElGb3JtYXRDb21tYW5kID0ge1xyXG4gICAgLy8gICAgICAgICBib2xkOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgaXRhbGljOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgdW5kZXJsaW5lOiBmYWxzZSxcclxuICAgIC8vICAgICAgICAgc3RyaWtlVGhyb3VnaDogZmFsc2UsXHJcbiAgICAvLyAgICAgICAgIGhpbGl0ZUNvbG9yOiB7fSxcclxuICAgIC8vICAgICAgICAgZm9yZUNvbG9yOiB7fSxcclxuICAgIC8vICAgICAgICAgY2VsbEhpbGl0ZUNvbG9yOiBjZWxsSGlsaXRlQ29sb3JcclxuICAgIC8vICAgICB9O1xyXG5cclxuICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJRm9ybWF0Q29tbWFuZD4oQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCB7XHJcbiAgICAvLyAgICAgICAgIGRldGFpbDogY29tbWFuZFN0YXRlc1xyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgIC8vIH1cclxuXHJcbn0iLCJpbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9GbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgWkluZGV4IH0gZnJvbSBcIkAvY29tbW9uL1pJbmRleFwiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vRGVmYXVsdEpTRXZlbnRzXCI7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xyXG5pbXBvcnQgeyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL0lUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IEJ1dHRvbklEcyB9IGZyb20gXCJAL2NvcmUvQnV0dG9uSURzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciBleHRlbmRzIEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaWQ6IHN0cmluZyA9IFwidGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyO1xyXG4gICAgcHJpdmF0ZSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIGluaXRpYWxSZWN0OiBET01SZWN0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBsb2NrZWRIaWRlID0gZmFsc2U7XHJcbiAgICBkZWJvdW5jZVRpbWVyOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IodGV4dE9wZXJhdGlvbnNTZXJ2aWNlOiBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIGlmIChUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKSB0byBnZXQgaW5zdGFuY2UuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaWQpO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnpJbmRleCA9IFpJbmRleC5WZXJ5SW1wb3J0YW50O1xyXG4gICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gdGV4dE9wZXJhdGlvbnNTZXJ2aWNlO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlPihcIklUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIik7O1xyXG5cclxuICAgICAgICBpZiAoIVRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmluc3RhbmNlID0gbmV3IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyKHRleHRPcGVyYXRpb25zU2VydmljZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMoKSB7XHJcblxyXG4gICAgICAgIC8vVGhpcyBibG9jayBjaGVja3MgZm9yIGFuIGFjdGl2ZSBzZWxlY3Rpb24gYW5kIHdoZXRoZXIgaXQgY29udGFpbnMgYW55IGNvbnRlbnQuXHJcbiAgICAgICAgLy8gSW4gRmlyZWZveCwgdGhlIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50IG1heSBiZSBmaXJlZCBldmVuIHdoaWxlIHR5cGluZyxcclxuICAgICAgICAvLyB3aGljaCBpcyBub3QgdGhlIGludGVuZGVkIHRyaWdnZXIgc2luY2Ugd2Ugb25seSB3YW50IHRvIHJlYWN0IHRvIGFjdHVhbCBjaGFuZ2VzIGluIHNlbGVjdGlvbi5cclxuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IG9yIG51bGwsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGVhcmx5LCBlZmZlY3RpdmVseSBpZ25vcmluZ1xyXG4gICAgICAgIC8vIHRoZXNlIHVud2FudGVkIGBzZWxlY3Rpb25jaGFuZ2VgIGV2ZW50cyBkdXJpbmcgdHlwaW5nLlxyXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCB8fCBzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gY29uc3QgdHh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2codHh0KTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIpO1xyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTGluazogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCdjcmVhdGVMaW5rJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQm9sZDogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzSXRhbGljOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1VuZGVybGluZTogYm9vbGVhbiA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5Q29tbWFuZFN0YXRlKCd1bmRlcmxpbmUnKTtcclxuICAgICAgICAgICAgY29uc3QgaXNJbmxpbmVDb2RlOiBib29sZWFuID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlDb21tYW5kU3RhdGUoXCJpbmxpbmVDb2RlXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1N0cmlrZVRocm91Z2g6IGJvb2xlYW4gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSgnc3RyaWtlVGhyb3VnaCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yUmVkXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKTtcclxuICAgICAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZWVuXSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUhpbGl0ZUNvbG9yKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpO1xyXG4gICAgICAgICAgICBoaWxpdGVDb2xvcnNbQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93XSA9IHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5SGlsaXRlQ29sb3IoQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KTtcclxuICAgICAgICAgICAgaGlsaXRlQ29sb3JzW0NvbG9ycy5IaWxpdGVDb2xvckdyZXldID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlIaWxpdGVDb2xvcihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcmVDb2xvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICAgICAgICAgIGZvcmVDb2xvcnNbQ29sb3JzLkZvcmVDb2xvclJlZF0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yUmVkKTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JlZW5dID0gdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UucXVlcnlGb3JlQ29sb3IoQ29sb3JzLkZvcmVDb2xvckdyZWVuKTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yQmx1ZV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yQmx1ZSk7XHJcbiAgICAgICAgICAgIGZvcmVDb2xvcnNbQ29sb3JzLkZvcmVDb2xvclllbGxvd10gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICAgICAgZm9yZUNvbG9yc1tDb2xvcnMuRm9yZUNvbG9yR3JleV0gPSB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5xdWVyeUZvcmVDb2xvcihDb2xvcnMuRm9yZUNvbG9yR3JleSk7XHJcblxyXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhoaWxpdGVDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCBjb2xvciwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGZvcmVDb2xvcnMpLmZvckVhY2goKFtjb2xvciwgYWN0aXZlXSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJmb3JlQ29sb3JcIiwgY29sb3IsIFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzTGluaywgQnV0dG9uSURzLkxpbmspO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzQm9sZCwgQnV0dG9uSURzLkJvbGQpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KGlzSXRhbGljLCBCdXR0b25JRHMuSXRhbGljKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc0lubGluZUNvZGUsIEJ1dHRvbklEcy5JbmxpbmVDb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChpc1VuZGVybGluZSwgQnV0dG9uSURzLlVuZGVybGluZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoaXNTdHJpa2VUaHJvdWdoLCBCdXR0b25JRHMuU3RyaWtldGhyb3VnaCk7XHJcbiAgICAgICAgfSwgMjApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoYWN0aXZlOiBib29sZWFuLCB0YXJnZXRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQodGFyZ2V0SWQsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KHRhcmdldElkLCBDb2xvcnMuSWNvbkRlZmF1bHRCbGFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvZ1NlbGVjdGlvbkNoYW5nZShldmVudDogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwicGFzc291IG5vIGxvZyBzZWxlY3Rpb25cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGRlYm91bmNlVGltZXI6IGFueTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZXVwLCAoZXZlbnQpID0+IHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIHRoaXMubG9nU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkJibENsaWNrLCB0aGlzLmxvZ1NlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5TZWxlY3Rpb25DaGFuZ2UsIHRoaXMubG9nU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5dXAsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuU2hpZnQpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dIaWRlKGV2ZW50LCBpc1NlbGVjdGluZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2V1cCwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlzU2VsZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGUoZXZlbnQsIGlzU2VsZWN0aW5nKTtcclxuXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyKTtcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0hpZGUoZXZlbnQsIGlzU2VsZWN0aW5nKTtcclxuICAgICAgICAgICAgfSwgMTAwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuU2VsZWN0aW9uQ2hhbmdlLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZShldmVudCwgaXNTZWxlY3RpbmcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAoZXZlbnQua2V5ID09PSBLZXlib2FyZEtleXMuRXNjYXBlKSAmJiAhdGhpcy5sb2NrZWRIaWRlKSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbnlEcm9wZG93blZpc2libGUoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVBbGxEcm9wZG93blZpc2libGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdWxkVXBkYXRlUG9zaXRpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxSZWN0KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25DaGFuZ2VkID0gTWF0aC5hYnMoY3VycmVudFJlY3QubGVmdCAtIHRoaXMuaW5pdGlhbFJlY3QubGVmdCkgPiAxMCB8fCBNYXRoLmFicyhjdXJyZW50UmVjdC50b3AgLSB0aGlzLmluaXRpYWxSZWN0LnRvcCkgPiAxMDtcclxuICAgICAgICByZXR1cm4gcG9zaXRpb25DaGFuZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dIaWRlKGV2ZW50OiBFdmVudCwgaXNTZWxlY3Rpbmc6IGJvb2xlYW4pIHtcclxuXHJcbiAgICAgICAgLy9UaGlzIGJsb2NrIGNoZWNrcyBmb3IgYW4gYWN0aXZlIHNlbGVjdGlvbiBhbmQgd2hldGhlciBpdCBjb250YWlucyBhbnkgY29udGVudC5cclxuICAgICAgICAvLyBJbiBGaXJlZm94LCB0aGUgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnQgbWF5IGJlIGZpcmVkIGV2ZW4gd2hpbGUgdHlwaW5nLFxyXG4gICAgICAgIC8vIHdoaWNoIGlzIG5vdCB0aGUgaW50ZW5kZWQgdHJpZ2dlciBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gcmVhY3QgdG8gYWN0dWFsIGNoYW5nZXMgaW4gc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgb3IgbnVsbCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZWFybHksIGVmZmVjdGl2ZWx5IGlnbm9yaW5nXHJcbiAgICAgICAgLy8gdGhlc2UgdW53YW50ZWQgYHNlbGVjdGlvbmNoYW5nZWAgZXZlbnRzIGR1cmluZyB0eXBpbmcuXHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0NvbnRlbnQgPSB0aGlzLmhhc1NlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxvY2tlZEhpZGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlY3QgPSBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmIChoYXNDb250ZW50ICYmICFpc1NlbGVjdGluZykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWdub3JlRmxvYXRpbmdUb29sYmFyID0gRE9NVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIuaWdub3JlLXRleHQtZmxvYXRpbmctdG9vbGJhclwiKSB8fCBET01VdGlscy5pc1NlbGVjdGVkVGV4dERlc2NlbmRhbnRPZihcIi5naXN0XCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlnbm9yZUZsb2F0aW5nVG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkVXBkYXRlUG9zaXRpb24oKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlnbm9yZUZsb2F0aW5nVG9vbGJhciA9IERPTVV0aWxzLmlzU2VsZWN0ZWRUZXh0RGVzY2VuZGFudE9mKFwiLmdpc3RcIikgfHwgRE9NVXRpbHMuaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YoXCIuZ2lzdFwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChpZ25vcmVGbG9hdGluZ1Rvb2xiYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGhhc1NlbGVjdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0ICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2VsZWN0aW9uIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25SYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBpZiAocmVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHJlY3RzIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpcnN0UmVjdCA9IHJlY3RzWzBdO1xyXG5cclxuICAgICAgICBjb25zdCBjX2ZpcnN0UmVjdExlZnQgPSBmaXJzdFJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBjX2ZpcnN0UmVjdFRvcCA9IGZpcnN0UmVjdC50b3A7XHJcbiAgICAgICAgY29uc3QgY19maXJzdFJlY3RCb3R0b20gPSBmaXJzdFJlY3QuYm90dG9tO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IGNfZmlyc3RSZWN0TGVmdCArIHdpbmRvdy5zY3JvbGxYIC0gNTA7XHJcblxyXG4gICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IGNfZmlyc3RSZWN0VG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgdG9wUG9zaXRpb24gPSBjX2ZpcnN0UmVjdEJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3coKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2VsZWN0aW9uIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcInRpdGxlXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUb1NlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuaGlkZVR1cm5JbnRvRHJvcGRvd25JZkluQ2VsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVUdXJuSW50b0Ryb3Bkb3duSWZJbkNlbGwoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaXNDZWxsID0gRE9NVXRpbHMuaXNTZWxlY3Rpb25JblRhYmxlQ2VsbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGRyb3Bkb3duID0+IHtcclxuICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmlkID09IFwidHVybkludG9NZW51XCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXBhcmF0b3JzLmZvckVhY2goc2VwYXJhdG9yID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvci5pZCA9PSBcInR1cm5JbnRvU2VwYXJhdG9yXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0NlbGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGlzcGxheTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocmVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBvc2l0aW9uKHJlY3Q6IERPTVJlY3QpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCAtIDUwO1xyXG5cclxuICAgICAgICBpZiAobGVmdFBvc2l0aW9uICsgZWxlbWVudFdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcclxuICAgICAgICAgICAgbGVmdFBvc2l0aW9uID0gd2luZG93LmlubmVyV2lkdGggLSBlbGVtZW50V2lkdGggLSAyMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgICAgICBsZXQgdG9wUG9zaXRpb24gPSByZWN0LnRvcCArIHdpbmRvdy5zY3JvbGxZIC0gZWxlbWVudEhlaWdodCAtIDEwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uUmFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvY2tIaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubG9ja2VkSGlkZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdW5sb2NrSGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvY2tlZEhpZGUgPSBmYWxzZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tIFwiLi9JbnB1dExpbmtCb3hXcmFwcGVyXCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dExpbmtCb3ggZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHBhcmVudFdyYXBwZXI/OiBJbnB1dExpbmtCb3hXcmFwcGVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFwibGlua0JveElucHV0XCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudHlwZSA9IFwidXJsXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQucGxhY2Vob2xkZXIgPSBcIlBhc3RlIG9yIHR5cGUgYSBsaW5rLi4uXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGFyZW50V3JhcHBlcihwYXJlbnRXcmFwcGVyOiBJbnB1dExpbmtCb3hXcmFwcGVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRXcmFwcGVyID0gcGFyZW50V3JhcHBlcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi4vVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgSW5wdXRMaW5rQm94IH0gZnJvbSBcIi4vSW5wdXRMaW5rQm94XCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dExpbmtCb3hXcmFwcGVyIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBpbnB1dExpbmtCb3g6IElucHV0TGlua0JveDtcclxuICAgIGhpZ2hsaWdodHM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcclxuICAgIGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcblxyXG4gICAgdGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXI6IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlucHV0TGlua0JveCA9IG5ldyBJbnB1dExpbmtCb3goKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlucHV0TGlua0JveDogaW5wdXRMaW5rQm94LFxyXG4gICAgICAgICAgICBidXR0b246IGJ1dHRvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gXCJsaW5rQm94XCI7XHJcbiAgICAgICAgdGhpcy5pbnB1dExpbmtCb3ggPSBpbnB1dExpbmtCb3g7XHJcbiAgICAgICAgdGhpcy5idXR0b24gPSBidXR0b247XHJcbiAgICAgICAgaW5wdXRMaW5rQm94LnNldFBhcmVudFdyYXBwZXIodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMudGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgPSBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IFwibGlua0JveFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGVwZW5kZW50LWJveFwiLCBcInNvZnQtYm94LXNoYWRvd1wiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBoZWFkZXIuY2xhc3NMaXN0LmFkZChcImhlYWRlclwiKTtcclxuICAgICAgICBoZWFkZXIuaW5uZXJUZXh0ID0gXCJMaW5rXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHNoZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaGVsbC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgc2hlbGwuY2xhc3NMaXN0LmFkZChcImxpbmstYm94LXNoZWxsXCIpXHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XHJcblxyXG4gICAgICAgIHRoaXMucHJvcHMuYnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJibHVlLWJ1dHRvblwiKTtcclxuICAgICAgICB0aGlzLnByb3BzLmJ1dHRvbi5pbm5lckhUTUwgPSBcIkVtYmVkXCI7XHJcblxyXG4gICAgICAgIHNoZWxsLmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYnV0dG9uKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzaGVsbCk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUgJiYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIENoYW5nZSB0aGUgY3Vyc29yIHdoZW4gdGhlIENvbnRyb2wga2V5IGlzIHByZXNzZWQgYW5kIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBhIGxpbmsuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5Db250cm9sKSB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ2N0cmwtYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGNoYW5nZSB0aGUgY3Vyc29yIHdoZW4gdGhlIENvbnRyb2wga2V5IGlzIG5vdCBwcmVzc2VkIGFuZCB0aGUgbW91c2UgaG92ZXJzIG92ZXIgYSBsaW5rLlxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnY3RybC1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2hvd0lucHV0TGlua0JveFJlcXVlc3RlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIC8vICAgICAvLyB0aGlzLmhpZ2hsaWdodFNlbGVjdGVkVGV4dCgpO1xyXG4gICAgICAgIC8vICAgICB0aGlzLmlucHV0TGlua0JveC5mb2N1cygpO1xyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdBJyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBocmVmID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaHJlZicpITtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaHJlZiwgJ19ibGFuaycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSAmJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJyNsaW5rQm94JykgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiI3RleHRGbG9hdGluZ1Rvb2xiYXJcIikpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaW5zZXJ0TGluay5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgc3VwZXIuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaGFuZGxlU2hvd0VsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0SWQgPT0gdGhpcy5pZCAmJiAhdGhpcy5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGV0YWlscy50YXJnZXRJZCA9PSB0aGlzLmlkICYmIHRoaXMuaXNWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5zZXJ0TGluayhldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXJsID0gKHRoaXMuaW5wdXRMaW5rQm94Lmh0bWxFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHVybFdpdGhQcm90b2NvbCA9IHVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykgPyB1cmwgOiBgaHR0cHM6Ly8ke3VybH1gO1xyXG5cclxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gVXRpbHMuaXNWYWxpZFVybCh1cmxXaXRoUHJvdG9jb2wpO1xyXG5cclxuICAgICAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMubGlua1JlYWR5VG9JbnNlcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVybFdpdGhQcm90b2NvbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgaW5wdXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJyZ2IoMjUzLCAyMjIsIDIyMilcIjtcclxuICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNoYWtlLWFuaW1hdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LnJlbW92ZShcInNoYWtlLWFuaW1hdGlvblwiKTtcclxuICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3coKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dExpbmtCb3guaHRtbEVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIndoaXRlXCI7XHJcblxyXG4gICAgICAgIHRoaXMudGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIubG9ja0hpZGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAgICAgaWYgKCFyYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBvc2l0aW9uTGlua0NvbXBvbmVudEJlbG93U2VsZWN0aW9uKHJhbmdlKTtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodFNlbGVjdGVkVGV4dChyYW5nZSk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvc2l0aW9uTGlua0NvbXBvbmVudEJlbG93U2VsZWN0aW9uKHJhbmdlOiBSYW5nZSk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XHJcblxyXG4gICAgICAgIGlmIChyZWN0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gcmVjdHMgZm91bmQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gcmVjdHNbMF07XHJcblxyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0TGVmdCA9IGZpcnN0UmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IGNfZmlyc3RSZWN0VG9wID0gZmlyc3RSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBjX2ZpcnN0UmVjdEJvdHRvbSA9IGZpcnN0UmVjdC5ib3R0b207XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gY19maXJzdFJlY3RMZWZ0ICsgd2luZG93LnNjcm9sbFggLSA1MDtcclxuXHJcbiAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiArIGVsZW1lbnRXaWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gdGhpcy5odG1sRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gY19maXJzdFJlY3RUb3AgKyB3aW5kb3cuc2Nyb2xsWSArIDQwO1xyXG5cclxuICAgICAgICBpZiAodG9wUG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgICAgIHRvcFBvc2l0aW9uID0gY19maXJzdFJlY3RCb3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy50ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci51bmxvY2tIaWRlKCk7XHJcbiAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0cygpO1xyXG4gICAgICAgICh0aGlzLmlucHV0TGlua0JveC5odG1sRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IFwiXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy50ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5jdXJyZW50U2VsZWN0aW9uUmFuZ2U7XHJcblxyXG4gICAgICAgIGlmICghcmFuZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy5hZGRSYW5nZShyYW5nZSk7XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3Qgc2hvd0lucHV0TGlua0JveEZpbmlzaGVkID0gbmV3IEN1c3RvbUV2ZW50KCdzaG93SW5wdXRMaW5rQm94RmluaXNoZWQnLCB7XHJcbiAgICAgICAgLy8gICAgICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICAgIC8vICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxyXG4gICAgICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2hvd0lucHV0TGlua0JveEZpbmlzaGVkKTtcclxuICAgICAgICAvLyB9LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICBoaWdobGlnaHRTZWxlY3RlZFRleHQocmFuZ2U6IFJhbmdlKSB7XHJcbiAgICAgICAgY29uc3QgcmVjdHMgPSByYW5nZS5nZXRDbGllbnRSZWN0cygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlY3QgPSByZWN0c1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS53aWR0aCA9IGAke3JlY3Qud2lkdGh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNjMmMyYzInO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUub3BhY2l0eSA9ICcwLjMnO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodHMucHVzaChoaWdobGlnaHQpO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoMCwgMTIwLCAyMTUsIDAuMyknO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICAgICAgaGlnaGxpZ2h0LnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuXHJcbiAgICAgICAgICAgIGhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFh9cHhgO1xyXG4gICAgICAgICAgICBoaWdobGlnaHQuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgKyB3aW5kb3cuc2Nyb2xsWX1weGA7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIaWdobGlnaHRzKCkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0cy5mb3JFYWNoKGhpZ2hsaWdodCA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaGlnaGxpZ2h0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmhpZ2hsaWdodHMgPSBbXTtcclxuICAgIH1cclxuICAgICAgICBcclxuXHJcbn0iLCJpbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBJRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9JRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiLi4vY29udGVudC9Db250ZW50XCI7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSBcIi4uL3RpdGxlL1RpdGxlXCI7XHJcbmltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiLi4vYWRkLWJsb2NrL0FkZEJsb2NrV3JhcHBlclwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnUgfSBmcm9tIFwiLi4vcXVpY2stbWVudS9RdWlja01lbnVcIjtcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4uL2Zsb2F0aW5nLXRvb2xiYXIvVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgSU1lbWVudG8gfSBmcm9tIFwiQC9jb3JlL0lNZW1lbnRvXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgTWVkaWFJbnB1dHRlciB9IGZyb20gXCIuLi9tZWRpYS1pbnB1dHRlci9NZWRpYUlucHV0dGVyXCI7XHJcbmltcG9ydCB7IElucHV0TGlua0JveFdyYXBwZXIgfSBmcm9tIFwiLi4vZmxvYXRpbmctdG9vbGJhci9saW5rLWJveC9JbnB1dExpbmtCb3hXcmFwcGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZTtcclxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGVkaXRvcklkOiBzdHJpbmcgPSBcImpvaGFubmVzRWRpdG9yXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRWRpdG9yO1xyXG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcclxuXHJcbiAgICBwcml2YXRlIHRpdGxlPzogVGl0bGU7XHJcbiAgICBwcml2YXRlIGNvbnRlbnQ/OiBDb250ZW50O1xyXG4gICAgcHJpdmF0ZSBhZGRCbG9jazogQWRkQmxvY2tXcmFwcGVyO1xyXG4gICAgcHJpdmF0ZSB0ZXh0RmxvYXRpbmdUb29sYmFyOiBUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuICAgIHByaXZhdGUgcXVpY2tNZW51OiBRdWlja01lbnU7XHJcbiAgICBwcml2YXRlIHRhYmxlQ29udGV4dFRvb2xiYXI6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuICAgIHByaXZhdGUgbWVkaWFJbnB1dHRlcjogTWVkaWFJbnB1dHRlcjtcclxuICAgIHByaXZhdGUgaW5wdXRMaW5rQm94V3JhcHBlcjogSW5wdXRMaW5rQm94V3JhcHBlcjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICBtZW1lbnRvOiBJTWVtZW50byxcclxuICAgICAgICB0aXRsZTogVGl0bGUsXHJcbiAgICAgICAgY29udGVudDogQ29udGVudCxcclxuICAgICAgICBhZGRCbG9jazogQWRkQmxvY2tXcmFwcGVyLFxyXG4gICAgICAgIGZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgcXVpY2tNZW51OiBRdWlja01lbnUsXHJcbiAgICAgICAgdGFibGVUb29sYmFyOiBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgbWVkaWFJbnB1dHRlcjogTWVkaWFJbnB1dHRlcixcclxuICAgICAgICBpbnB1dExpbmtCb3hXcmFwcGVyOiBJbnB1dExpbmtCb3hXcmFwcGVyXHJcbiAgICApIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IGVsZW1lbnRGYWN0b3J5U2VydmljZSxcclxuICAgICAgICAgICAgYmxvY2tPcGVyYXRpb25zU2VydmljZTogYmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxyXG4gICAgICAgICAgICBhZGRCbG9jazogYWRkQmxvY2ssXHJcbiAgICAgICAgICAgIGZsb2F0aW5nVG9vbGJhcjogZmxvYXRpbmdUb29sYmFyLFxyXG4gICAgICAgICAgICBxdWlja01lbnU6IHF1aWNrTWVudSxcclxuICAgICAgICAgICAgdGFibGVUb29sYmFyOiB0YWJsZVRvb2xiYXIsXHJcbiAgICAgICAgICAgIG1lZGlhSW5wdXR0ZXI6IG1lZGlhSW5wdXR0ZXIsXHJcbiAgICAgICAgICAgIGlucHV0TGlua0JveFdyYXBwZXI6IGlucHV0TGlua0JveFdyYXBwZXJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKEVkaXRvci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0TGlua0JveFdyYXBwZXIgPSBpbnB1dExpbmtCb3hXcmFwcGVyO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87XHJcbiAgICAgICAgdGhpcy5hZGRCbG9jayA9IGFkZEJsb2NrO1xyXG4gICAgICAgIHRoaXMudGV4dEZsb2F0aW5nVG9vbGJhciA9IGZsb2F0aW5nVG9vbGJhcjtcclxuICAgICAgICB0aGlzLnF1aWNrTWVudSA9IHF1aWNrTWVudTtcclxuICAgICAgICB0aGlzLnRhYmxlQ29udGV4dFRvb2xiYXIgPSB0YWJsZVRvb2xiYXI7XHJcbiAgICAgICAgdGhpcy5tZWRpYUlucHV0dGVyID0gbWVkaWFJbnB1dHRlcjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuXHJcbiAgICAgICAgRWRpdG9yLmluc3RhbmNlID0gdGhpcztcclxuXHJcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEVkaXRvci5lZGl0b3JJZCkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImpvaGFubmVzLWVkaXRvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJjb250ZW50LXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5lbmFibGVUaXRsZSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMucHJvcHMudGl0bGUuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ29udGVudCBpcyByZXF1aXJlZFxyXG4gICAgICAgIGNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMucHJvcHMuY29udGVudC5odG1sRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnRXcmFwcGVyKTtcclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZUFkZEJsb2NrIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5hZGRCbG9jay5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2luZG93LmVkaXRvckNvbmZpZz8uZW5hYmxlRmxvYXRpbmdUb29sYmFyIHx8IHRydWUpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5mbG9hdGluZ1Rvb2xiYXIuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHdpbmRvdy5lZGl0b3JDb25maWc/LmVuYWJsZVF1aWNrTWVudSB8fCB0cnVlKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMucXVpY2tNZW51Lmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy50YWJsZVRvb2xiYXIuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMubWVkaWFJbnB1dHRlci5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pbnB1dExpbmtCb3hXcmFwcGVyLmh0bWxFbGVtZW50KVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKFxyXG4gICAgICAgIHRpdGxlOiBUaXRsZSxcclxuICAgICAgICBjb250ZW50OiBDb250ZW50LFxyXG4gICAgICAgIGFkZEJsb2NrOiBBZGRCbG9ja1dyYXBwZXIsXHJcbiAgICAgICAgdGV4dEZsb2F0aW5nVG9vbGJhcjogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIsXHJcbiAgICAgICAgcXVpY2tNZW51OiBRdWlja01lbnUsXHJcbiAgICAgICAgdGFibGVGbG9hdGluZ1Rvb2xiYXI6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcixcclxuICAgICAgICBtZWRpYUlucHV0dGVyOiBNZWRpYUlucHV0dGVyKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRGYWN0b3J5U2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRWxlbWVudEZhY3RvcnlTZXJ2aWNlPihcIklFbGVtZW50RmFjdG9yeVNlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xyXG4gICAgICAgIGNvbnN0IGlucHV0TGlua0JveFdyYXBwZXIgPSBuZXcgSW5wdXRMaW5rQm94V3JhcHBlcigpO1xyXG5cclxuICAgICAgICBpZiAoIUVkaXRvci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICBFZGl0b3IuaW5zdGFuY2UgPSBuZXcgRWRpdG9yKGVsZW1lbnRGYWN0b3J5U2VydmljZSwgYmxvY2tPcGVyYXRpb25zU2VydmljZSwgbWVtZW50bywgdGl0bGUsIGNvbnRlbnQsIGFkZEJsb2NrLCB0ZXh0RmxvYXRpbmdUb29sYmFyLCBxdWlja01lbnUsIHRhYmxlRmxvYXRpbmdUb29sYmFyLCBtZWRpYUlucHV0dGVyLCBpbnB1dExpbmtCb3hXcmFwcGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBFZGl0b3IuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCkge1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChFZGl0b3IuZWRpdG9ySWQpO1xyXG5cclxuICAgICAgICBjb250YWluZXI/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIChldmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gdGFyZ2V0IGFzIE5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0VsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kRHJhZ0hhbmRsZXIoYmxvY2tFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYW4gSFRNTEVsZW1lbnQgYW5kIGNhbm5vdCBoYW5kbGUgSFRNTEVsZW1lbnQgc3BlY2lmaWMgbWV0aG9kczonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50IHRhcmdldCBpcyBub3QgYSBOb2RlOicsIHRhcmdldCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9Gb2N1cyBvbiB0aGUgZmlyc3QgcGFyYWdyYXBoXHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RQYXJhZ3JhcGggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2pvaGFubmVzRWRpdG9yID4gLmNvbnRlbnQgLmJsb2NrIHBcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQYXJhZ3JhcGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFncmFwaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgPiAuY29udGVudCAuYmxvY2sgcFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGZpcnN0UGFyYWdyYXBoKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdFBhcmFncmFwaC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGZ1bmN0aW9uIChldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgPT09ICd0cnVlJykge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAgICAgICAgICAgICAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBFZGl0b3IuaW5zZXJ0VGV4dEF0Q3Vyc29yKHRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaERyYWdIYW5kbGVyKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0QXRDdXJzb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVyKHRleHROb2RlKTtcclxuICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kRHJhZ0hhbmRsZXIoZWxlbWVudDogTm9kZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQcm92aWRlZCBlbGVtZW50IGlzIG5vdCBhbiBIVE1MRWxlbWVudDonLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBsZXQgZHJhZ0hhbmRsZXIgPSBwYXJlbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuZHJhZy1oYW5kbGVyXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWRyYWdIYW5kbGVyICYmIHBhcmVudCkge1xyXG4gICAgICAgICAgICBkcmFnSGFuZGxlciA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5EUkFHX0hBTkRMRV9CVVRUT04pO1xyXG4gICAgICAgICAgICBwYXJlbnQucHJlcGVuZChkcmFnSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZURyYWdIYW5kbGVyKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgZWxlbWVudCBpcyBub3QgYW4gSFRNTEVsZW1lbnQ6JywgZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkcmFnSGFuZGxlciA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLmRyYWctaGFuZGxlclwiKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZXI/LnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHRyYWN0Q29udGVudCgpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQgRXhjZXB0aW9uXCIpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgYXR0YWNoRHJhZ0hhbmRsZXIoKSB7XHJcbiAgICAgICAgbGV0IGRyYWdnZWRJdGVtOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBsZXQgZHJvcExpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBkcm9wTGluZS5jbGFzc0xpc3QuYWRkKCdkcm9wLWxpbmUnKTtcclxuICAgICAgICBkcm9wTGluZS5zdHlsZS5oZWlnaHQgPSAnMnB4JztcclxuICAgICAgICBkcm9wTGluZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xhc3NMaXN0Py5jb250YWlucygnZHJhZy1oYW5kbGVyJykpIHtcclxuICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KT8uY2xvc2VzdCgnLmJsb2NrJyk7XHJcbiAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkSXRlbS5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRyYWdnZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0uc3R5bGUub3BhY2l0eSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGRyYWdnZWRJdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZHJvcExpbmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH0sIDApO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0KCcuYmxvY2snKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBkcmFnZ2VkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJvdW5kaW5nID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IGJvdW5kaW5nLnkgKyBib3VuZGluZy5oZWlnaHQgLyAyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoZXZlbnQgYXMgTW91c2VFdmVudCkuY2xpZW50WSA+IG9mZnNldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nICE9PSBkcm9wTGluZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIGRyb3BMaW5lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZyAhPT0gZHJvcExpbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBkcm9wTGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBkcm9wTGluZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbSAmJiBkcm9wTGluZSAmJiBkcm9wTGluZS5wYXJlbnRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wTGluZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShkcmFnZ2VkSXRlbSwgZHJvcExpbmUpO1xyXG4gICAgICAgICAgICAgICAgZHJvcExpbmUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9JQmxvY2tPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja0J1dHRvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSwgaWNvbjogU1ZHSWNvbikge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb246IGljb25cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlID0gYmxvY2tPcGVyYXRpb25zU2VydmljZTtcclxuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC50aXRsZSA9IFwiQWRkIGEgbmV3IGJsb2NrXCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJhZGQtYmxvY2tcIiwgXCJibG9jay1vcGVyYXRpb25cIiwgXCJwb2ludGVyXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmljb24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL1RPRE86IFVzZSBjb21tYW5kIGRpc3BhdGNoZXJcclxuICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKENvbW1hbmRzLmNyZWF0ZURlZmF1bHRCbG9jaywgZmFsc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbjogU1ZHSWNvbik6IEFkZEJsb2NrQnV0dG9uIHtcclxuXHJcbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25zU2VydmljZSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJQmxvY2tPcGVyYXRpb25zU2VydmljZT4oXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja0J1dHRvbihibG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBpY29uKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEFkZEJsb2NrQnV0dG9uIH0gZnJvbSBcIi4vQWRkQmxvY2tCdXR0b25cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBZGRCbG9ja1dyYXBwZXIgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnV0dG9uOiBBZGRCbG9ja0J1dHRvbjtcclxuXHJcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGJ1dHRvbjogQWRkQmxvY2tCdXR0b24pIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBidXR0b246IGJ1dHRvblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYWRkLWJsb2NrLXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucHJvcHMuYnV0dG9uLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoYnV0dG9uOiBBZGRCbG9ja0J1dHRvbik6IEFkZEJsb2NrV3JhcHBlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRCbG9ja1dyYXBwZXIoYnV0dG9uKTtcclxuICAgIH1cclxufSIsImV4cG9ydCBjbGFzcyBTaXplcyB7XHJcbiAgICBcclxuICAgIHN0YXRpYyBtZWRpdW06IHN0cmluZyA9IFwiMXJlbVwiO1xyXG4gICAgc3RhdGljIGxhcmdlOiBzdHJpbmcgPSBcIjEuMjVyZW1cIjtcclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNWR0ljb24gZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHVzZUVsZW1lbnQ6IFNWR1VzZUVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGljb25JZDogaWNvbklkLFxyXG4gICAgICAgICAgICBzaXplOiBzaXplXHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd1c2UnKSBhcyBTVkdVc2VFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xyXG5cclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjg1KVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWQgIWltcG9ydGFudFwiO1xyXG5cclxuICAgICAgICBsZXQgdXNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJ1c2VcIik7XHJcbiAgICAgICAgdXNlLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3RoaXMucHJvcHMuaWNvbklkfWApO1xyXG5cclxuICAgICAgICB1c2Uuc3R5bGUuY29sb3IgPSBcInJlZCAhaW1wb3J0YW50XCI7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHVzZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMucHJvcHMuc2l6ZSk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLnByb3BzLnNpemUpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdjdXJyZW50Q29sb3InKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2xvbmUoKTogU1ZHSWNvbiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTVkdJY29uKHRoaXMucHJvcHMuaWNvbklkLCB0aGlzLnByb3BzLnNpemVzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VUbyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51c2VFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCBcImhyZWZcIiwgYCMke3ZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUoaWNvbklkOiBzdHJpbmcsIHNpemU6IHN0cmluZyk6IFNWR0ljb24ge1xyXG4gICAgICAgIHJldHVybiBuZXcgU1ZHSWNvbihpY29uSWQsIHNpemUpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQWRkQmxvY2tCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja0J1dHRvblwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja1dyYXBwZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2FkZC1ibG9jay9BZGRCbG9ja1dyYXBwZXJcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuXHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQWRkQmxvY2tCdWlsZGVyIHtcclxuXHJcbiAgICBcclxuICAgIHN0YXRpYyBidWlsZCgpOiBBZGRCbG9ja1dyYXBwZXIge1xyXG4gICAgICAgIHJldHVybiBBZGRCbG9ja1dyYXBwZXIuY3JlYXRlKEFkZEJsb2NrQnV0dG9uLmNyZWF0ZShTVkdJY29uLmNyZWF0ZShJY29ucy5QbHVzLCBTaXplcy5tZWRpdW0pKSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnUgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcbiAgICBkcm9wZG93bkJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uO1xyXG4gICAgZHJvcGRvd25MaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uLCBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3QpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkJ1dHRvbiA9IGJ1dHRvbjtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdCA9IGRyb3Bkb3duTGlzdDtcclxuXHJcblxyXG4gICAgICAgIGJ1dHRvbi5hcHBlbmRUbyh0aGlzKTtcclxuICAgICAgICBkcm9wZG93bkxpc3QuYXBwZW5kVG8odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWQ7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInNlbGVjdC13cmFwcGVyXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGUocHJlZml4SWQ6IHN0cmluZywgYnV0dG9uOiBEcm9wZG93bk1lbnVCdXR0b24sIGxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnUge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyb3Bkb3duTWVudShwcmVmaXhJZCArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgYnV0dG9uLCBsaXN0KTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi9KTm9kZVwiO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+IHtcclxuXHJcbiAgICBoZWFkOiBKTm9kZTxUPiB8IG51bGwgPSBudWxsO1xyXG4gICAgdGFpbDogSk5vZGU8VD4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBsZW5ndGg6IG51bWJlciA9IDA7XHJcblxyXG4gICAgYWJzdHJhY3QgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkO1xyXG5cclxuICAgIGdldEZpcnN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXN0KCk6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGFpbDtcclxuICAgIH1cclxuXHJcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm47XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICB5aWVsZCBjdXJyZW50O1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yRWFjaChjYWxsYmFjazogKG5vZGU6IFQsIGluZGV4OiBudW1iZXIsIGxpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sobm9kZS52YWx1ZSwgaW5kZXgsIHRoaXMpO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhbnkocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5oZWFkO1xyXG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHROb2RlO1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gdGhpcy5oZWFkKSBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRGaXJzdChwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGVhZCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50OiBudWxsIHwgSk5vZGU8VD4gPSB0aGlzLmhlYWQ7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0Tm9kZTtcclxuICAgICAgICB9IHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IHRoaXMuaGVhZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRMYXN0KHByZWRpY2F0ZTogKG5vZGU6IFQpID0+IGJvb2xlYW4pOiBKTm9kZTxUPiB8IG51bGwge1xyXG4gICAgICAgIGlmICghdGhpcy50YWlsKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnQ6IG51bGwgfCBKTm9kZTxUPiA9IHRoaXMudGFpbDtcclxuXHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKGN1cnJlbnQudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wcmV2aW91c05vZGU7XHJcbiAgICAgICAgfSB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSB0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kKGVsZW1lbnQ6IFQpOiBKTm9kZTxUPiB8IG51bGwge1xyXG5cclxuICAgICAgICBsZXQgY3VycmVudDogSk5vZGU8VD4gfCBudWxsID0gdGhpcy5oZWFkO1xyXG5cclxuICAgICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudC52YWx1ZSA9PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0aGlzLmhlYWQpIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCYXNlRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuL0Jhc2VEb3VibHlMaW5rZWRMaXN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgSk5vZGU8VD4ge1xyXG5cclxuICAgIHBhcmVudExpc3Q6IEJhc2VEb3VibHlMaW5rZWRMaXN0PFQ+O1xyXG5cclxuICAgIHByZXZpb3VzTm9kZTogSk5vZGU8VD4gfCBudWxsO1xyXG4gICAgbmV4dE5vZGU6IEpOb2RlPFQ+IHwgbnVsbDtcclxuICAgIHZhbHVlOiBUO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBwYXJlbnRMaXN0OiBCYXNlRG91Ymx5TGlua2VkTGlzdDxUPikge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5leHROb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRMaXN0ID0gcGFyZW50TGlzdDtcclxuICAgIH1cclxuXHJcbiAgICBzZXROZXh0KG5vZGU6IEpOb2RlPFQ+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5uZXh0Tm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJldmlvdXMobm9kZTogSk5vZGU8VD4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByZXZpb3VzTm9kZSA9IG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmV4dFNhdGlzZnlpbmcocHJlZGljYXRlOiAobm9kZTogVCkgPT4gYm9vbGVhbik6IEpOb2RlPFQ+IHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLm5leHROb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShjdXJyZW50LnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dE5vZGU7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBzdGFydE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2F0aXNmeWluZyhwcmVkaWNhdGU6IChub2RlOiBUKSA9PiBib29sZWFuKTogSk5vZGU8VD4gfCBudWxsIHtcclxuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMucHJldmlvdXNOb2RlO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHRoaXM7XHJcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gc3RhcnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoY3VycmVudC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnByZXZpb3VzTm9kZTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tIFwiLi9CYXNlRG91Ymx5TGlua2VkTGlzdFwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCIuL0pOb2RlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5oZWFkID0gbm9kZTtcclxuICAgICAgICAgICAgdGhpcy50YWlsID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXROZXh0KHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyh0aGlzLnRhaWwpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0TmV4dCh0aGlzLmhlYWQpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy50YWlsLnNldE5leHQobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZC5zZXRQcmV2aW91cyhub2RlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudGFpbCA9IG5vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxlbmd0aCsrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgU2hvd0hpZGVBY3RpdmVCdXR0b24gfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvU2hvd0hpZGVBY3RpdmVCdXR0b25cIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UgfSBmcm9tIFwiQC9jb21tYW5kcy9VSUFjdGlvbnMvQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3RJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSURyb3Bkb3duTWVudUl0ZW0ge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSWNvbj86IFNWR0ljb247XHJcbiAgICBwcml2YXRlIGxlZnRJY29uPzogU1ZHRWxlbWVudCB8IEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzRnVuY3Rpb25MaXN0OiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBvbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdDogKCgpID0+IHZvaWQpW10gPSBbXTtcclxuXHJcbiAgICBwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdCxcclxuICAgICAgICBjb21tYW5kOiBzdHJpbmcsXHJcbiAgICAgICAgdmFsdWU6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgbGVmdEljb246IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCB8IG51bGwsXHJcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcclxuICAgICAgICBzaG9ydGN1dDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gW1wibGlzdC1pdGVtXCIsIFwib3B0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIsIFwiYmxvY2stb3BlcmF0aW9uXCIsIFwibm8tbGlzdC1zdHlsZVwiLCBcIm5vLXNlbGVjdGlvblwiXTtcclxuXHJcbiAgICAgICAgY29uc3QgaWNvbiA9IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1zbWFsbC1jaGVja1wiLCBTaXplcy5tZWRpdW0pO1xyXG4gICAgICAgIGljb24uaHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiBsZWZ0SWNvbikge1xyXG4gICAgICAgICAgICBsZWZ0SWNvbi5zdHlsZS5jb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIGNsYXNzTGlzdDogY2xhc3NMaXN0LFxyXG4gICAgICAgICAgICBsZWZ0SWNvbjogbGVmdEljb24sXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgaWNvbjogaWNvbixcclxuICAgICAgICAgICAgc2hvcnRjdXQ6IHNob3J0Y3V0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcclxuICAgICAgICB0aGlzLmNsYXNzTGlzdCA9IGNsYXNzTGlzdDtcclxuICAgICAgICB0aGlzLmxlZnRJY29uID0gbGVmdEljb247XHJcbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJY29uID0gaWNvbjtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaChmdW5jKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBhZGRDbGFzcyhjbGFzc0tleTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QucHVzaChjbGFzc0tleSk7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzS2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkZvY3VzPFQgZXh0ZW5kcyBhbnlbXT4oZnVuYzogKC4uLmFyZ3M6IFQpID0+IHZvaWQsIC4uLmFyZ3M6IFQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uRm9jdXNGdW5jdGlvbkxpc3QucHVzaCgoKSA9PiBmdW5jKC4uLmFyZ3MpKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hPbkxvc2VGb2N1czxUIGV4dGVuZHMgYW55W10+KGZ1bmM6ICguLi5hcmdzOiBUKSA9PiB2b2lkLCAuLi5hcmdzOiBUKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdC5wdXNoKCgpID0+IGZ1bmMoLi4uYXJncykpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBmb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1mb2N1c2VkJyk7XHJcbiAgICAgICAgdGhpcy5vbkZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLm9uTG9zZUZvY3VzRnVuY3Rpb25MaXN0LmZvckVhY2goZnVuYyA9PiBmdW5jKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMucHJvcHMuY2xhc3NMaXN0IGFzIHN0cmluZ1tdO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJwb2ludGVyXCIsIC4uLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQudGFiSW5kZXggPSAyO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5jb2xvciA9IFwiIzM3MzUyRlwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGV4dE9wdGlvbi5jbGFzc0xpc3QuYWRkKCd0ZXh0LW9wdGlvbicpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5sZWZ0SWNvbikge1xyXG4gICAgICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHRoaXMucHJvcHMubGVmdEljb24pO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc3Bhbi5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG5cclxuICAgICAgICB0ZXh0T3B0aW9uLmFwcGVuZENoaWxkKHNwYW4pO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0T3B0aW9uKTtcclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLmljb24uaHRtbEVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG9ydGN1dCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG9ydEN1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5pbm5lclRleHQgPSB0aGlzLnByb3BzLnNob3J0Y3V0O1xyXG4gICAgICAgICAgICBzaG9ydEN1dC5zdHlsZS5jb2xvciA9IFwicmdiYSg1NSwgNTMsIDQ3LCAwLjUpXCJcclxuXHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHNob3J0Q3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICBjb21tYW5kOiB0aGlzLmNvbW1hbmQsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAoIERPTVV0aWxzLmdldFBhcmVudEZyb21TZWxlY3Rpb24oXCIuYmxvY2tcIikgfHwgRE9NVXRpbHMuZ2V0UGFyZW50VGFyZ2V0QnlTZWxlY3RvcihldmVudCBhcyBNb3VzZUV2ZW50LCBcIi5ibG9ja1wiKSApIGFzIEhUTUxIdG1sRWxlbWVudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAvLyAgICAgbGV0IGNvbnRhaW5lcjogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuXHJcbiAgICAgICAgLy8gICAgIGlmIChjb250YWluZXI/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGZvY3VzYWJsZVBhcmVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGZvY3VzYWJsZVBhcmVudCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGNoYW5nZSB3aGVuIGNsaWNraW5nIG9uIHRoaXMgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIGFzeW5jICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiA9IHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdC5kcm9wZG93bkl0ZW1zLmZpbmQodGhpcykhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93bk1lbnVMaXN0LnN3aXRjaFZpc3VhbEZvY3VzKG5vZGUhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKHRoaXMuY29tbWFuZCA9PSBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdoaWxpdGVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgYmFja2dyb3VuZCBjb2xvci5cIik7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHN0YXRlcy5oaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmZvcmVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vICAgICBpZiAodGhpcy5jb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcikge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29sb3IgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlICdjb3JlQ29sb3InIGNvbW1hbmQuIEVhY2ggJ0xpc3RNZW51SXRlbScgbXVzdCBzcGVjaWZ5IGEgY29sb3IgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IGNvbG9yLlwiKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc3RhdGVzLmNlbGxIaWxpdGVDb2xvclt0aGlzLnZhbHVlXSkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICB9XHJcblxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy50YWJsZUNlbGxDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgIC8vICAgICBjb25zdCBjdXN0b21FdmVudCA9IGV2ZW50IGFzIEN1c3RvbUV2ZW50PElGb3JtYXRDb21tYW5kPjtcclxuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmNvbW1hbmQgPT0gQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb2xvciB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGZvciB0aGUgJ2NvcmVDb2xvcicgY29tbWFuZC4gRWFjaCAnTGlzdE1lbnVJdGVtJyBtdXN0IHNwZWNpZnkgYSBjb2xvciByZXByZXNlbnRpbmcgdGhlIHRleHQgY29sb3IuXCIpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgIGlmIChzdGF0ZXMuY2VsbEhpbGl0ZUNvbG9yW3RoaXMudmFsdWVdKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcblxyXG4gICAgICAgIC8vIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB7IGNvbW1hbmQsIHNob3dVSSwgdmFsdWUsIHRhcmdldEJsb2NrVHlwZSB9ID0gZXZlbnQuZGV0YWlsO1xyXG5cclxuXHJcbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgIGlmIChcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29tbWFuZCA9PSBUZXh0T3BlcmF0aW9uU2VydmljZS5RVUVSWV9URVhUX09QRVJBVElPTlMuSElMSVRFX0NPTE9SIHx8XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkZPUkVfQ09MT1IpIHtcclxuXHJcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUNoZWNrSWNvblZpc2liaWxpdHkoKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29sb3JDaGFuZ2VcIiwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBpZiAoXHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbW1hbmQgPT0gVGV4dE9wZXJhdGlvblNlcnZpY2UuUVVFUllfVEVYVF9PUEVSQVRJT05TLkhJTElURV9DT0xPUiB8fFxyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5jb21tYW5kID09IFRleHRPcGVyYXRpb25TZXJ2aWNlLlFVRVJZX1RFWFRfT1BFUkFUSU9OUy5GT1JFX0NPTE9SKSB7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwgdGhpcy5oYW5kbGVDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZUV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0Q2xhc3MgJiYgZGV0YWlscy50YXJnZXRDbGFzcy5pbmNsdWRlcyhcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiKSkge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZXZlbnRWYWx1ZXMgPSAoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoYCMke2V2ZW50VmFsdWVzLmJsb2NrSWR9YCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSA9PSBldmVudFZhbHVlcy5sYW5ndWFnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb0hpZGRlbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIG5vcm1hbGl6ZUFuZE1lcmdlRWxlbWVudHMoZWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XHJcbiAgICAvLyAgICAgaWYgKCFlbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGxldCBjaGlsZCA9IGVsZW1lbnQuZmlyc3RDaGlsZDtcclxuICAgIC8vICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgIC8vICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVBbmRNZXJnZUVsZW1lbnRzKGNoaWxkIGFzIEhUTUxFbGVtZW50KTtcclxuICAgIC8vICAgICAgICAgfVxyXG5cclxuICAgIC8vICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2hpbGQubmV4dFNpYmxpbmc7XHJcbiAgICAvLyAgICAgICAgIHdoaWxlIChuZXh0U2libGluZyAmJiB0aGlzLnNob3VsZE1lcmdlKGNoaWxkLCBuZXh0U2libGluZykpIHtcclxuICAgIC8vICAgICAgICAgICAgIChjaGlsZCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MICs9IChuZXh0U2libGluZyBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5leHRTaWJsaW5nLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQobmV4dFNpYmxpbmcpO1xyXG4gICAgLy8gICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBuZXh0O1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xyXG4gICAgLy8gICAgIH1cclxuXHJcbiAgICAvLyAgICAgZWxlbWVudC5ub3JtYWxpemUoKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBzaG91bGRNZXJnZShub2RlMTogQ2hpbGROb2RlLCBub2RlMjogQ2hpbGROb2RlKTogYm9vbGVhbiB7XHJcbiAgICAvLyAgICAgaWYgKG5vZGUxPy5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgbm9kZTI/Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIGNvbnN0IGVsZW0xID0gbm9kZTEgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAvLyAgICAgY29uc3QgZWxlbTIgPSBub2RlMiBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICByZXR1cm4gZWxlbTEudGFnTmFtZSA9PT0gZWxlbTIudGFnTmFtZSAmJlxyXG4gICAgLy8gICAgICAgICBlbGVtMS5zdHlsZS5jc3NUZXh0ID09PSBlbGVtMi5zdHlsZS5jc3NUZXh0ICYmXHJcbiAgICAvLyAgICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0xKS5jb2xvciA9PT0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbTIpLmNvbG9yO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICAvLyBhc3luYyBjaGFuZ2VDaGVja0ljb25WaXNpYmlsaXR5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gICAgIHRyeSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gYXdhaXQgdGhpcy50ZXh0T3BlcmF0aW9uU2VydmljZS5xdWVyeUNvbW1hbmRTdGF0ZSh0aGlzLmNvbW1hbmQsIHRoaXMudmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBpZiAoaXNBY3RpdmUpIHtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4oKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcXVlcnkgY29tbWFuZCBzdGF0ZTpcIiwgZXJyb3IpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcblxyXG5cclxuICAgIGF0dGFjaFVJRXZlbnQoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5TaG93SGlkZUFjdGl2ZUJ1dHRvbiwgdGhpcy5oYW5kbGVTaG93SGlkZUFjdGl2ZUJ1dHRvbkV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tVUlFdmVudHMuUmVzZXRBY3RpdmVCdXR0b25zLCB0aGlzLmhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNob3dIaWRlQWN0aXZlQnV0dG9uRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0Py5pbmNsdWRlcyhkZXRhaWxzLnRhcmdldENsYXNzISkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKCEoZGV0YWlscy5hY3Rpb24gaW5zdGFuY2VvZiBTaG93SGlkZUFjdGl2ZUJ1dHRvbikpe1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBldmVudFZhbHVlcyA9IChkZXRhaWxzLmFjdGlvbiBhcyBTaG93SGlkZUFjdGl2ZUJ1dHRvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q29sb3IgPSBldmVudFZhbHVlcy52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlPy50b0xvd2VyQ2FzZSgpID09IGV2ZW50Q29sb3IudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50VmFsdWVzLmludGVudGlvbiA9PSBcInNob3dcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50KGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SVVJRXZlbnREZXRhaWw+O1xyXG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBjdXN0b21FdmVudC5kZXRhaWw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNsYXNzTGlzdD8uaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcyEpKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBpZighKGRldGFpbHMuYWN0aW9uIGluc3RhbmNlb2YgUmVzZXRBY3RpdmVCdXR0b25zKSl7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWNvbj8uY2hhbmdlVmlzaWJpbGl0eVRvSGlkZGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBnZXRMZWZ0SWNvbkNvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG5cclxuICAgIC8vICAgICBpZiAodGhpcy5sZWZ0SWNvbikge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmxlZnRJY29uKTtcclxuICAgIC8vICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gaGV4Q29sb3I7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAgIC8vIH1cclxuXHJcblxyXG4gICAgLy8gY2hhbmdlQWN0aXZlSWNvblRvVmlzaWJsZSgpOiB2b2lkIHtcclxuICAgIC8vICAgICB0aGlzLmFjdGl2ZUljb24/LmNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUoKTtcclxuICAgIC8vIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gXCIuLi8uLi8uLi9jb21tb24vQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdEl0ZW1cIjtcclxuaW1wb3J0IHsgSURyb3Bkb3duTWVudUl0ZW0gfSBmcm9tIFwiLi9JRHJvcGRvd25NZW51SXRlbVwiO1xyXG5pbXBvcnQgeyBKTm9kZSB9IGZyb20gXCJAL2NvbW1vbi9KTm9kZVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTWVudUxpc3QgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIHByaXZhdGUgcGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/OiBEcm9wZG93bk1lbnVCdXR0b247XHJcblxyXG4gICAgZHJvcGRvd25JdGVtczogQ2lyY3VsYXJEb3VibHlMaW5rZWRMaXN0PElEcm9wZG93bk1lbnVJdGVtPjtcclxuICAgIGN1cnJlbnRGb2N1c2VkTWVudUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcbiAgICBmaWx0ZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIGlkOiBpZFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gbmV3IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxEcm9wZG93bk1lbnVMaXN0SXRlbT4oKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdmbGV4JztcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQ6IEhUTUxVTGlzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnYmxvY2stdHlwZScpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc29mdC1ib3gtc2hhZG93JywgJ2RlcGVuZGVudC1ib3gnLCAnY2hlY2thYmxlLWl0ZW1zJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0ID0gXCIyNXZtYXhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguRXh0cmVtZWx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGRyb3Bkb3duSXRlbTogSURyb3Bkb3duTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLmFwcGVuZChkcm9wZG93bkl0ZW0pO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoZHJvcGRvd25JdGVtLmh0bWxFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHNldFBhcmVudERyb3Bkb3duTWVudUJ1dHRvbihkcm9wZG93blBhcmVudEJ1dHRvbjogRHJvcGRvd25NZW51QnV0dG9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiA9IGRyb3Bkb3duUGFyZW50QnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG5cclxuICAgIGF0dGFjaEV2ZW50cygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLy8gU2V0IGB0cnVlYCB0byBjYXB0dXJlIHRoZSBldmVudCBkdXJpbmcgdGhlIHJlZ2lzdHJhdGlvbiBwaGFzZSwgZ2l2aW5nIHRoaXMgZnVuY3Rpb24gcHJpb3JpdHkgb3ZlciBvdGhlcnMuXHJcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgZXZlbnQgZnJvbSBiZWluZyBoYW5kbGVkIGJ5IGVhcmxpZXIgYENvbnRlbnRgIGNvbXBvbmVudCBsaXN0ZW5lcnMuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmVtaXRDb21tYW5kRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2xpY2tlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmtleVByZXNzZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlKGV2ZW50KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gXCJBcnJvd0Rvd25cIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBGbG9hdGluZ1Rvb2xiYXIgd2l0aCBhIERyb3Bkb3duTGlzdCwgdGhpcyBoYW5kbGVyIHNob3VsZCBiZSBpZ25vcmVkIGZvciBzbW9vdGhlciBVSSBjb250cm9sLiBcclxuICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGZvciBjb21wb25lbnRzIGxpa2UgQmxvY2tUb29sYm94LCB3aGVyZSB0aGVyZSdzIG5vIHJpc2sgb2YgdGhlIHBhcmVudCBlbGVtZW50IGRpc2FwcGVhcmluZyBhZnRlciBwcmVzc2luZyBFc2NhcGUgKGlmIHRoZSBjdXJzb3IgaXMgd2l0aGluIHRoZSBibG9jayksXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXIgaXMgdXNlZCB0byBjbG9zZSB0aGUgZHJvcGRvd24gbGlzdCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgRXNjYXBlLlxyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRXNjYXBlICYmICF0aGlzLmh0bWxFbGVtZW50LmNsb3Nlc3QoXCIuZmxvYXRpbmctdG9vbGJhclwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVyS2V5RG93bkV2ZW50LmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5ibG9ja0Nsb25lZCwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoVUlFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZXJLZXlEb3duRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgL15bYS16QS1aXSQvLnRlc3QoZXZlbnQua2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciArPSBldmVudC5rZXk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkJhY2tzcGFjZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcigpIHtcclxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJcIiB8fCBpdGVtLnZhbHVlPy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuZmlsdGVyLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHx8IGl0ZW0udGl0bGU/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5maWx0ZXIudG9Mb2NhbGVMb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlciA9IFwiXCI7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IFwiMFwiO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUucmlnaHQgPSBcImF1dG9cIjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZG9lc0VsZW1lbnRPdmVyZmxvd1NjcmVlbikge1xyXG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBcImF1dG9cIjtcclxuICAgICAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5yaWdodCA9IFwiMFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uc3ZnSWNvbj8uc2V0VXNlVG8oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLXVwXCIpO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/LnN2Z0ljb24/LnNldFVzZVRvKFwiaWNvbi13b3JkcHJlc3MtY2hldnJvbi1kb3duXCIpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbT8udmFsdWUucmVtb3ZlRm9jdXMoKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2hWaXN1YWxGb2N1cyhpdGVtOiBKTm9kZTxJRHJvcGRvd25NZW51SXRlbT4pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLnJlbW92ZUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBpdGVtO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9jdXNOZXh0VmlzaWJsZUl0ZW0oKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBuZXh0VmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldE5leHRTYXRpc2Z5aW5nKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSAmJiBpdGVtLmlzVmlzaWJsZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKG5leHRWaXNpYmxlSXRlbSEpO1xyXG4gICAgICAgIG5leHRWaXNpYmxlSXRlbT8udmFsdWUuZW5zdXJlVmlzaWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZUl0ZW06IEpOb2RlPElEcm9wZG93bk1lbnVJdGVtPiB8IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0pIHtcclxuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIERyb3Bkb3duTWVudUxpc3RJdGVtICYmIGl0ZW0uaXNWaXNpYmxlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmRGaXJzdChpdGVtID0+IGl0ZW0gaW5zdGFuY2VvZiBEcm9wZG93bk1lbnVMaXN0SXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN3aXRjaFZpc3VhbEZvY3VzKHByZXZpb3VzVmlzaWJsZUl0ZW0hKTtcclxuICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtPy52YWx1ZS5lbnN1cmVWaXNpYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbGlja2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgICAgICYmICEoZXZlbnQudGFyZ2V0ISBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChgIyR7dGhpcy5wYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbj8uaHRtbEVsZW1lbnQuaWR9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBrZXlQcmVzc2VkT3V0c2lkZVRoZURyb3Bkb3duV2hpbGVEcm9wZG93bklzVmlzaWJsZShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbkhpZGVcclxuICAgICAgICAgICAgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApXHJcbiAgICAgICAgLy8mJiAhKGV2ZW50LnRhcmdldCEgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYCMke3RoaXMucGFyZW50RHJvcGRvd25QYXJlbnRCdXR0b24/Lmh0bWxFbGVtZW50LmlkfWApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHByZWZpeElkOiBzdHJpbmcsIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnVMaXN0IHtcclxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KHByZWZpeElkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpKTtcclxuICAgICAgICBpbnN0YW5jZS5hZGRDc3NDbGFzcyguLi5jbGFzc2VzS2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGlkOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtpZDogaWR9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiMjRweFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSaWdodCA9IFwiMXB4IHNvbGlkICNkMGQwZDBcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW4gPSBcImF1dG8gNnB4XCI7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXAgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICAgICAgICBzdXBlcih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaXRlbVwiKTtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gXCIxMHB4XCI7XHJcbiAgICAgICAgLy8gaHRtbEVsZW1lbnQuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjEwcHhcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL1NWR0ljb25cIjtcbmltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbFwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcbmltcG9ydCB7IENoYW5nZUNvbG9yIH0gZnJvbSBcIkAvY29tbWFuZHMvVUlBY3Rpb25zL0NoYW5nZUNvbG9yXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xuXG5leHBvcnQgY2xhc3MgQnV0dG9uR3JvdXBJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd1VJOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbjogU1ZHSWNvbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgaWNvbjogU1ZHSWNvbikge1xuXG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICAgIGljb246IGljb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5zaG93VUkgPSBjb21tYW5kID09IENvbW1hbmRzLnRvZ2dsZUxpbms7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG5cbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcbiAgICB9XG5cbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImVudHJ5XCIsIFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLW9wZXJhdGlvblwiLCBcIm9wdGlvbi1ob3ZlclwiKTtcbiAgICAgICAgaHRtbEVsZW1lbnQudGl0bGUgPSB0aGlzLnByb3BzLnRpdGxlO1xuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5pY29uLmh0bWxFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIGFzeW5jIChldmVudCkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzKGV2ZW50LCBcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jb21tYW5kLFxuICAgICAgICAgICAgICAgICAgICBzaG93VUk6IHRoaXMuc2hvd1VJLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogYmxvY2tcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLnRleHRGb3JtYXRDaGFuZ2VkLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8SUZvcm1hdENvbW1hbmQ+O1xuICAgICAgICAvLyAgICAgY29uc3Qgc3RhdGVzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZiAoc3RhdGVzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pZCA9PSBkZXRhaWxzLnRhcmdldElkKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoKGRldGFpbHMuYWN0aW9uIGFzIENoYW5nZUNvbG9yKS5jb2xvcilcblxuICAgICAgICAgICAgICAgIC8vIGlmIChkZXRhaWxzW3RoaXMuY29tbWFuZCBhcyBrZXlvZiBJRm9ybWF0Q29tbWFuZF0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5pY29uLmNoYW5nZUNvbG9yKENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5Db2xvckNoYW5nZVJlcXVlc3QsIChldmVudDogRXZlbnQpID0+IHtcblxuICAgICAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XG4gICAgICAgIC8vICAgICBjb25zdCBkZXRhaWxzID0gY3VzdG9tRXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIC8vICAgICBpZih0aGlzLmlkID09IGRldGFpbHMudGFyZ2V0SWQpe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuaWNvbi5jaGFuZ2VDb2xvcigoZGV0YWlscy5hY3Rpb24gYXMgQ2hhbmdlQ29sb3IpLmNvbG9yKVxuXG4gICAgICAgIC8vICAgICAgICAgLy8gaWYgKGRldGFpbHNbdGhpcy5jb21tYW5kIGFzIGtleW9mIElGb3JtYXRDb21tYW5kXSkge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgLy8gICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICB0aGlzLmljb24uY2hhbmdlQ29sb3IoQ29sb3JzLkljb25EZWZhdWx0QmxhY2spO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShjb21tYW5kOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGljb246IFNWR0ljb24pOiBCdXR0b25Hcm91cEl0ZW0ge1xuICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkdyb3VwSXRlbShjb21tYW5kLCB0aXRsZSwgaWNvbik7XG4gICAgfVxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7O1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbG9ySWNvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgY29sb3I6IGNvbG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEuMjVyZW1cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSBcIjUwJVwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMucHJvcHMuY29sb3I7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2QwZDBkMFwiO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIi4vRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBJRHJvcGRvd25NZW51SXRlbSB9IGZyb20gXCIuL0lEcm9wZG93bk1lbnVJdGVtXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCBpbXBsZW1lbnRzIElEcm9wZG93bk1lbnVJdGVtIHtcclxuXHJcblxyXG4gICAgcGFyZW50RHJvcGRvd25NZW51TGlzdDogRHJvcGRvd25NZW51TGlzdDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnREcm9wZG93bk1lbnVMaXN0OiBEcm9wZG93bk1lbnVMaXN0LCB0aXRsZTogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucGFyZW50RHJvcGRvd25NZW51TGlzdCA9IHBhcmVudERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgdGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBhY3RpdmVJY29uPzogU1ZHSWNvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IFwiXCI7XHJcbiAgICBcclxuICAgIGNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUoKTogdm9pZCB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZ2V0TGVmdEljb25CYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRBY3RpdmVJY29uKCk6IHZvaWQge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgYXR0YWNoT25Mb3NlRm9jdXMoZnVuYzogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBhdHRhY2hPbkZvY3VzKGZ1bmM6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcIm5vLWxpc3Qtc3R5bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcclxuICAgICAgICB0aXRsZS5pbm5lclRleHQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIHRpdGxlLmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKHRpdGxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMsIENvbG9yc05hbWVzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvQmxvY2tUb29sYm94XCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbW1vbi9TVkdJY29uXCI7XHJcbmltcG9ydCB7IEJ1dHRvbkdyb3VwIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW0gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvYnV0dG9uLWdyb3VwL0J1dHRvbkdyb3VwSXRlbVwiO1xyXG5pbXBvcnQgeyBDb2xvckljb24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Db2xvckljb25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUJ1dHRvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUJ1dHRvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0IH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdFwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0SXRlbSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSXRlbUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25JdGVtSURzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQmxvY2tUb29sYm94QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGFsaWduVG9vbCgpOiBCdXR0b25Hcm91cCB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBCdXR0b24gPSBuZXcgQnV0dG9uR3JvdXAoKTtcclxuXHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5TGVmdCwgXCJMZWZ0XCIsIFNWR0ljb24uY3JlYXRlKEljb25zLkp1c3RpZnlTdGFydCwgU2l6ZXMubGFyZ2UpKS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy5KdXN0aWZ5Q2VudGVyLCBcIkNlbnRlclwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5Q2VudGVyLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLkp1c3RpZnlSaWdodCwgXCJSaWdodFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5KdXN0aWZ5RW5kLCBTaXplcy5sYXJnZSkpLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGdyb3VwQnV0dG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjb2xvclRvb2woKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcImNvbG9ySW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSk7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JJbnRlcmFjdGl2ZUJ1dHRvblwiICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBuZXcgQ29sb3JJY29uKFwiI0ZBRjREMVwiKS5odG1sRWxlbWVudCwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIGNvbG9yQnV0dG9uLmFkZENzc0NsYXNzKFwiY29sb3ItaW50ZXJhY3RpdmUtYnV0dG9uXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcImNvbG9ySW50ZXJhY3Rpb25PcHRpb25zTWVudVwiICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckJ1dHRvbiwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiQmFja2dyb3VuZFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yUmVkID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uUmVkICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IEhpbGl0ZUNvbG9yR3JlZW4gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25HcmVlbiArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kR3JlZW4sIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JlZW4pLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvckJsdWUgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oRHJvcGRvd25JdGVtSURzLkJhY2tncm91bmRPcHRpb25CbHVlICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRCbHVlLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckJsdWUpLmh0bWxFbGVtZW50LCBcIkJsdWVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yWWVsbG93ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uWWVsbG93ICsgVXRpbHMuZ2VuZXJhdGVVbmlxdWVJZCgpLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciwgQ29sb3JzTmFtZXMuQ2FsbG91dEJhY2tncm91bmRZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yR3JleSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZXkgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy5jaGFuZ2VDYWxsb3V0QmFja2dyb3VuZENvbG9yLCBDb2xvcnNOYW1lcy5DYWxsb3V0QmFja2dyb3VuZEdyZXksIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSkuaHRtbEVsZW1lbnQsIFwiR3JleVwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uTm9uZSArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3IsIENvbG9yc05hbWVzLkNhbGxvdXRCYWNrZ3JvdW5kTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChIaWxpdGVDb2xvckdyZWVuKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZXkpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbGFuZ3VhZ2VTZWxlY3Rpb25Ub29sKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdCA9IERyb3Bkb3duTWVudUxpc3QuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZU9wdGlvblNlbGVjdFwiKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGl2ZUJ1dHRvblwiLCBcIlBsYWluIFRleHRcIiwgc2VsZWN0LCB0cnVlLCBbXCJjb2RlLWJsb2NrLWxhbmd1YWdlLW1lbnVcIiwgXCJjb2xvci1pbnRlcmFjdGl2ZS1idXR0b25cIl0pO1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBEcm9wZG93bk1lbnUuY3JlYXRlKFwibGFuZ3VhZ2VTZWxlY3Rpb25JbnRlcmFjdGlvbk9wdGlvbnNNZW51XCIsIGJ1dHRvbiwgc2VsZWN0KTtcclxuXHJcbiAgICAgICAgc2VsZWN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShzZWxlY3QsIFwiTGFuZ3VhZ2VcIikpO1xyXG5cclxuICAgICAgICBPYmplY3QuZW50cmllcyhCbG9ja1Rvb2xib3gubGFuZ3VhZ2VNYXApLnNvcnQoKGEsIGIpID0+IGFbMV0ubG9jYWxlQ29tcGFyZShiWzFdKSkuZm9yRWFjaCgoW2NvZGUsIG5hbWVdKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJsYW5ndWFnZVNlbGVjdGlvbkl0ZW0tXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIHNlbGVjdCwgQ29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2UsIGNvZGUsIG51bGwsIG5hbWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgPT0gXCJwbGFpbnRleHRcIikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5hY3RpdmVJY29uPy5jaGFuZ2VWaXNpYmlsaXR5VG9WaXNpYmxlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2VsZWN0LmFwcGVuZChpdGVtKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGV4dHJhT3B0aW9ucygpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBsaXN0ID0gRHJvcGRvd25NZW51TGlzdC5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25TZWxlY3RcIiwgW1wibWVkaWEtbW9yZS1vcHRpb24tc2VsZWN0XCJdKTtcclxuICAgICAgICBjb25zdCBidXR0b24gPSBEcm9wZG93bk1lbnVCdXR0b24uY3JlYXRlKFwibW9yZUludGVyYWN0aXZlT3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIGxpc3QsIGZhbHNlLCBbXCJtb3JlTWVkaWFPcHRpb25zQnV0dG9uXCJdKTtcclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IERyb3Bkb3duTWVudS5jcmVhdGUoXCJtb3JlSW50ZXJhY3RpdmVPcHRpb25zTWVudVwiLCBidXR0b24sIGxpc3QpO1xyXG5cclxuICAgICAgICBsaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShsaXN0LCBcIk1vcmUgb3B0aW9uc1wiKSk7XHJcbiAgICAgICAgbGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZHVwbGljYXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5EdXBsaWNhdGUsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJDbG9uZVwiLCBcIkN0cmwrRFwiKSk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVJdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiZGVsZXRlT3B0aW9uXCIgKyBVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCksIGxpc3QsIENvbW1hbmRzLmRlbGV0ZUJsb2NrLCBudWxsLCBTVkdJY29uLmNyZWF0ZShJY29ucy5UcmFzaCwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbGlzdC5hcHBlbmQoZGVsZXRlSXRlbSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkcm9wZG93bjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElCbG9ja1Rvb2xib3ggfSBmcm9tIFwiLi9JQmxvY2tUb29sYm94XCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgVG9vbGJveE9wdGlvbnMgfSBmcm9tIFwiLi9Ub29sYm94T3B0aW9uc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3hCdWlsZGVyIH0gZnJvbSBcIkAvYnVpbGRlcnMvQmxvY2tUb29sYm94QnVpbGRlclwiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCJAL2NvbW1vbi9ET01FbGVtZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tb25DbGFzc2VzIH0gZnJvbSBcIkAvY29tbW9uL0NvbW1vbkNsYXNzZXNcIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBCbG9ja1Rvb2xib3ggaW1wbGVtZW50cyBJQmxvY2tUb29sYm94IHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQmxvY2tUb29sYm94O1xyXG5cclxuICAgIHN0YXRpYyBsYW5ndWFnZU1hcDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgICAgICAvLyBcIjFjXCI6IFwiMUNcIixcclxuICAgICAgICAvLyBcImFibmZcIjogXCJBQk5GXCIsIFxyXG4gICAgICAgIC8vIFwiYWNjZXNzbG9nXCI6IFwiQWNjZXNzIExvZ3NcIiwgXHJcbiAgICAgICAgLy8gXCJhY3Rpb25zY3JpcHRcIjogXCJBY3Rpb25TY3JpcHRcIiwgXHJcbiAgICAgICAgXCJhZGFcIjogXCJBZGFcIixcclxuICAgICAgICAvL1wiYW5nZWxzY3JpcHRcIjogXCJBbmdlbFNjcmlwdFwiLCBcclxuICAgICAgICBcImFwYWNoZVwiOiBcIkFwYWNoZSBDb25maWdcIixcclxuICAgICAgICBcImFwcGxlc2NyaXB0XCI6IFwiQXBwbGVTY3JpcHRcIixcclxuICAgICAgICBcImFyZHVpbm9cIjogXCJBcmR1aW5vXCIsXHJcbiAgICAgICAgLy8gXCJhcm1hc21cIjogXCJBUk0gQXNzZW1ibHlcIiwgXHJcbiAgICAgICAgXCJhc2NpaWRvY1wiOiBcIkFzY2lpRG9jXCIsXHJcbiAgICAgICAgLy8gXCJhc21cIjogXCJBc3NlbWJseVwiLCBcclxuICAgICAgICAvLyBcImF1dG9ob3RrZXlcIjogXCJBdXRvSG90a2V5XCIsIFxyXG4gICAgICAgIC8vIFwiYXV0b2l0XCI6IFwiQXV0b0l0XCIsIFxyXG4gICAgICAgIFwiYmFzaFwiOiBcIkJhc2hcIixcclxuICAgICAgICBcImJhc2ljXCI6IFwiQkFTSUNcIixcclxuICAgICAgICBcImNcIjogXCJDXCIsXHJcbiAgICAgICAgXCJjc2hhcnBcIjogXCJDI1wiLFxyXG4gICAgICAgIFwiY3BwXCI6IFwiQysrXCIsXHJcbiAgICAgICAgXCJjc3NcIjogXCJDU1NcIixcclxuICAgICAgICAvLyBcImNsb2p1cmVcIjogXCJDbG9qdXJlXCIsIFxyXG4gICAgICAgIFwiY29mZmVlc2NyaXB0XCI6IFwiQ29mZmVlU2NyaXB0XCIsXHJcbiAgICAgICAgLy8gXCJkXCI6IFwiRFwiLCBcclxuICAgICAgICBcImRhcnRcIjogXCJEYXJ0XCIsXHJcbiAgICAgICAgLy8gXCJkZWxwaGlcIjogXCJEZWxwaGlcIiwgXHJcbiAgICAgICAgLy8gXCJlbGl4aXJcIjogXCJFbGl4aXJcIiwgXHJcbiAgICAgICAgLy8gXCJlbG1cIjogXCJFbG1cIiwgXHJcbiAgICAgICAgLy8gXCJlcmxhbmdcIjogXCJFcmxhbmdcIiwgXHJcbiAgICAgICAgLy8gXCJmc2hhcnBcIjogXCJGI1wiLCBcclxuICAgICAgICAvLyBcImZvcnRyYW5cIjogXCJGb3J0cmFuXCIsIFxyXG4gICAgICAgIFwiZ29cIjogXCJHb1wiLFxyXG4gICAgICAgIC8vIFwiZ3Jvb3Z5XCI6IFwiR3Jvb3Z5XCIsIFxyXG4gICAgICAgIC8vIFwiaGFza2VsbFwiOiBcIkhhc2tlbGxcIiwgXHJcbiAgICAgICAgXCJodG1sXCI6IFwiSFRNTFwiLFxyXG4gICAgICAgIFwiamF2YVwiOiBcIkphdmFcIixcclxuICAgICAgICBcImphdmFzY3JpcHRcIjogXCJKYXZhU2NyaXB0XCIsXHJcbiAgICAgICAgXCJqc29uXCI6IFwiSlNPTlwiLFxyXG4gICAgICAgIC8vIFwianVsaWFcIjogXCJKdWxpYVwiLCBcclxuICAgICAgICAvLyBcImtvdGxpblwiOiBcIktvdGxpblwiLCBcclxuICAgICAgICAvLyBcImxhdGV4XCI6IFwiTGFUZVhcIiwgXHJcbiAgICAgICAgLy8gXCJsaXNwXCI6IFwiTGlzcFwiLCBcclxuICAgICAgICAvLyBcImx1YVwiOiBcIkx1YVwiLCBcclxuICAgICAgICBcIm1hcmtkb3duXCI6IFwiTWFya2Rvd25cIixcclxuICAgICAgICAvLyBcIm1hdGxhYlwiOiBcIk1BVExBQlwiLCBcclxuICAgICAgICAvLyBcIm9iamVjdGl2ZS1jXCI6IFwiT2JqZWN0aXZlLUNcIiwgXHJcbiAgICAgICAgXCJwZXJsXCI6IFwiUGVybFwiLFxyXG4gICAgICAgIFwicGhwXCI6IFwiUEhQXCIsXHJcbiAgICAgICAgXCJwbGFpbnRleHRcIjogXCJQbGFpbiBUZXh0XCIsXHJcbiAgICAgICAgXCJweXRob25cIjogXCJQeXRob25cIixcclxuICAgICAgICAvLyBcInJcIjogXCJSXCIsIFxyXG4gICAgICAgIFwicnVieVwiOiBcIlJ1YnlcIixcclxuICAgICAgICAvLyBcInJ1c3RcIjogXCJSdXN0XCIsIFxyXG4gICAgICAgIC8vIFwic2NhbGFcIjogXCJTY2FsYVwiLCBcclxuICAgICAgICAvLyBcInNjaGVtZVwiOiBcIlNjaGVtZVwiLCBcclxuICAgICAgICBcInNjc3NcIjogXCJTQ1NTXCIsXHJcbiAgICAgICAgXCJzaGVsbFwiOiBcIlNoZWxsXCIsXHJcbiAgICAgICAgXCJzcWxcIjogXCJTUUxcIixcclxuICAgICAgICAvLyBcInN3aWZ0XCI6IFwiU3dpZnRcIiwgXHJcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCI6IFwiVHlwZVNjcmlwdFwiLFxyXG4gICAgICAgIC8vIFwidmJuZXRcIjogXCJWaXN1YWwgQmFzaWMgLk5FVFwiLCBcclxuICAgICAgICAvLyBcInZoZGxcIjogXCJWSERMXCIsIFxyXG4gICAgICAgIFwieG1sXCI6IFwiWE1MXCIsXHJcbiAgICAgICAgXCJ5YW1sXCI6IFwiWUFNTFwiXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKEJsb2NrVG9vbGJveC5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgQmxvY2tUb29sYm94LmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IEJsb2NrVG9vbGJveCB7XHJcbiAgICAgICAgaWYgKCFCbG9ja1Rvb2xib3guaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgQmxvY2tUb29sYm94Lmluc3RhbmNlID0gbmV3IEJsb2NrVG9vbGJveCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQmxvY2tUb29sYm94Lmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkxpc3RlbmluZyBibG9jayB0b29sYm94ZXMuLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VvdmVyLCB0aGlzLmluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkZvY3VzaW4sIHRoaXMuaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzSW4uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuRm9jdXNvdXQsIHRoaXMuaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzT3V0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrRXZlbnQuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja0V2ZW50KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sYm94VmlzaWJpbGl0eUNvbnRyb2xsZXIodGFyZ2V0RWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSGFuZGxlcyBmb2N1cyBpbiBldmVudHMgd2l0aGluIGEgdGFibGUuIElmIHRoZSBmb2N1cyBpcyB3aXRoaW4gYSB0YWJsZSBlbGVtZW50LFxyXG4gICAgKiBpdCB0cmlnZ2VycyB0aGUgdG9vbGJveCB2aXNpYmlsaXR5IGNvbnRyb2xsZXIgdG8gcG90ZW50aWFsbHkgaGlkZSB0aGUgdG9vbGJveC5cclxuICAgICogVGhpcyBpcyBkZXNpZ25lZCB0byBwcmV2ZW50IHRoZSB0b29sYm94IGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0YWJsZSBpbnRlcmFjdGlvbnMuXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7Rm9jdXNFdmVudH0gZXZlbnQgLSBUaGUgZm9jdXMgZXZlbnQgdHJpZ2dlcmVkIHdoZW4gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHRhYmxlIGdhaW5zIGZvY3VzLlxyXG4gICAgKiBAcHJpdmF0ZVxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFibGVCZWhhdmlvckZvY3VzSW4oZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9vbGJveFZpc2liaWxpdHlDb250cm9sbGVyKHRhcmdldEVsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgZm9jdXMgb3V0IGV2ZW50cyB3aXRoaW4gYSB0YWJsZS4gSWYgdGhlIGZvY3VzIG1vdmVzIG91dCBvZiBhIHRhYmxlIGVsZW1lbnQsXHJcbiAgICAgKiBpdCB0cmlnZ2VycyB0aGUgdG9vbGJveCB2aXNpYmlsaXR5IGNvbnRyb2xsZXIgdG8gcG90ZW50aWFsbHkgc2hvdyB0aGUgdG9vbGJveC5cclxuICAgICAqIFRoaXMgaGVscHMgaW4gZW5zdXJpbmcgdGhhdCB0aGUgdG9vbGJveCBpcyBhdmFpbGFibGUgZm9yIHVzZSB3aGVuIHRoZSB0YWJsZSBpcyBub3QgYWN0aXZlbHkgZm9jdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0ZvY3VzRXZlbnR9IGV2ZW50IC0gVGhlIGZvY3VzIGV2ZW50IHRyaWdnZXJlZCB3aGVuIGFuIGVsZW1lbnQgd2l0aGluIHRoZSB0YWJsZSBsb3NlcyBmb2N1cy5cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c091dChldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRhcmdldEVsZW1lbnQuY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sYm94VmlzaWJpbGl0eUNvbnRyb2xsZXIodGFyZ2V0RWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlcihjZWxsOiBIVE1MRWxlbWVudCwgZm9yY2VIaWRlRWxlbWVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY2VsbC5jbG9zZXN0KCcuYmxvY2snKTtcclxuICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc1dyYXBwZXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKCcuYmxvY2stdG9vbGJhcicpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9uc1dyYXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JjZUhpZGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1dyYXBwZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoYC4ke1Rvb2xib3hPcHRpb25zLkluY2x1ZGVCbG9ja1Rvb2xiYXJDbGFzc31gKTtcclxuXHJcbiAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5jbG9zZXN0KFwiLmJsb2NrXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWJsb2NrKSByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zQnV0dG9uRXhpc3RzID0gYmxvY2sucXVlcnlTZWxlY3RvcignLmJsb2NrLXRvb2xiYXItd3JhcHBlcicpICE9PSBudWxsO1xyXG4gICAgICAgIGlmICghb3B0aW9uc0J1dHRvbkV4aXN0cykge1xyXG5cclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUxhbmd1YWdlU2VsZWN0aW9uVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkxhbmd1YWdlU2VsZWN0aW9uVG9vbENsYXNzKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUFsaWduVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUNvbG9yVG9vbCA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkNvbG9yVG9vbENsYXNzKTtcclxuICAgICAgICAgICAgY29uc3QgaW5jbHVkZUV4dHJhT3B0aW9ucyA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFRvb2xib3hPcHRpb25zLkV4dHJhT3B0aW9uc0NsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xib3hXcmFwcGVyID0gQmxvY2tUb29sYm94LmNyZWF0ZVRvb2xib3goaW5jbHVkZUxhbmd1YWdlU2VsZWN0aW9uVG9vbCwgaW5jbHVkZUFsaWduVG9vbCwgaW5jbHVkZUNvbG9yVG9vbCwgaW5jbHVkZUV4dHJhT3B0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYmxvY2spIHtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmFwcGVuZENoaWxkKHRvb2xib3hXcmFwcGVyKTtcclxuICAgICAgICAgICAgICAgIGJsb2NrLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZW50ZXIsIChldmVudCkgPT4gdGhpcy5yZXNldFRvb2xib3goZXZlbnQsIGJsb2NrIGFzIEhUTUxFbGVtZW50KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYmxvY2suYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vtb3ZlLCAoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChibG9ja1Rvb2xiYXJJZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29sYmFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUJsb2NrVG9vbGJveCh0b29sYm94V3JhcHBlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBibG9jay5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZWxlYXZlLCAoKSA9PiB0aGlzLmhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXIpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFET01VdGlscy5pc1RhcmdldERlc2NlbmRhbnRPZlNlbGVjdG9yKGV2ZW50LCBgIyR7YmxvY2suaWR9YCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQmxvY2tUb29sYm94KHRvb2xib3hXcmFwcGVyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWZyYW1lcyA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpZnJhbWVcIik7XHJcbiAgICAgICAgICAgICAgICBpZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2VlbnRlciwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXJJZCA9ICh0b29sYm94V3JhcHBlci5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50KT8uaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYmxvY2tUb29sYmFySWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9vbGJhcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJDb2xvcihibG9jayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlbGVhdmUsICgpID0+IHRoaXMuaGlkZUJsb2NrVG9vbGJveCh0b29sYm94V3JhcHBlcikpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2s6IEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBjb2xvckludGVyYWN0aXZlQnV0dG9uID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jb2xvci1pbnRlcmFjdGl2ZS1idXR0b24gZGl2XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNhbGxvdXRXcmFwcGVyID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0LXdyYXBwZXJcIik7XHJcblxyXG4gICAgICAgIGlmIChjb2xvckludGVyYWN0aXZlQnV0dG9uICYmIGNhbGxvdXRXcmFwcGVyKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjYWxsb3V0V3JhcHBlcik7XHJcblxyXG4gICAgICAgICAgICBjb2xvckludGVyYWN0aXZlQnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgY29sb3JJbnRlcmFjdGl2ZUJ1dHRvbi5zdHlsZS5ib3JkZXJDb2xvciA9IHN0eWxlLmJvcmRlckNvbG9yO1xyXG4gICAgICAgICAgICBjb2xvckludGVyYWN0aXZlQnV0dG9uLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjY2NjXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhpZGVCbG9ja1Rvb2xib3godG9vbGJveFdyYXBwZXI6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2tUb29sYmFySWQgPSAodG9vbGJveFdyYXBwZXIuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudCk/LmlkO1xyXG4gICAgICAgIGNvbnN0IHRvb2xiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChibG9ja1Rvb2xiYXJJZCk7XHJcbiAgICAgICAgaWYgKHRvb2xiYXIpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICghQmxvY2tUb29sYm94LmlzQW55RGVwZW5kZW50Qm94VmlzaWJsZSh0b29sYmFyKSkge1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQW55RGVwZW5kZW50Qm94VmlzaWJsZShodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRlbnRCb3hlcyA9IGh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZGVwZW5kZW50LWJveFwiKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBib3ggb2YgZGVwZW5kZW50Qm94ZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShib3gpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBzdHlsZS52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNldFRvb2xib3goZXZlbnQ6IEV2ZW50LCBibG9jazogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXIgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmJsb2NrLXRvb2xiYXJcIik7XHJcblxyXG4gICAgICAgIGlmICghYmxvY2tUb29sYmFyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmxvY2stdG9vbGJhciBub3QgZm91bmRcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vcmUgPSBibG9ja1Rvb2xiYXIucXVlcnlTZWxlY3RvcihcIi5tZWRpYS1tb3JlLW9wdGlvbi1zZWxlY3RcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKG1vcmUpIHtcclxuICAgICAgICAgICAgbW9yZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IGJsb2NrVG9vbGJhci5xdWVyeVNlbGVjdG9yKFwiLmNvbG9yLWludGVyYWN0aXZlLXNlbGVjdFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAoY29sb3IpIHtcclxuICAgICAgICAgICAgY29sb3Iuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGFuZ2VUb29sYmFyQ29sb3IoYmxvY2spO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjcmVhdGVUb29sYm94KGluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wgPSBmYWxzZSwgaW5jbHVkZUFsaWduVG9vbCA9IGZhbHNlLCBpbmNsdWRlQ29sb3JUb29sID0gZmFsc2UsIGluY2x1ZGVFeHRyYU9wdGlvbnMgPSBmYWxzZSk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJibG9jay10b29sYmFyLXdyYXBwZXJcIiwgXCJleGNsdWRlLWZyb20tY2xvbmVcIiwgQ29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5KTtcclxuICAgICAgICBodG1sRWxlbWVudFdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYmxvY2stdG9vbGJhclwiLCBcInNvZnQtYm94LXNoYWRvd1wiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5pZCA9IGBidGItJHtVdGlscy5nZW5lcmF0ZVVuaXF1ZUlkKCl9YDtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnRXcmFwcGVyLmFwcGVuZENoaWxkKGh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoQmxvY2tUb29sYm94QnVpbGRlci5sYW5ndWFnZVNlbGVjdGlvblRvb2woKS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5jbHVkZUFsaWduVG9vbCkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChCbG9ja1Rvb2xib3hCdWlsZGVyLmFsaWduVG9vbCgpLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpbmNsdWRlQ29sb3JUb29sKSB7XHJcbiAgICAgICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKEJsb2NrVG9vbGJveEJ1aWxkZXIuY29sb3JUb29sKCkuaHRtbEVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVFeHRyYU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoQmxvY2tUb29sYm94QnVpbGRlci5leHRyYU9wdGlvbnMoKS5odG1sRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnRXcmFwcGVyO1xyXG4gICAgfVxyXG5cclxufSIsImltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vLi4vY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgQ3VzdG9tVUlFdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tVUlFdmVudHNcIjtcclxuaW1wb3J0IHsgSVVJRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JVUlFdmVudERldGFpbFwiO1xyXG5pbXBvcnQgeyBDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSB9IGZyb20gXCJAL2NvbW1hbmRzL1VJQWN0aW9ucy9DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZVwiO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9VdGlsc1wiO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tIFwiQC9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvQmxvY2tUb29sYm94XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51QnV0dG9uIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBkcm9wZG93bkxpc3Q6IERyb3Bkb3duTWVudUxpc3Q7XHJcbiAgICBzdmdJY29uPzogU1ZHSWNvbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGRyb3Bkb3duTGlzdDogRHJvcGRvd25NZW51TGlzdCwgaW5jbHVkZUNoZXZyb25JY29uOiBib29sZWFuID0gdHJ1ZSkge1xyXG5cclxuICAgICAgICBjb25zdCBzdmdJY29uID0gbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1jaGV2cm9uLWRvd25cIiwgU2l6ZXMubWVkaXVtKTtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgICAgZHJvcGRvd25MaXN0OiBkcm9wZG93bkxpc3QsXHJcbiAgICAgICAgICAgIHN2Z0ljb246IGluY2x1ZGVDaGV2cm9uSWNvbiA/IHN2Z0ljb24gOiBudWxsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZHJvcGRvd25MaXN0ID0gZHJvcGRvd25MaXN0O1xyXG4gICAgICAgIHRoaXMuc3ZnSWNvbiA9IHN2Z0ljb247XHJcblxyXG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGRyb3Bkb3duTGlzdC5zZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24odGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50OiBIVE1MQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZDtcclxuICAgICAgICAvLyBodG1sRWxlbWVudC50aXRsZSA9IHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICBodG1sRWxlbWVudC5yb2xlID0gXCJidXR0b25cIjtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uLXJlc2V0XCIsIFwidGV4dC1mb3JtYXR0aW5nLXNlbGVjdC1idXR0b25cIiwgXCJ0ZXh0LWZvcm1hdHRpbmctb3BlcmF0aW9uXCIsIFwib3B0aW9uLWhvdmVyXCIsIFwicG9pbnRlclwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC50YWJJbmRleCA9IDE7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiLCB0aGlzLnByb3BzLmRyb3Bkb3duTGlzdC5odG1sRWxlbWVudC5pZCk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy50aXRsZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICBzcGFuLmNsYXNzTGlzdC5hZGQoXCJuby1zZWxlY3Rpb25cIik7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnByb3BzLnRpdGxlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnN2Z0ljb24pIHtcclxuICAgICAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wcm9wcy5zdmdJY29uLmh0bWxFbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duTGlzdC5pc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25MaXN0LnNob3coKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21VSUV2ZW50cy5DaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZSwgdGhpcy5oYW5kbGVDaGFuZ2VCbG9ja1Rvb2xiYXJMYW5ndWFnZUV2ZW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKGRldGFpbHMudGFyZ2V0Q2xhc3MgJiYgdGhpcy5jbGFzc0xpc3QuaW5jbHVkZXMoZGV0YWlscy50YXJnZXRDbGFzcykpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gKGRldGFpbHMuYWN0aW9uIGFzIENoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gdGhpcy5odG1sRWxlbWVudC5jbG9zZXN0KGAjJHtldmVudFZhbHVlcy5ibG9ja0lkfWApO1xyXG5cclxuICAgICAgICAgICAgaWYoYmxvY2spe1xyXG4gICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRpdGxlKEJsb2NrVG9vbGJveC5sYW5ndWFnZU1hcFtldmVudFZhbHVlcy5sYW5ndWFnZV0pO1xyXG4gICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duTGlzdC5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICdibG9jayc7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGl0bGUodmFsdWU6IHN0cmluZyl7XHJcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcihcInNwYW5cIik7XHJcbiAgICAgICAgaWYoc3Bhbil7XHJcbiAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNyZWF0ZShwcmVmaXhJZDogc3RyaW5nLCB0aXRsZTogc3RyaW5nIHwgSFRNTEVsZW1lbnQsIGxpc3Q6IERyb3Bkb3duTWVudUxpc3QsIGluY2x1ZGVDaGV2cm9uSWNvbj86IGJvb2xlYW4sIGNsYXNzZXNLZXk6IHN0cmluZ1tdID0gW10pOiBEcm9wZG93bk1lbnVCdXR0b24ge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihwcmVmaXhJZCArIFV0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKSwgdGl0bGUsIGxpc3QsIGluY2x1ZGVDaGV2cm9uSWNvbik7XHJcbiAgICAgICAgaW5zdGFuY2UuYWRkQ3NzQ2xhc3MoLi4uY2xhc3Nlc0tleSk7XHJcblxyXG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0XCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RJdGVtXCI7XHJcbmltcG9ydCB7IFNWR0ljb24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9jb21tb24vU1ZHSWNvblwiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL3NlcGFyYXRvci9GbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3JcIjtcclxuaW1wb3J0IHsgQnV0dG9uR3JvdXAgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cFwiO1xyXG5pbXBvcnQgeyBCdXR0b25Hcm91cEl0ZW0gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2J1dHRvbi1ncm91cC9CdXR0b25Hcm91cEl0ZW1cIjtcclxuaW1wb3J0IHsgQ29sb3JJY29uIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0NvbG9ySWNvblwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiLi4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51QnV0dG9uXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvYmxvY2stb3BlcmF0aW9ucy9CbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2VsZW1lbnQtZmFjdG9yeS9FbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xyXG5pbXBvcnQgeyBJY29ucyB9IGZyb20gXCJAL2NvbW1vbi9JY29uc1wiO1xyXG5pbXBvcnQgeyBTaXplcyB9IGZyb20gXCJAL2NvbW1vbi9TaXplc1wiO1xyXG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XHJcbmltcG9ydCB7IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IEJ1dHRvbklEcyB9IGZyb20gXCJAL2NvcmUvQnV0dG9uSURzXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duSXRlbUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25JdGVtSURzXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTGlzdElEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25MaXN0SURzXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudUlEcyB9IGZyb20gXCJAL2NvcmUvRHJvcGRvd25NZW51SURzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIge1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IFwiXCJcclxuICAgICAgICBjb25zdCBmbG9hdGluZ0JhciA9IFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZERyb3Bkb3duKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci50dXJuSW50b0Ryb3Bkb3duKCkpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZFNlcGFyYXRvcihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuc2VwYXJhdG9yKFwidHVybkludG9TZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIGZsb2F0aW5nQmFyLmFwcGVuZEJ1dHRvbkdyb3VwKFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idXR0b25Hcm91cCgpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmREcm9wZG93bihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuY29sb3JEcm9wZG93bigpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmRTZXBhcmF0b3IoVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnNlcGFyYXRvcihcInRleHRPcGVyYXRpb25zU2VwYXJhdG9yXCIpKTtcclxuICAgICAgICBmbG9hdGluZ0Jhci5hcHBlbmREcm9wZG93bihUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIubW9yZU9wdGlvbnNEcm9wZG93bigpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZsb2F0aW5nQmFyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0dXJuSW50b0Ryb3Bkb3duKCk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyTGlzdCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KFwidHVybkludG9TZWxlY3RcIik7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9CYXJCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwidHVybkludG9CdXR0b25cIiwgXCJUZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgdHVybkludG9Ecm9wZG93biA9IG5ldyBEcm9wZG93bk1lbnUoXCJ0dXJuSW50b01lbnVcIiwgdHVybkludG9CYXJCdXR0b24sIHR1cm5JbnRvQmFyTGlzdCk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUodHVybkludG9CYXJMaXN0LCBcIlR1cm4gaW50b1wiKSk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25UZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSCwgU1ZHSWNvbnMucGFyYWdyYXBoLmh0bWxFbGVtZW50LCBcIlRleHRcIiwgXCJDdHJsK1NoaWZ0K0VudGVyXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgU1ZHSWNvbnMudG9kb19saXN0Lmh0bWxFbGVtZW50LCBcIlRvZG8gbGlzdFwiLCBcIkN0cmwrMVwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJ1bGxldGVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBTVkdJY29ucy5iX2xpc3QuaHRtbEVsZW1lbnQsIFwiQnVsbGV0ZWQgbGlzdFwiLCBcIkN0cmwrLlwiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbk51bWJlcmVkTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBTVkdJY29ucy5uX2xpc3QuaHRtbEVsZW1lbnQsIFwiTnVtYmVyZWQgbGlzdFwiLCBcIkN0cmwrL1wiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkJsb2NrQ29kZVwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBTVkdJY29ucy5jb2RlLmh0bWxFbGVtZW50LCBcIkJsb2NrIGNvZGVcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25RdW90ZVwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5RVU9URSwgU1ZHSWNvbnMucXVvdGUuaHRtbEVsZW1lbnQsIFwiUXVvdGVcIikpO1xyXG4gICAgICAgIC8vdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmcxXCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBTVkdJY29ucy5oZWFkMS5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDFcIiwgXCJDdHJsK0FsdCsxXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzJcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFNWR0ljb25zLmhlYWQyLmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgMlwiLCBcIkN0cmwrQWx0KzJcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nM1wiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMywgU1ZHSWNvbnMuaGVhZDMuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyAzXCIsIFwiQ3RybCtBbHQrM1wiKSk7XHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvbkhlYWRpbmc0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80LCBTVkdJY29ucy5oZWFkNC5odG1sRWxlbWVudCwgXCJIZWFkaW5nIDRcIiwgXCJDdHJsK0FsdCs0XCIpKTtcclxuICAgICAgICAvL3R1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25IZWFkaW5nNVwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgU1ZHSWNvbnMuaGVhZDUuaHRtbEVsZW1lbnQsIFwiSGVhZGluZyA1XCIsIFwiQ3RybCtBbHQrNVwiKSk7XHJcbiAgICAgICAgLy90dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uSGVhZGluZzZcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzYsIFNWR0ljb25zLmhlYWQ2Lmh0bWxFbGVtZW50LCBcIkhlYWRpbmcgNlwiLCBcIkN0cmwrQWx0KzZcIikpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHVybkludG9Ecm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VwYXJhdG9yKGlkOiBzdHJpbmcpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYnV0dG9uR3JvdXAoKTogQnV0dG9uR3JvdXAge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwQnV0dG9uID0gbmV3IEJ1dHRvbkdyb3VwKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpbmsgPSBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLnRvZ2dsZUxpbmssIFwiTGlua1wiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5MaW5rLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIGxpbmsuc2V0SWQoQnV0dG9uSURzLkxpbmspO1xyXG4gICAgICAgIGxpbmsuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG5cclxuICAgICAgICBjb25zdCBib2xkID0gQnV0dG9uR3JvdXBJdGVtLmNyZWF0ZShDb21tYW5kcy50b2dnbGVCb2xkLCBcIkJvbGRcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuQm9sZCwgU2l6ZXMubGFyZ2UpKTtcclxuICAgICAgICBib2xkLnNldElkKEJ1dHRvbklEcy5Cb2xkKTtcclxuICAgICAgICBib2xkLmFwcGVuZFRvKGdyb3VwQnV0dG9uKTtcclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBpdGFsaWMgPSBCdXR0b25Hcm91cEl0ZW0uY3JlYXRlKENvbW1hbmRzLnRvZ2dsZUl0YWxpYywgXCJJdGFsaWNcIiwgU1ZHSWNvbi5jcmVhdGUoSWNvbnMuSXRhbGljLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIGl0YWxpYy5zZXRJZChCdXR0b25JRHMuSXRhbGljKTtcclxuICAgICAgICBpdGFsaWMuYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHVuZGVybGluZSA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lLCBcIlVuZGVybGluZVwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5VbmRlcmxpbmUsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgdW5kZXJsaW5lLnNldElkKEJ1dHRvbklEcy5VbmRlcmxpbmUpO1xyXG4gICAgICAgIHVuZGVybGluZS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgaW5saW5lQ29kZSA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlSW5saW5lQ29kZSwgXCJDb2RlXCIsIFNWR0ljb24uY3JlYXRlKEljb25zLklubGluZUNvZGUsIFNpemVzLmxhcmdlKSk7XHJcbiAgICAgICAgaW5saW5lQ29kZS5zZXRJZChCdXR0b25JRHMuSW5saW5lQ29kZSk7XHJcbiAgICAgICAgaW5saW5lQ29kZS5hcHBlbmRUbyhncm91cEJ1dHRvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3Qgc3RyaWtldGhyb3VnaCA9IEJ1dHRvbkdyb3VwSXRlbS5jcmVhdGUoQ29tbWFuZHMudG9nZ2xlU3RyaWtlVGhyb3VnaCwgXCJTdHJpa2UtdGhyb3VnaFwiLCBTVkdJY29uLmNyZWF0ZShJY29ucy5TdHJpa2VUaHJvdWdoLCBTaXplcy5sYXJnZSkpO1xyXG4gICAgICAgIHN0cmlrZXRocm91Z2guc2V0SWQoQnV0dG9uSURzLlN0cmlrZXRocm91Z2gpO1xyXG4gICAgICAgIHN0cmlrZXRocm91Z2guYXBwZW5kVG8oZ3JvdXBCdXR0b24pO1xyXG5cclxuICAgICAgICByZXR1cm4gZ3JvdXBCdXR0b247XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNvbG9yRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChEcm9wZG93bkxpc3RJRHMuQ29sb3JUZXh0T3B0aW9uU2VsZWN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckJ1dHRvbiA9IG5ldyBEcm9wZG93bk1lbnVCdXR0b24oXCJjb2xvclRleHRCdXR0b25cIiwgbmV3IENvbG9ySWNvbihcIiNGQUY0RDFcIikuaHRtbEVsZW1lbnQsIGNvbG9yRHJvcGRvd25MaXN0KTtcclxuICAgICAgICBjb25zdCBjb2xvckRyb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShEcm9wZG93bk1lbnVJRHMuQ29sb3JUZXh0T3B0aW9uc01lbnUsIGNvbG9yQnV0dG9uLCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJIaWdobGlnaHRcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblJlZCwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JSZWQsIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yUmVkKS5odG1sRWxlbWVudCwgXCJSZWRcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JSZWQuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkdyZWVuLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvckdyZWVuLCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZWVuKS5odG1sRWxlbWVudCwgXCJHcmVlblwiKTtcclxuICAgICAgICBoaWxpdGVDb2xvckdyZWVuLmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yQmx1ZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbkJsdWUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yQmx1ZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBoaWxpdGVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvblllbGxvdywgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3csIG5ldyBDb2xvckljb24oQ29sb3JzLkhpbGl0ZUNvbG9yWWVsbG93KS5odG1sRWxlbWVudCwgXCJZZWxsb3dcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJoaWxpdGVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGlsaXRlQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKERyb3Bkb3duSXRlbUlEcy5CYWNrZ3JvdW5kT3B0aW9uR3JleSwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmV5LCBuZXcgQ29sb3JJY29uKENvbG9ycy5IaWxpdGVDb2xvckdyZXkpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgaGlsaXRlQ29sb3JHcmV5LmFkZENsYXNzKFwiaGlsaXRlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGhpbGl0ZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShEcm9wZG93bkl0ZW1JRHMuQmFja2dyb3VuZE9wdGlvbk5vbmUsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGhpbGl0ZUNvbG9yTm9uZS5hZGRDbGFzcyhcImhpbGl0ZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JSZWQpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZWVuKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoaGlsaXRlQ29sb3JZZWxsb3cpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvckdyZXkpO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChoaWxpdGVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUoY29sb3JEcm9wZG93bkxpc3QsIFwiVGV4dFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclJlZCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JSZWQsIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBmb3JlQ29sb3JSZWQuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZWVuID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9yR3JlZW4sIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZWVuXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckdyZWVuLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBmb3JlQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY29sb3JPcHRpb25CbHVlXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JCbHVlLCBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFNpemVzLmxhcmdlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGZvcmVDb2xvckJsdWUuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvclllbGxvdyA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IsIENvbG9ycy5Gb3JlQ29sb3JZZWxsb3csIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBmb3JlQ29sb3JZZWxsb3cuYWRkQ2xhc3MoXCJmb3JlQ29sb3JcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcmVDb2xvckdyZXkgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb2xvck9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvciwgQ29sb3JzLkZvcmVDb2xvckdyZXksIG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1mb3JtYXRcIiwgU2l6ZXMubGFyZ2UpLmh0bWxFbGVtZW50LCBcIkdyZXlcIik7XHJcbiAgICAgICAgZm9yZUNvbG9yR3JleS5hZGRDbGFzcyhcImZvcmVDb2xvclwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgZm9yZUNvbG9yTm9uZSA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImNvbG9yT3B0aW9uTm9uZVwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlRm9yZUNvbG9yLCBDb2xvcnMuRm9yZUNvbG9ySW5pdGlhbCwgbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWZvcm1hdFwiLCBTaXplcy5sYXJnZSkuaHRtbEVsZW1lbnQsIFwiTm9uZVwiKTtcclxuICAgICAgICBmb3JlQ29sb3JOb25lLmFkZENsYXNzKFwiZm9yZUNvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yUmVkKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JlZW4pO1xyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChmb3JlQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yWWVsbG93KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoZm9yZUNvbG9yR3JleSk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGZvcmVDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9yZU9wdGlvbnNEcm9wZG93bigpOiBEcm9wZG93bk1lbnUge1xyXG5cclxuICAgICAgICBjb25zdCBpY29uID0gbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLW1vcmVcIiwgU2l6ZXMubGFyZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBtb3JlT3B0aW9uc0xpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcIm1vcmVUZXh0T3B0aW9uU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcIm1vcmVUZXh0T3B0aW9uQnV0dG9uXCIsIGljb24uaHRtbEVsZW1lbnQsIG1vcmVPcHRpb25zTGlzdCwgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IG1vcmVPcHRpb25zRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwibW9yZVRleHRPcHRpb25zTWVudVwiLCBtb3JlT3B0aW9uc0J1dHRvbiwgbW9yZU9wdGlvbnNMaXN0KTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShtb3JlT3B0aW9uc0xpc3QsIFwiTW9yZSBvcHRpb25zXCIpKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJjb3B5T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY29weVNlbGVjdGVkLCBudWxsLCBTVkdJY29ucy5jb3B5Lmh0bWxFbGVtZW50LCBcIkNvcHlcIiwgXCJDdHJsK0NcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiY3V0T3B0aW9uXCIsIG1vcmVPcHRpb25zTGlzdCwgQ29tbWFuZHMuY3V0U2VsZWN0ZWQsIG51bGwsIFNWR0ljb25zLmN1dC5odG1sRWxlbWVudCwgXCJDdXRcIiwgXCJDdHJsK1hcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicGFzdGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5wYXN0LCBudWxsLCBTVkdJY29ucy5wYXN0ZS5odG1sRWxlbWVudCwgXCJSZXBsYWNlXCIsIFwiQ3RybCtWXCIpKTtcclxuICAgICAgICBtb3JlT3B0aW9uc0xpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImR1cGxpY2F0ZU9wdGlvblwiLCBtb3JlT3B0aW9uc0xpc3QsIENvbW1hbmRzLmR1cGxpY2F0ZUJsb2NrLCBudWxsLCBTVkdJY29ucy5kdXBsaWNhdGUuaHRtbEVsZW1lbnQsIFwiQ2xvbmVcIiwgXCJDdHJsK0RcIikpO1xyXG4gICAgICAgIG1vcmVPcHRpb25zTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwicmVzZXRPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5yZW1vdmVGb3JtYXQsIG51bGwsIFNWR0ljb25zLmVyYXNlci5odG1sRWxlbWVudCwgXCJSZXNldCBTdHlsZVwiLCBcIkN0cmwrXFxcXFwiKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZUl0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJkZWxldGVPcHRpb25cIiwgbW9yZU9wdGlvbnNMaXN0LCBDb21tYW5kcy5kZWxldGVCbG9jaywgbnVsbCwgU1ZHSWNvbnMuZGVsZXRlLmh0bWxFbGVtZW50LCBcIkRlbGV0ZVwiLCBcIlNoaWZ0K0RlbFwiKTtcclxuICAgICAgICBkZWxldGVJdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuXHJcbiAgICAgICAgbW9yZU9wdGlvbnNMaXN0LmFwcGVuZChkZWxldGVJdGVtKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1vcmVPcHRpb25zRHJvcGRvd247XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IFNWR0ljb25zOiBhbnkgPSB7XHJcblxyXG4gICAgcGFyYWdyYXBoOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtZm9ybWF0XCIsIFwiMS4yNXJlbVwiKSxcclxuICAgIHRvZG9fbGlzdDogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNoZWNrLWxpc3QtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBiX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBuX2xpc3Q6IG5ldyBTVkdJY29uKFwiaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBjb2RlOiBuZXcgU1ZHSWNvbihcImljb24td29yZHByZXNzLWNvZGUtbWFya1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBxdW90ZTogbmV3IFNWR0ljb24oXCJpY29uLXdvcmRwcmVzcy1xdW90ZVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtMlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkMzogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtM1wiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNDogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNFwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNTogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNVwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBoZWFkNjogbmV3IFNWR0ljb24oXCJpY29uLWp1bGlhLWhlYWQtNlwiLCBTaXplcy5sYXJnZSksXHJcbiAgICBkdXBsaWNhdGU6IG5ldyBTVkdJY29uKFwiaWNvbi1tYXRlcmlhbC1kdXBsaWNhdGVcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZGVsZXRlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtdHJhc2hcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgZXJhc2VyOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY2xlYXJcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY29weTogbmV3IFNWR0ljb24oXCJpY29uLW1hdGVyaWFsLWNvcHlcIiwgU2l6ZXMubGFyZ2UpLFxyXG4gICAgY3V0OiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtY3V0XCIsIFNpemVzLmxhcmdlKSxcclxuICAgIHBhc3RlOiBuZXcgU1ZHSWNvbihcImljb24tbWF0ZXJpYWwtcGFzdGVcIiwgU2l6ZXMubGFyZ2UpXHJcbn0iLCJpbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVFbXB0eSBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVtcHR5SW5kaWNhdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG5cclxuICAgICAgICBodG1sRW1wdHlJbmRpY2F0b3IuaW5uZXJUZXh0ID0gJ05vIHJlc3VsdHMnO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5jbGFzc0xpc3QuYWRkKCdlbXB0eS1ibG9jay1vcHRpb25zJyk7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCc7XHJcbiAgICAgICAgaHRtbEVtcHR5SW5kaWNhdG9yLnN0eWxlLmNvbG9yID0gJ3JnYmEoNTUsIDUzLCA0NywgMC42NSknO1xyXG4gICAgICAgIGh0bWxFbXB0eUluZGljYXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVtcHR5SW5kaWNhdG9yO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUXVpY2tNZW51U2VjdGlvbiB9IGZyb20gJy4vUXVpY2tNZW51U2VjdGlvbic7XG5pbXBvcnQgeyBRdWlja01lbnVFbXB0eSB9IGZyb20gJy4vUXVpY2tNZW51RW1wdHknO1xuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gJy4vUXVpY2tNZW51SXRlbSc7XG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcbmltcG9ydCB7IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9DaXJjdWxhckRvdWJseUxpbmtlZExpc3QnO1xuaW1wb3J0IHsgSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0lCbG9ja09wZXJhdGlvbnNTZXJ2aWNlJztcbmltcG9ydCB7IEpOb2RlIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9KTm9kZVwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gJ0AvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyJztcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSAnQC9jb3JlL0lGb2N1c1N0YWNrJztcbmltcG9ydCB7IElRdWlja01lbnUgfSBmcm9tICcuL0lRdWlja01lbnUnO1xuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gJ0AvY29tbWFuZHMvSUNvbW1hbmRFdmVudERldGFpbCc7XG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tICdAL2NvbW1vbi9DdXN0b21FdmVudHMnO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSAnQC91dGlsaXRpZXMvRE9NVXRpbHMnO1xuaW1wb3J0IHsgRE9NRWxlbWVudHMgfSBmcm9tICdAL2NvbW1vbi9ET01FbGVtZW50cyc7XG5pbXBvcnQgeyBaSW5kZXggfSBmcm9tICdAL2NvbW1vbi9aSW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51IGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IGltcGxlbWVudHMgSVF1aWNrTWVudSB7XG5cbiAgICBzdGF0aWMgaWQgPSBcInF1aWNrTWVudVwiO1xuXG4gICAgcHJpdmF0ZSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgY3VycmVudEZvY3VzZWRNZW51SXRlbTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsO1xuXG4gICAgLy8gcHJpdmF0ZSBodG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSBtZW51U2VjdGlvbnM6IENpcmN1bGFyRG91Ymx5TGlua2VkTGlzdDxRdWlja01lbnVTZWN0aW9uPjtcbiAgICBwcml2YXRlIHF1aWNrTWVudUVtcHR5OiBRdWlja01lbnVFbXB0eTtcbiAgICBwcml2YXRlIGZpbHRlcklucHV0OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUXVpY2tNZW51IHwgbnVsbDtcblxuICAgIHByaXZhdGUgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKGJsb2NrT3BlcmF0aW9uc1NlcnZpY2U6IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLCBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaykge1xuXG4gICAgICAgIHN1cGVyKHt9KTtcblxuICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0gPSBudWxsO1xuICAgICAgICAvLyB0aGlzLmh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUgPSBudWxsO1xuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucyA9IG5ldyBDaXJjdWxhckRvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51U2VjdGlvbj4oKTtcbiAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eSA9IG5ldyBRdWlja01lbnVFbXB0eSgpO1xuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuXG4gICAgICAgIC8vVE9ETzogR28gYmFjayBoZXJlXG4gICAgICAgIC8vIGxldCBibG9ja09wdGlvbnMgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibG9jay1vcHRpb25zJykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gdGhpcy5xdWlja01lbnVFbXB0eS5hcHBlbmRUbyhibG9ja09wdGlvbnMpO1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xuXG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuICAgIH1cblxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGh0bWxFbGVtZW50LmlkID0gUXVpY2tNZW51LmlkO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguU2xpZ2h0bHlJbXBvcnRhbnQ7XG5cbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucy13cmFwcGVyJywgJ3NvZnQtYm94LXNoYWRvdycpO1xuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGNvbnN0IGJsb2NrT3B0aW9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBibG9ja09wdGlvbnMuY2xhc3NMaXN0LmFkZCgnYmxvY2stb3B0aW9ucycpO1xuICAgICAgICBibG9ja09wdGlvbnMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGJsb2NrT3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xuICAgIH1cblxuICAgIGFwcGVuZChtZW51SXRlbTogUXVpY2tNZW51U2VjdGlvbik6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucy5hcHBlbmQobWVudUl0ZW0pO1xuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibG9jay1vcHRpb25zJykhLmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFF1aWNrTWVudSB7XG5cbiAgICAgICAgY29uc3QgYmxvY2tPcGVyYXRpb25TZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlPihcIklCbG9ja09wZXJhdGlvbnNTZXJ2aWNlXCIpO1xuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuXG4gICAgICAgIGlmICghUXVpY2tNZW51Lmluc3RhbmNlKSB7XG4gICAgICAgICAgICBRdWlja01lbnUuaW5zdGFuY2UgPSBuZXcgUXVpY2tNZW51KGJsb2NrT3BlcmF0aW9uU2VydmljZSwgZm9jdXNTdGFjayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUXVpY2tNZW51Lmluc3RhbmNlO1xuICAgIH1cblxuICAgIHN3aXRjaFZpc3VhbEZvY3VzKGl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+KTogdm9pZCB7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9PSBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0udmFsdWUucmVtb3ZlRm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5mb2N1cygpO1xuXG4gICAgICAgIC8vIHRoaXMuaHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudT8uZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBmaXJzdFNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5nZXRGaXJzdCgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50U2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IGZpcnN0U2VjdGlvbk5vZGU7XG5cbiAgICAgICAgd2hpbGUgKGN1cnJlbnRTZWN0aW9uTm9kZSkge1xuXG4gICAgICAgICAgICBjb25zdCBpdGVtTm9kZTogSk5vZGU8UXVpY2tNZW51SXRlbT4gfCBudWxsID0gY3VycmVudFNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kRmlyc3QoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtTm9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoVmlzdWFsRm9jdXMoaXRlbU5vZGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudFNlY3Rpb25Ob2RlID0gY3VycmVudFNlY3Rpb25Ob2RlLm5leHROb2RlO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb25Ob2RlID09IGZpcnN0U2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICBwcmV2aW91c1Zpc2libGVJdGVtID0gdGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLmdldFByZXZpb3VzU2F0aXNmeWluZyhpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghcHJldmlvdXNWaXNpYmxlSXRlbSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzVmlzaWJsZVNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kKHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbS52YWx1ZS5pbW1lZGlhdGVQYXJlbnQpIS5nZXRQcmV2aW91c1NhdGlzZnlpbmcoc2VjdGlvbiA9PiBzZWN0aW9uLmlzVmlzaWJsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzVmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IHByZXZpb3VzVmlzaWJsZVNlY3Rpb25Ob2RlLnZhbHVlLm1lbnVJdGVtcy5maW5kTGFzdChpdGVtID0+IGl0ZW0uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlOiBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiB8IG51bGwgPSB0aGlzLm1lbnVTZWN0aW9ucy5maW5kTGFzdChzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcblxuICAgICAgICAgICAgaWYgKCFsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNWaXNpYmxlSXRlbSA9IGxhc3RWaXNpYmxlU2VjdGlvbk5vZGUudmFsdWUubWVudUl0ZW1zLmZpbmRMYXN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3dpdGNoVmlzdWFsRm9jdXMocHJldmlvdXNWaXNpYmxlSXRlbSEpO1xuICAgIH1cblxuICAgIGZvY3VzTmV4dFZpc2libGVJdGVtKCk6IHZvaWQge1xuXG4gICAgICAgIGxldCBuZXh0VmlzaWJsZUl0ZW06IEpOb2RlPFF1aWNrTWVudUl0ZW0+IHwgbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtKSB7XG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSB0aGlzLmN1cnJlbnRGb2N1c2VkTWVudUl0ZW0uZ2V0TmV4dFNhdGlzZnlpbmcoaXRlbSA9PiBpdGVtLmlzVmlzaWJsZSk7XG4gICAgICAgICAgICBpZiAoIW5leHRWaXNpYmxlSXRlbSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IG5leHRWaXNpYmxlU2VjdGlvbk5vZGU6IEpOb2RlPFF1aWNrTWVudVNlY3Rpb24+IHwgbnVsbCA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmQodGhpcy5jdXJyZW50Rm9jdXNlZE1lbnVJdGVtLnZhbHVlLmltbWVkaWF0ZVBhcmVudCkhLmdldE5leHRTYXRpc2Z5aW5nKHNlY3Rpb24gPT4gc2VjdGlvbi5pc1Zpc2libGUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0VmlzaWJsZVNlY3Rpb25Ob2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV4dFZpc2libGVJdGVtID0gbmV4dFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZEZpcnN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGU6IG51bGwgfCBKTm9kZTxRdWlja01lbnVTZWN0aW9uPiA9IHRoaXMubWVudVNlY3Rpb25zLmZpbmRGaXJzdChzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKTtcbiAgICAgICAgICAgIGlmICghZmlyc3RWaXNpYmxlU2VjdGlvbk5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0VmlzaWJsZUl0ZW0gPSBmaXJzdFZpc2libGVTZWN0aW9uTm9kZS52YWx1ZS5tZW51SXRlbXMuZmluZEZpcnN0KGl0ZW0gPT4gaXRlbS5pc1Zpc2libGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zd2l0Y2hWaXN1YWxGb2N1cyhuZXh0VmlzaWJsZUl0ZW0hKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJJdGVtcygpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbnVTZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICAgICAgc2VjdGlvbi5maWx0ZXJTZWN0aW9uKHRoaXMuZmlsdGVySW5wdXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMubWVudVNlY3Rpb25zLmFueShzZWN0aW9uID0+IHNlY3Rpb24uaXNWaXNpYmxlKSkge1xuICAgICAgICAgICAgdGhpcy5xdWlja01lbnVFbXB0eS5zaG93KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnF1aWNrTWVudUVtcHR5LmhpZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0oKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAgICAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBkaXNwbGF5IHRoZSBxdWlja01lbnU6IG5vIGFjdGl2ZSBlbGVtZW50IGZvdW5kLiBQbGVhc2UgZW5zdXJlIGFuIGVsZW1lbnQgaXMgZm9jdXNlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byBkaXNwbGF5IHRoZSBxdWlja01lbnUuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChhY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIFxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lbmh1bWEgc2VsZcOnw6NvIGVuY29udHJhZGEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgbGV0IGxlZnRQb3NpdGlvbiA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYO1xuICAgICAgICBcbiAgICAgICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRQb3NpdGlvbiA9IHdpbmRvdy5pbm5lcldpZHRoIC0gZWxlbWVudFdpZHRoIC0gMjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgbGV0IHRvcFBvc2l0aW9uID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xuICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnRQb3NpdGlvbn1weGA7XG4gICAgICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcbiAgICAgICAgXG4gICAgICAgICAgICBzdXBlci5zaG93KCk7XG4gICAgICAgIFxuICAgICAgICAgICAgdGhpcy5mb2N1c09uVGhlRmlyc3RWaXNpYmxlSXRlbSgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcbiAgICAgICAgXG4gICAgICAgIH0sIDEwKTtcblxuICAgIH1cblxuICAgIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVySW5wdXQgPSBcIlwiO1xuXG4gICAgICAgIHRoaXMubWVudVNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgICAgICBzZWN0aW9uLnJlc3RvcmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcblxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uZm9jdXMoKTtcbiAgICAgICAgLy8gdGhpcy5odG1sRm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuUXVpY2tNZW51Py5mb2N1cygpO1xuXG4gICAgICAgIHN1cGVyLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50cygpIHtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwgKChldmVudDogQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgY29tbWFuZCB9ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pIGFzIEV2ZW50TGlzdGVuZXIpO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJy8nICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmIGJsb2NrKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHNob3cgcXVpY2tNZW51XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoXCIuaWdub3JlLXF1aWNrLW1lbnVcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c05leHRWaXNpYmxlSXRlbSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdBcnJvd1VwJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzVmlzaWJsZUl0ZW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgL15bYS16MC05IF0kL2kudGVzdChldmVudC5rZXkpICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25jYXRGaWx0ZXJJbnB1dChldmVudC5rZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2libGUgJiYgZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJykge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVySW5wdXQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSAmJiBldmVudC5rZXkgPT09ICdFc2NhcGUnICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgIShldmVudC50YXJnZXQhIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KGAjJHt0aGlzLmh0bWxFbGVtZW50LmlkfWApKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmFsdEtleSkge1xuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrVHlwZSA9IHRoaXMuY3VycmVudEZvY3VzZWRNZW51SXRlbT8udmFsdWUuYmxvY2tUeXBlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudShibG9ja1R5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuYmxvY2tUeXBlQ2hhbmdlZCwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBlbWl0Q29tbWFuZEV2ZW50KGJsb2NrVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYmxvY2tUeXBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybUh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUoYmxvY2tUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBpZiAoYmxvY2tUeXBlKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudChibG9ja1R5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcy5oaWRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25jYXRGaWx0ZXJJbnB1dChzdGc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlcklucHV0ICs9IHN0Zy50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGFzdEZpbHRlcklucHV0Q2hhcmFjdGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJJbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcklucHV0ID0gdGhpcy5maWx0ZXJJbnB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgQmFzZURvdWJseUxpbmtlZExpc3QgfSBmcm9tICcuL0Jhc2VEb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tICcuL0pOb2RlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3VibHlMaW5rZWRMaXN0PFQ+IGV4dGVuZHMgQmFzZURvdWJseUxpbmtlZExpc3Q8VD4ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwZW5kKGVsZW1lbnQ6IFQpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBKTm9kZShlbGVtZW50LCB0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWQgfHwgIXRoaXMudGFpbCkge1xyXG4gICAgICAgICAgICB0aGlzLmhlYWQgPSBub2RlO1xyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFpbC5zZXROZXh0KG5vZGUpO1xyXG4gICAgICAgICAgICBub2RlLnNldFByZXZpb3VzKHRoaXMudGFpbCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRhaWwgPSBub2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcclxuICAgIH1cclxufSIsImltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vUXVpY2tNZW51JztcclxuaW1wb3J0IHsgUXVpY2tNZW51SXRlbSB9IGZyb20gXCIuL1F1aWNrTWVudUl0ZW1cIjtcclxuaW1wb3J0IHsgRG91Ymx5TGlua2VkTGlzdCB9IGZyb20gJy4uLy4uL2NvbW1vbi9Eb3VibHlMaW5rZWRMaXN0JztcclxuaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51U2VjdGlvbiBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnU7XHJcblxyXG4gICAgbWVudUl0ZW1zID0gbmV3IERvdWJseUxpbmtlZExpc3Q8UXVpY2tNZW51SXRlbT4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBRdWlja01lbnVTZWN0aW9uT3B0aW9ucykge1xyXG5cclxuICAgICAgICBzdXBlcih7XHJcbiAgICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICAgICAgICBjbGFzc0xpc3Q6IG9wdGlvbnMuY2xhc3NMaXN0XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW1tZWRpYXRlUGFyZW50ID0gb3B0aW9ucy5xdWlja01lbnVJbnN0YW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuXHJcbiAgICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLnByb3BzLmNsYXNzTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xyXG4gICAgICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSB0aGlzLnByb3BzLnRpdGxlO1xyXG4gICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZChcIm5vLXNlbGVjdGlvblwiKTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhcHBlbmRRdWlja01lbnVJdGVtcyhtZW51SXRlbXM6IFF1aWNrTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cclxuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kUXVpY2tNZW51SXRlbShpdGVtKVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGVuZFF1aWNrTWVudUl0ZW0obWVudUl0ZW06IFF1aWNrTWVudUl0ZW0pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMuYXBwZW5kKG1lbnVJdGVtKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG1lbnVJdGVtLmh0bWxFbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXJTZWN0aW9uKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLnJlc3RvcmUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHQgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuZm9yRWFjaChtZW51SXRlbSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCEobWVudUl0ZW0uZmlsdGVyVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF0TGVhZE9uZUl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5hbnkoaXRlbSA9PiBpdGVtLmZpbHRlclZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGV4dCkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFhdExlYWRPbmVJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXN0b3JlKCkge1xyXG4gICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IHtcclxuICAgICAgICAgICAgbWVudUl0ZW0uc2hvdygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrTWVudVNlY3Rpb25PcHRpb25zIHtcclxuICAgIHF1aWNrTWVudUluc3RhbmNlOiBRdWlja01lbnU7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgY2xhc3NMaXN0OiBzdHJpbmc7XHJcbn0iLCJpbXBvcnQgeyBTVkdJY29uIH0gZnJvbSAnLi4vY29tbW9uL1NWR0ljb24nO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50JztcclxuaW1wb3J0IHsgSk5vZGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0pOb2RlXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudVNlY3Rpb24gfSBmcm9tICcuL1F1aWNrTWVudVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBJQ29tbWFuZEV2ZW50RGV0YWlsIH0gZnJvbSAnQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsJztcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSAnQC9jb21tb24vQ3VzdG9tRXZlbnRzJztcclxuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tICdAL2NvbW1hbmRzL0NvbW1hbmRzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWlja01lbnVJdGVtIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBwcml2YXRlIF9ibG9ja1R5cGU6IHN0cmluZztcclxuICAgIHByaXZhdGUgX2ZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIF9pbW1lZGlhdGVQYXJlbnQ6IFF1aWNrTWVudVNlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW1tZWRpYXRlUGFyZW50OiBRdWlja01lbnVTZWN0aW9uLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpY29uSWQ6IHN0cmluZywgYmxvY2tUeXBlOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgaWNvbklkOiBpY29uSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYmxvY2tUeXBlID0gYmxvY2tUeXBlO1xyXG4gICAgICAgIHRoaXMuX2ZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgdGhpcy5faW1tZWRpYXRlUGFyZW50ID0gaW1tZWRpYXRlUGFyZW50O1xyXG5cclxuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29wdGlvbicsICdvcHRpb24taG92ZXInLCAnYmxvY2stb3BlcmF0aW9uJywgXCJwb2ludGVyXCIsIFwibm8tc2VsZWN0aW9uXCIpO1xyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmxvY2stb3BlcmF0aW9uJywgJ2FwcGx5LXNlbGVjdGVkLWJsb2NrLXR5cGUnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcclxuICAgICAgICBodG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnb3B0aW9uJyk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG9wdGlvbkltYWdlLmNsYXNzTGlzdC5hZGQoJ29wdGlvbi1pbWFnZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzdmcgPSBuZXcgU1ZHSWNvbih0aGlzLnByb3BzLmljb25JZCwgJzEwMCUnKTtcclxuXHJcbiAgICAgICAgb3B0aW9uSW1hZ2UuYXBwZW5kQ2hpbGQoc3ZnLmh0bWxFbGVtZW50KTtcclxuXHJcbiAgICAgICAgaHRtbEVsZW1lbnQuYXBwZW5kQ2hpbGQob3B0aW9uSW1hZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgb3B0aW9uVGV4dC5jbGFzc0xpc3QuYWRkKCdvcHRpb24tdGV4dCcpO1xyXG5cclxuICAgICAgICBjb25zdCBibG9ja1RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xyXG4gICAgICAgIGJsb2NrVGl0bGUuY2xhc3NMaXN0LmFkZCgnYmxvY2stdGl0bGUnKTtcclxuICAgICAgICBibG9ja1RpdGxlLmlubmVyVGV4dCA9IHRoaXMucHJvcHMudGl0bGU7XHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tUaXRsZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrRGVzY3JpcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XHJcbiAgICAgICAgYmxvY2tEZXNjcmlwdGlvbi5jbGFzc0xpc3QuYWRkKCdibG9jay1kZXNjcmlwdGlvbicpO1xyXG4gICAgICAgIGJsb2NrRGVzY3JpcHRpb24uaW5uZXJUZXh0ID0gdGhpcy5wcm9wcy5kZXNjcmlwdGlvbjtcclxuXHJcblxyXG4gICAgICAgIG9wdGlvblRleHQuYXBwZW5kQ2hpbGQoYmxvY2tEZXNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKG9wdGlvblRleHQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc3BsYXkoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gJ2ZsZXgnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmaWx0ZXJWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW1tZWRpYXRlUGFyZW50ICgpOiBRdWlja01lbnVTZWN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW1tZWRpYXRlUGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBibG9ja1R5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGZvY3VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnb3B0aW9uLWZvY3VzZWQnKTtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcHRpb24tZm9jdXNlZCcpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBlbWl0Q29tbWFuZEV2ZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuYmxvY2tUeXBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsICgpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEpOb2RlPFF1aWNrTWVudUl0ZW0+ID0gdGhpcy5faW1tZWRpYXRlUGFyZW50Lm1lbnVJdGVtcy5maW5kKHRoaXMpITtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2ltbWVkaWF0ZVBhcmVudC5pbW1lZGlhdGVQYXJlbnQuc3dpdGNoVmlzdWFsRm9jdXMobm9kZSEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdENvbW1hbmRFdmVudCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgUXVpY2tNZW51IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVcIjtcclxuaW1wb3J0IHsgUXVpY2tNZW51U2VjdGlvbiB9IGZyb20gXCIuLi9jb21wb25lbnRzL3F1aWNrLW1lbnUvUXVpY2tNZW51U2VjdGlvblwiO1xyXG5pbXBvcnQgeyBRdWlja01lbnVJdGVtIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvcXVpY2stbWVudS9RdWlja01lbnVJdGVtXCI7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEljb25zIH0gZnJvbSBcIkAvY29tbW9uL0ljb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVpY2tNZW51QnVpbGRlciB7XHJcblxyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFF1aWNrTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHF1aWNrTWVudTogUXVpY2tNZW51ID0gUXVpY2tNZW51LmdldEluc3RhbmNlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGJhc2ljQmxvY2tzU2VjdGlvbjogUXVpY2tNZW51U2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdCYXNpYycsIGNsYXNzTGlzdDogJ2Jhc2ljLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBiYXNpY0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdUZXh0JywgJ1N0YXJ0IHdyaXRpbmcgaW4gcGxhaW4gdGV4dC4nLCAnaWNvbi1tYXRlcmlhbC1mb3JtYXQnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFwicGFyYWdyYXBoIHRleHQgcFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQnVsbGV0ZWQgbGlzdCcsICdPcmdhbml6ZSBpdGVtcyB3aXRoIGJ1bGxldCBwb2ludHMuJywgJ2ljb24td29yZHByZXNzLWJ1bGxldGVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNULCBcImJ1bGxldGVkIGxpc3QgdW5vcmRlcmVkIGxpc3QgdWxcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ051bWJlcmVkIGxpc3QnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLk5VTUJFUkVEX0xJU1QsIFwibnVtYmVyZWQgbGlzdCBudW1iZXIgbGlzdCBzZXF1ZW50aWFsIGxpc3Qgb2wgZW51bWVyYXRlZCBsaXN0IG9yZGVyZWQgbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnVGFibGUnLCAnT3JnYW5pemUgZGF0YSBpbiByb3dzIGFuZCBjb2x1bW5zLicsICdpY29uLW1hdGVyaWFsLXRhYmxlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVEFCTEUsIFwidGFibGUgdHIgdGhcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ0NhbGxvdXQnLCAnRW1waGFzaXplIGtleSBwb2ludHMgd2l0aCBhIGNhbGxvdXQgYm94LicsIEljb25zLkNhbGxvdXQsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNBTExPVVQsIFwiY2FsbG91dCBub3RlIHNwb3RsaWdodFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnQ29kZScsICdJbmNsdWRlIGEgY29kZSBzbmlwcGV0LicsICdpY29uLXdvcmRwcmVzcy1jb2RlLW1hcmsnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFLCBcImNvZGUgc2NyaXB0IHNvdXJjZSBtYXJrdXBcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGJhc2ljQmxvY2tzU2VjdGlvbiwgJ1F1b3RlJywgJ0hpZ2hsaWdodCB0ZXh0IGFzIGEgcXVvdGUuJywgJ2ljb24td29yZHByZXNzLXF1b3RlJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUsIFwicXVvdGUgYmxvY2txdW90ZSBjaXRhdGlvbiBxdW90YXRpb24gY2l0ZVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAyJywgJ01lZGl1bSBoZWFkZXIgZm9yIHNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yLCBcImhlYWRlciAyIGhlYWRpbmcgMiBoMlwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oYmFzaWNCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyAzJywgJ1NtYWxsIGhlYWRlciBmb3Igc3Vic2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzMsIFwiaGVhZGVyIDMgaGVhZGluZyAzIGgzXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShiYXNpY0Jsb2Nrc1NlY3Rpb24sICdTZXBhcmF0b3InLCAnVmlzdWFsbHkgZGl2aWRlIGJsb2Nrcy4nLCAnaWNvbi13b3JkcHJlc3Mtc2VwYXJhdG9yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuU0VQQVJBVE9SLCBcInNlcGFyYXRvciBkaXZpZGVyIHJ1bGUgbGluZSBoclwiKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICBxdWlja01lbnUuYXBwZW5kKGJhc2ljQmxvY2tzU2VjdGlvbik7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdNZWRpYScsIGNsYXNzTGlzdDogJ21lZGlhLXNlY3Rpb24nIH0pO1xyXG5cclxuICAgICAgICBtZWRpYUJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdJbWFnZScsICdVcGxvYWQgb3IgZW1iZWQgYW4gaW1hZ2UuJywgSWNvbnMuSW1hZ2UyLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5JTUFHRSwgXCJpbWFnZSBmaWd1cmUgcGhvdG8gaWxsdXN0cmF0aW9uIHBpY3R1cmUgbWVkaWEgdXBsb2FkXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShtZWRpYUJsb2Nrc1NlY3Rpb24sICdZb3VUdWJlJywgJ0VtYmVkIGEgWW91VHViZSB2aWRlby4nLCBJY29ucy5Zb3VUdWJlLCAndmlkZW8nLCBcInZpZGVvIGVtYmVkIHlvdXR1YmUgY2xpcCBmaWxtIG1vdmllIHRhcGVcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChtZWRpYUJsb2Nrc1NlY3Rpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkaW5nQmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdIZWFkaW5nJywgY2xhc3NMaXN0OiAnaGVhZGluZy1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgaGVhZGluZ0Jsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMScsICdMYXJnZSBoZWFkZXIgZm9yIG1haW4gdG9waWNzLicsICdpY29uLWp1bGlhLWhlYWQtMScsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xLCBcImhlYWRlciAxIGhlYWRpbmcgMSBoMVwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDInLCAnTWVkaXVtIGhlYWRlciBmb3Igc2VjdGlvbnMuJywgJ2ljb24tanVsaWEtaGVhZC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzIsIFwiaGVhZGVyIDIgaGVhZGluZyAyIGgyXCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgMycsICdTbWFsbCBoZWFkZXIgZm9yIHN1YnNlY3Rpb25zLicsICdpY29uLWp1bGlhLWhlYWQtMycsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8zLCBcImhlYWRlciAzIGhlYWRpbmcgMyBoM1wiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0oaGVhZGluZ0Jsb2Nrc1NlY3Rpb24sICdIZWFkaW5nIDQnLCAnRGV0YWlsZWQgaGVhZGVyIGZvciBzdWJ0b3BpY3MuJywgJ2ljb24tanVsaWEtaGVhZC00JywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzQsIFwiaGVhZGVyIDQgaGVhZGluZyA0IGg0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShoZWFkaW5nQmxvY2tzU2VjdGlvbiwgJ0hlYWRpbmcgNScsICdNaW5vciBoZWFkZXIgZm9yIHNwZWNpZmljcy4nLCAnaWNvbi1qdWxpYS1oZWFkLTUnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSwgXCJoZWFkZXIgNSBoZWFkaW5nIDUgaDVcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGhlYWRpbmdCbG9ja3NTZWN0aW9uLCAnSGVhZGluZyA2JywgJ1NtYWxsZXN0IGhlYWRlciBmb3IgZmluZSBkZXRhaWxzLicsICdpY29uLWp1bGlhLWhlYWQtNicsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl82LCBcImhlYWRlciA2IGhlYWRpbmcgNiBoNlwiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChoZWFkaW5nQmxvY2tzU2VjdGlvbik7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBsaXN0QmxvY2tzU2VjdGlvbiA9IG5ldyBRdWlja01lbnVTZWN0aW9uKHsgcXVpY2tNZW51SW5zdGFuY2U6IHF1aWNrTWVudSwgdGl0bGU6ICdMaXN0JywgY2xhc3NMaXN0OiAnbGlzdC1zZWN0aW9uJyB9KTtcclxuXHJcbiAgICAgICAgbGlzdEJsb2Nrc1NlY3Rpb24uYXBwZW5kUXVpY2tNZW51SXRlbXMoW1xyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShsaXN0QmxvY2tzU2VjdGlvbiwgJ1RvZG8gbGlzdCcsICdUcmFjayB0YXNrcyB3aXRoIGNoZWNrYm94ZXMuJywgJ2ljb24tbWF0ZXJpYWwtY2hlY2stbGlzdC0yJywgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0hFQ0tfTElTVCwgXCJ0b2RvIGxpc3QgdGFzayBsaXN0IGNoZWNrbGlzdFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdCdWxsZXRlZCBsaXN0JywgJ09yZ2FuaXplIGl0ZW1zIHdpdGggYnVsbGV0IHBvaW50cy4nLCAnaWNvbi13b3JkcHJlc3MtYnVsbGV0ZWQtbGlzdCcsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1QsIFwiYnVsbGV0ZWQgbGlzdCB1bm9yZGVyZWQgbGlzdCB1bFwiKSxcclxuICAgICAgICAgICAgbmV3IFF1aWNrTWVudUl0ZW0obGlzdEJsb2Nrc1NlY3Rpb24sICdOdW1iZXJlZCBsaXN0JywgJ0xpc3QgaXRlbXMgaW4gYSBudW1iZXJlZCBmb3JtYXQuJywgJ2ljb24td29yZHByZXNzLW51bWJlcmVkLWxpc3QnLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIilcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChsaXN0QmxvY2tzU2VjdGlvbik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZW1iZWRTZWN0aW9uID0gbmV3IFF1aWNrTWVudVNlY3Rpb24oeyBxdWlja01lbnVJbnN0YW5jZTogcXVpY2tNZW51LCB0aXRsZTogJ0VtYmVkJywgY2xhc3NMaXN0OiAnZW1iZWQtc2VjdGlvbicgfSk7XHJcblxyXG4gICAgICAgIGVtYmVkU2VjdGlvbi5hcHBlbmRRdWlja01lbnVJdGVtcyhbXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdEh1YiBHaXN0JywgJ0VtYmVkIGEgR2l0SHViIEdpc3QuJywgSWNvbnMuR2l0SHViLCAnZ2l0aHViLWdpc3QnLCBcImNvZGUgZ2lzdCBnaXRodWIgc25pcHBldCBnaXRcIiksXHJcbiAgICAgICAgICAgIC8vIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ0dpdExhYiBTbmlwcGV0ICcsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsIEljb25zLkdpdExhYiwgJ2dpdGxhYi1zbmlwcGV0JywgXCJjb2RlIGdpdCBnaXRsYWIgc25pcHBldCBnaXN0XCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHaXRMYWIgU25pcHBldCAnLCAnTGlzdCBpdGVtcyBpbiBhIG51bWJlcmVkIGZvcm1hdC4nLCAnaWNvbi13b3JkcHJlc3MtbnVtYmVyZWQtbGlzdCcsICdudW1iZXJlZC1saXN0JywgXCJudW1iZXJlZCBsaXN0IG51bWJlciBsaXN0IHNlcXVlbnRpYWwgbGlzdCBvbCBlbnVtZXJhdGVkIGxpc3Qgb3JkZXJlZCBsaXN0XCIpLFxyXG4gICAgICAgICAgICBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdDb2RlUGVuJywgJ0VtYmVkIGEgQ29kZVBlbiB3ZWIgZGVtby4nLCBJY29ucy5Db2RlUGVuLCAnY29kZXBlbicsIFwiY29kZSBjb2RlcGVuXCIpLFxyXG4gICAgICAgICAgICAvLyBuZXcgUXVpY2tNZW51SXRlbShlbWJlZFNlY3Rpb24sICdHb29nbGUgTWFwcycsICdMaXN0IGl0ZW1zIGluIGEgbnVtYmVyZWQgZm9ybWF0LicsICdpY29uLXdvcmRwcmVzcy1udW1iZXJlZC1saXN0JywgJ251bWJlcmVkLWxpc3QnLCBcIm51bWJlcmVkIGxpc3QgbnVtYmVyIGxpc3Qgc2VxdWVudGlhbCBsaXN0IG9sIGVudW1lcmF0ZWQgbGlzdCBvcmRlcmVkIGxpc3RcIiksXHJcbiAgICAgICAgICAgIG5ldyBRdWlja01lbnVJdGVtKGVtYmVkU2VjdGlvbiwgJ1Nwb3RpZnknLCAnRW1iZWQgYSBTcG90aWZ5IGF1ZGlvIHRyYWNrLicsIEljb25zLlNwb3RpZnksICdzcG90aWZ5JywgXCJtcDMgc291bmQgYXVkaW8gbXVzaWMgc3BvdGlmeSB0cmFja1wiKSxcclxuICAgICAgICBdKTtcclxuXHJcbiAgICAgICAgcXVpY2tNZW51LmFwcGVuZChlbWJlZFNlY3Rpb24pO1xyXG5cclxuICAgICAgICByZXR1cm4gcXVpY2tNZW51O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQmFzZVVJQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1vbi9CYXNlVUlDb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgQmFzZVVJQ29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHtcclxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpOiBIVE1MRWxlbWVudCB7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBodG1sRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidGl0bGVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImgxXCIpO1xyXG4gICAgICAgIGgxLnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcInRydWVcIik7XHJcbiAgICAgICAgaDEuc2V0QXR0cmlidXRlKFwiZGF0YS1wbGFjZWhvbGRlclwiLCBcIlVudGl0bGVkXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSkge1xyXG4gICAgICAgICAgICBoMS50ZXh0Q29udGVudCA9IHRoaXMucHJvcHMudmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBodG1sRWxlbWVudC5hcHBlbmRDaGlsZChoMSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodG1sRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgY3JlYXRlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSh2YWx1ZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAL2NvbXBvbmVudHMvdGl0bGUvVGl0bGVcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaXRsZUJ1aWxkZXIge1xyXG4gICAgc3RhdGljIGJ1aWxkKCk6IFRpdGxlIHtcclxuICAgICAgICByZXR1cm4gVGl0bGUuY3JlYXRlKHdpbmRvdy5lZGl0b3JDb25maWc/LnRpdGxlKVxyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIGtleWJvYXJkIGFycm93IGRpcmVjdGlvbnMuXHJcbiAqIEBlbnVtIHtzdHJpbmd9XHJcbiAqL1xyXG5leHBvcnQgZW51bSBEaXJlY3Rpb25zIHtcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dVcCcga2V5LCB1c2VkIHRvIG5hdmlnYXRlIHVwd2FyZHMgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93VXAgPSBcIkFycm93VXBcIixcclxuICAgIC8qKiBSZXByZXNlbnRzIHRoZSAnQXJyb3dEb3duJyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgZG93bndhcmRzIGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0Rvd24gPSBcIkFycm93RG93blwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd0xlZnQnIGtleSwgdXNlZCB0byBuYXZpZ2F0ZSBsZWZ0IGluIHRoZSBFZGl0b3IuICovXHJcbiAgICBBcnJvd0xlZnQgPSBcIkFycm93TGVmdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlICdBcnJvd1JpZ2h0JyBrZXksIHVzZWQgdG8gbmF2aWdhdGUgcmlnaHQgaW4gdGhlIEVkaXRvci4gKi9cclxuICAgIEFycm93UmlnaHQgPSBcIkFycm93UmlnaHRcIixcclxufVxyXG4iLCJleHBvcnQgZW51bSBUYWJsZVNjb3BlcyB7XHJcbiAgICBDb2x1bW4gPSBcIkNvbHVtblwiLFxyXG4gICAgUm93ID0gXCJSb3dcIixcclxuICAgIENlbGwgPSBcIkNlbGxcIixcclxuICAgIFNlbGVjdGVkQ2VsbHMgPSBcIlNlbGVjdGVkQ2VsbHNcIlxyXG59IiwiZXhwb3J0IGVudW0gU2VsZWN0aW9uTW9kZXMge1xyXG4gICAgVGV4dCA9IFwiVGV4dFwiLFxyXG4gICAgQ2VsbCA9IFwiQ2VsbFwiLFxyXG4gICAgQmxvY2sgPSBcIkJsb2NrXCJcclxufSIsImltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xyXG5pbXBvcnQgeyBUb29sYm94T3B0aW9ucyB9IGZyb20gXCIuLi9jb21wb25lbnRzL2Jsb2NrLXRvb2xib3gvVG9vbGJveE9wdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFbWJlZFRvb2wge1xyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEltYWdlKHVybE9iajogc3RyaW5nLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh1cmxPYmopO1xyXG5cclxuICAgICAgICBpZiAoIWF3YWl0IEVtYmVkVG9vbC52YWxpZGF0ZUltYWdlKHVybC50b1N0cmluZygpKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGltYWdlXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKCk7XHJcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHJcbiAgICAgICAgaW1hZ2Uuc3JjID0gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaW1hZ2UuYWx0ID0gJ0VtYmVkZGVkIEltYWdlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpbWFnZS5zdHlsZS53aWR0aCA9ICdhdXRvJztcclxuICAgICAgICBpbWFnZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpbWFnZSk7XHJcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoVG9vbGJveE9wdGlvbnMuQWxpZ25Ub29sQ2xhc3MpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1Rvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzLCBcImZpdC1jb250ZW50XCIsIFwieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHZhbGlkYXRlSW1hZ2UodXJsVG9DaGVjazogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB1cmxUb0NoZWNrO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZEdvb2dsZVNoZWV0KHVybE9iajogVVJMLCBsYXN0Rm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRJZCA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpWzNdO1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlU2hlZXRJZCA9IGVuY29kZVVSSUNvbXBvbmVudChzaGVldElkKTtcclxuXHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLyR7c2FmZVNoZWV0SWR9L3B1Ymh0bWw/d2lkZ2V0PXRydWUmYW1wO2hlYWRlcnM9ZmFsc2VgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzQ1MHB4JztcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSAnMCc7XHJcbiAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW1wieC1yZXNpemFibGVcIl0sIGxhc3RGb2N1c2VkRWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkWW91VHViZVZpZGVvQXNJZnJhbWUodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmxPYmouc2VhcmNoUGFyYW1zLmdldCgndicpO1xyXG4gICAgICAgIGlmICh2aWRlb0lkKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVWaWRlb0lkID0gZW5jb2RlVVJJQ29tcG9uZW50KHZpZGVvSWQpO1xyXG5cclxuICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8ke3NhZmVWaWRlb0lkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xyXG4gICAgICAgICAgICBpZnJhbWUuYWxsb3cgPSBcImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmVcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93RnVsbHNjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcIngtcmVzaXphYmxlXCIsIFRvb2xib3hPcHRpb25zLkFsaWduVG9vbENsYXNzXSwgZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBZb3VUdWJlIHZpZGVvIFVSTCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYXRoU2VnbWVudHMgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKTtcclxuICAgICAgICBjb25zdCBzaG9ydElkID0gcGF0aFNlZ21lbnRzW3BhdGhTZWdtZW50cy5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgaWYgKHNob3J0SWQpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImVtYmVkLWNvbnRhaW5lclwiXSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVTaG9ydElkSWQgPSBlbmNvZGVVUklDb21wb25lbnQoc2hvcnRJZCk7XHJcblxyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyR7c2FmZVNob3J0SWRJZH1gO1xyXG4gICAgICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICAgICAgaWZyYW1lLmFsbG93ID0gXCJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCI7XHJcbiAgICAgICAgICAgIGlmcmFtZS5hbGxvd0Z1bGxzY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBTaG9ydHMgVVJMJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZFlvdVR1YmVQbGF5bGlzdEFzSWZyYW1lKHVybE9iajogVVJMLCBlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGxpc3RJZCA9IHVybE9iai5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XHJcbiAgICAgICAgaWYgKGxpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBFbWJlZFRvb2wuY3JlYXRlRW1iZWRDb250YWluZXIoW1wiZW1iZWQtY29udGFpbmVyXCJdKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhZmVMaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQobGlzdElkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3ZpZGVvc2VyaWVzP2xpc3Q9JHtzYWZlTGlzdElkfWA7XHJcbiAgICAgICAgICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd2Z1bGxzY3JlZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICAgICAgRW1iZWRUb29sLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgWW91VHViZSBwbGF5bGlzdCBVUkwnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtYmVkU3BvdGlmeUNvbnRlbnQodXJsT2JqOiBVUkwsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0eXBlOiBFbWJlZFR5cGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudElkID0gdXJsT2JqLnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3BvdGlmeS1lbWJlZFwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzcyk7XHJcblxyXG5cclxuICAgICAgICBpZiAoIWNvbnRlbnRJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY29udGVudElkIGlzIGVtcHR5XCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzYWZlQ29udGVudElkID0gZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRlbnRJZCk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZChcInNwb3RpZnktZW1iZWRcIik7XHJcbiAgICAgICAgaWZyYW1lLnNyYyA9IGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vZW1iZWQvJHt0eXBlfS8ke3NhZmVDb250ZW50SWR9YDtcclxuICAgICAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcclxuICAgICAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwic2Nyb2xsaW5nXCIsIFwibm9cIik7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVRyYWNrOlxyXG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IFwiODBweFwiO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q6XHJcbiAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5U2hvdzpcclxuICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlFcGlzb2RlOlxyXG4gICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUFydGlzdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjM4MHB4XCI7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBcIjMwMHB4XCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICB0aGlzLmZpbmFsaXplRW1iZWQoY29udGFpbmVyLCBbXCJ4LXJlc2l6YWJsZVwiLCBUb29sYm94T3B0aW9ucy5BbGlnblRvb2xDbGFzc10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhc3luYyBlbWJlZEdpc3RBc1NjcmlwdCh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBnaXN0SWQgPSB1cmxPYmoucGF0aG5hbWUuc3BsaXQoJy8nKS5wb3AoKTtcclxuICAgICAgICBpZiAoIWdpc3RJZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBHaXN0IElEXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBzaGFkb3dFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzaGFkb3ctZWxlbWVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gRW1iZWRUb29sLmNyZWF0ZUVtYmVkQ29udGFpbmVyKFtcImdpc3QtZW1iZWQtY29udGFpbmVyXCIsIFwiZmlndXJlLWVtYmVkLWNvbnRhaW5lclwiLCBcImlnbm9yZS10ZXh0LWZsb2F0aW5nLXRvb2xiYXJcIl0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjEwMHB4XCI7XHJcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xyXG5cclxuXHJcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNoYWRvd0VsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBzaGFkb3dSb290ID0gc2hhZG93RWxlbWVudC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhZmVHaXN0SWQgPSBlbmNvZGVVUklDb21wb25lbnQoZ2lzdElkKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2NyaXB0U3JjID0gYGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLyR7c2FmZUdpc3RJZH0uanNgO1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICAgICAgc2NyaXB0LnNyYyA9IHNjcmlwdFNyYztcclxuICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFdyaXRlID0gZG9jdW1lbnQud3JpdGU7XHJcbiAgICAgICAgbGV0IHNjcmlwdE91dHB1dCA9ICcnO1xyXG4gICAgICAgIGRvY3VtZW50LndyaXRlID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBzY3JpcHRPdXRwdXQgKz0gY29udGVudDtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gc2NyaXB0T3V0cHV0O1xyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbSh0ZW1wRGl2LmNoaWxkTm9kZXMpLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKG5vZGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2lzdCBsb2FkZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC53cml0ZSA9IG9yaWdpbmFsV3JpdGU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gbG9hZCB0aGUgR2lzdFwiKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcblxyXG4gICAgICAgIEVtYmVkVG9vbC5maW5hbGl6ZUVtYmVkKGNvbnRhaW5lciwgW10sIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlbWJlZENvZGVwZW5Bc0lmcmFtZSh1cmxPYmo6IFVSTCwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IHVybE9iai5wYXRobmFtZS5zcGxpdCgnLycpO1xyXG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCA0IHx8IHBhcnRzWzFdID09PSAnJyB8fCBwYXJ0c1szXSA9PT0gJycpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkw6IEV4cGVjdGVkIGZvcm1hdCAvdXNlci97dXNlcm5hbWV9L3Blbi97cGVuSWR9Jyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHBhcnRzWzFdO1xyXG4gICAgICAgIGNvbnN0IHBlbiA9IHBhcnRzWzNdO1xyXG5cclxuICAgICAgICBjb25zdCBzYWZlVXNlciA9IGVuY29kZVVSSUNvbXBvbmVudCh1c2VyKTtcclxuICAgICAgICBjb25zdCBzYWZlUGVuID0gZW5jb2RlVVJJQ29tcG9uZW50KHBlbik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IEVtYmVkVG9vbC5jcmVhdGVFbWJlZENvbnRhaW5lcihbXCJlbWJlZC1jb250YWluZXJcIl0pO1xyXG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgICAgIGlmcmFtZS5zcmMgPSBgaHR0cHM6Ly9jb2RlcGVuLmlvLyR7c2FmZVVzZXJ9L2VtYmVkLyR7c2FmZVBlbn0/aGVpZ2h0PTI2NSZ0aGVtZS1pZD1saWdodCZkZWZhdWx0LXRhYj1qcyxyZXN1bHRgO1xyXG4gICAgICAgIGlmcmFtZS5zdHlsZS5ib3JkZXIgPSBcIm5vbmVcIjtcclxuICAgICAgICBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XHJcbiAgICAgICAgaWZyYW1lLnN0eWxlLm92ZXJmbG93ID0gXCJ2aXNpYmxlXCI7XHJcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc2FuZGJveCcsICdhbGxvdy1zY3JpcHRzIGFsbG93LXNhbWUtb3JpZ2luJywpO1xyXG5cclxuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcclxuICAgICAgICBFbWJlZFRvb2wuZmluYWxpemVFbWJlZChjb250YWluZXIsIFtcInktcmVzaXphYmxlXCJdLCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgaGVpZ2h0IH0gPSBlbnRyeS5jb250ZW50UmVjdDtcclxuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGNvbnRhaW5lci5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKTtcclxuICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwib3ZlcmZsb3ctaGlkZGVuXCIpO1xyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNyZWF0ZUVtYmVkQ29udGFpbmVyKGNsYXNzZXM6IHN0cmluZ1tdID0gW10pOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZmlndXJlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlndXJlJyk7XHJcbiAgICAgICAgZmlndXJlLmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGZpZ3VyZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbGl6ZUVtYmVkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGNvbnRlbnRFbGVtZW50Q2xhc3Nlczogc3RyaW5nW10gPSBbXSwgbGFzdEZvY3VzZWRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gbGFzdEZvY3VzZWRFbGVtZW50LmNsb3Nlc3QoYC4ke0NvbW1vbkNsYXNzZXMuQ29udGVudEVsZW1lbnR9YCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKC4uLmNvbnRlbnRFbGVtZW50Q2xhc3Nlcyk7XHJcbiAgICAgICAgICAgIHdoaWxlIChjb250ZW50LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldyYXBwZXIgPSBibG9jaz8ucXVlcnlTZWxlY3RvcihcIi5ibG9jay10b29sYmFyLXdyYXBwZXJcIik7XHJcbiAgICAgICAgICAgIHRvb2xiYXJXcmFwcGVyPy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBkZXRlcm1pbmVFbWJlZFR5cGUodXJsOiBzdHJpbmcpOiBFbWJlZFR5cGVzIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xyXG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IHVybE9iai5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmxPYmoucGF0aG5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKC9eKD86LipcXC4pP3Nwb3RpZnlcXC5jb20kLy50ZXN0KGRvbWFpbikpIHtcclxuICAgICAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoXCIvdHJhY2tcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlUcmFjaztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5UGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9hcnRpc3RcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlBcnRpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9lcGlzb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5TcG90aWZ5RXBpc29kZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3Nob3dcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlNwb3RpZnlTaG93O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICgvXig/Oi4qXFwuKT8oeW91dHViZVxcLmNvbXx5b3V0dVxcLmJlKSQvLnRlc3QoZG9tYWluKSkge1xyXG4gICAgICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIi93YXRjaFwiKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybE9iai5zZWFyY2hQYXJhbXMuaGFzKFwibGlzdFwiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVQbGF5bGlzdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVWaWRlbztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKFwiL3BsYXlsaXN0XCIpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Zb3VUdWJlUGxheWxpc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pbmNsdWRlcyhcIi9zaG9ydHNcIikpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLllvdVR1YmVTaG9ydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcInZpbWVvLmNvbVwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLlZpbWVvVmlkZW87XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiZG9jcy5nb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9zcHJlYWRzaGVldHNcIikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIEVtYmVkVHlwZXMuR29vZ2xlU2hlZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwidHdpdHRlci5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5Ud2VldDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnb29nbGUuY29tXCIgJiYgcGF0aC5pbmNsdWRlcyhcIi9tYXBzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdvb2dsZU1hcDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gXCJnaXN0LmdpdGh1Yi5jb21cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gRW1iZWRUeXBlcy5HaXRIdWJHaXN0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9tYWluID09PSBcImdpdGxhYi5jb21cIiAmJiBwYXRoLmluY2x1ZGVzKFwiL3NuaXBwZXRzXCIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkdpdExhYlNuaXBwZXQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb21haW4gPT09IFwiY29kZXBlbi5pb1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBFbWJlZFR5cGVzLkNvZGVQZW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IGVudW0gRW1iZWRUeXBlcyB7XHJcbiAgICBTcG90aWZ5VHJhY2sgPSBcInRyYWNrXCIsXHJcbiAgICBTcG90aWZ5UGxheWxpc3QgPSBcInBsYXlsaXN0XCIsXHJcbiAgICBTcG90aWZ5QXJ0aXN0ID0gXCJhcnRpc3RcIixcclxuICAgIFNwb3RpZnlFcGlzb2RlID0gXCJlcGlzb2RlXCIsXHJcbiAgICBTcG90aWZ5U2hvdyA9IFwic2hvd1wiLFxyXG4gICAgWW91VHViZVZpZGVvID0gXCJ2aWRlb1wiLFxyXG4gICAgWW91VHViZVBsYXlsaXN0ID0gXCJwbGF5bGlzdFwiLFxyXG4gICAgWW91VHViZVNob3J0ID0gXCJzaG9ydFwiLFxyXG4gICAgVmltZW9WaWRlbyA9IFwidmlkZW9cIixcclxuICAgIEdvb2dsZVNoZWV0ID0gXCJzaGVldFwiLFxyXG4gICAgVHdlZXQgPSBcInR3ZWV0XCIsXHJcbiAgICBHb29nbGVNYXAgPSBcIm1hcFwiLFxyXG4gICAgR2l0SHViR2lzdCA9IFwiZ2lzdFwiLFxyXG4gICAgR2l0TGFiU25pcHBldCA9IFwic25pcHBldFwiLFxyXG4gICAgQ29kZVBlbiA9IFwicGVuXCJcclxufSIsImV4cG9ydCBlbnVtIFRvb2xiYXJJRHMge1xyXG4gICAgVGFibGVUb29sYmFyID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiLFxyXG4gICAgVGV4dFRvb2xiYXIgPSBcInRleHRGbG9hdGluZ1Rvb2xiYXJcIlxyXG59IiwiLyoqXHJcbiAqIEVudW0gZm9yIHNwZWNpZnlpbmcgYm91bmRhcmllcyB3aXRoaW4gYW4gZWxlbWVudC5cclxuICogQGVudW0ge3N0cmluZ31cclxuICovXHJcbmV4cG9ydCBlbnVtIEJvdW5kYXJpZXMge1xyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGZpcnN0IGxpbmUgb2YgYW4gZWxlbWVudCwgaW1wb3J0YW50IGZvciBkZXRlcm1pbmluZyBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydGluZyBib3VuZGFyeS4gKi9cclxuICAgIEZpcnN0ID0gXCJGaXJzdFwiLFxyXG4gICAgLyoqIFJlcHJlc2VudHMgdGhlIGxhc3QgbGluZSBvZiBhbiBlbGVtZW50LCBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZGluZyBib3VuZGFyeS4gKi9cclxuICAgIExhc3QgPSBcIkxhc3RcIlxyXG59IiwiaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XHJcbmltcG9ydCB7IFRhYmxlU2NvcGVzIH0gZnJvbSBcIkAvc2VydmljZXMvdGFibGUtb3BlcmF0aW9ucy9UYWJsZVNjb3Blc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVXRpbHMge1xyXG5cclxuICAgIHN0YXRpYyBhZGRSb3codGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluc2VydFBvc2l0aW9uID0gKHBvc2l0aW9uICE9PSBudWxsICYmIHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPD0gdGFibGUucm93cy5sZW5ndGgpID8gcG9zaXRpb24gOiB0YWJsZS5yb3dzLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBuZXdSb3cgPSB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pO1xyXG5cclxuICAgICAgICBjb25zdCBudW1Db2x1bW5zID0gQXJyYXkuZnJvbSh0YWJsZS5yb3dzKS5yZWR1Y2UoKG1heCwgcm93KSA9PiBNYXRoLm1heChtYXgsIHJvdy5jZWxscy5sZW5ndGgpLCAwKTtcclxuICAgICAgICBsZXQgYWZmZWN0ZWRDZWxscyA9IFtdOyAgLy8gQXJyYXkgdG8gaG9sZCByZWZlcmVuY2VzIHRvIG5ldyBjZWxsc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gbmV3Um93Lmluc2VydENlbGwoKTtcclxuICAgICAgICAgICAgY2VsbC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcclxuICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBsYWNlaG9sZGVyXCIsIFwiRW50ZXIgdGV4dFwiKTtcclxuICAgICAgICAgICAgLy8gY2VsbC5jbGFzc0xpc3QuYWRkKFwidGVtcG9yYXJ5LXNoYWRvd1wiKTtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5wdXNoKGNlbGwpOyAgLy8gQWRkIGNlbGwgcmVmZXJlbmNlIHRvIGFycmF5XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgYWZmZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGwgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKFwidGVtcG9yYXJ5LXNoYWRvd1wiKSk7XHJcbiAgICAgICAgfSwgNzAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWRkQ29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnNlcnRQb3NpdGlvbiA9IHBvc2l0aW9uICE9PSBudWxsID8gcG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgbGV0IGFmZmVjdGVkQ2VsbHMgPSBbXTsgIC8vIEFycmF5IHRvIGhvbGQgcmVmZXJlbmNlcyB0byBuZXcgY2VsbHNcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YWJsZS5yb3dzW2ldLmluc2VydENlbGwoaW5zZXJ0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICBjZWxsLmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xyXG4gICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZShcImRhdGEtcGxhY2Vob2xkZXJcIiwgXCJjZWxsXCIpO1xyXG4gICAgICAgICAgICAvLyBjZWxsLmNsYXNzTGlzdC5hZGQoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpO1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLnB1c2goY2VsbCk7ICAvLyBBZGQgY2VsbCByZWZlcmVuY2UgdG8gYXJyYXlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBhZmZlY3RlZENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoXCJ0ZW1wb3Jhcnktc2hhZG93XCIpKTtcclxuICAgICAgICB9LCA3MDApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgaXNMYXN0Q29sdW1uKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGFibGUuY29udGFpbnMoY2VsbCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2VsbFJvdyA9IGNlbGwucGFyZW50RWxlbWVudCBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxhc3RDZWxsSW5Sb3cgPSBjZWxsUm93LmNlbGxzW2NlbGxSb3cuY2VsbHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgcmV0dXJuIGNlbGwgPT09IGxhc3RDZWxsSW5Sb3c7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzTGFzdFJvdyh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCwgY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRhYmxlLmNvbnRhaW5zKGNlbGwpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxSb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCBsYXN0Um93SW5UYWJsZSA9IHRhYmxlLnJvd3NbdGFibGUucm93cy5sZW5ndGggLSAxXTtcclxuICAgICAgICByZXR1cm4gY2VsbFJvdyA9PT0gbGFzdFJvd0luVGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZUNvbHVtbkJ5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuXHJcbiAgICAgICAgLy8gQWRkIGZhZGUtb3V0IGNsYXNzIHRvIGFsbCBjZWxscyBpbiB0aGUgY29sdW1uXHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0YWJsZS5yb3dzW2ldLmNlbGxzW2NvbHVtbkluZGV4XS5jbGFzc0xpc3QuYWRkKFwiZmFkZS1vdXRcIik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIERlbGF5IHRoZSBjb2x1bW4gcmVtb3ZhbCBmb3IgMzAwIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdGFibGUucm93c1tpXS5jZWxscy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHRhYmxlLnJvd3NbaV0uZGVsZXRlQ2VsbChjb2x1bW5JbmRleCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyAgICAgICAgIGlmIChjb2x1bW5JbmRleCA8IHRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNvbHVtbkluZGV4KTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0sIDkwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZVJvd0J5Q2VsbChjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChjZWxsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJ0ZFwiICYmIGNlbGwudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcInRoXCIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgbm90IGEgdGFibGUgY2VsbC5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJsZSA9IHJvdy5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIEFkZCBmYWRlLW91dCBjbGFzcyB0byBhbGwgY2VsbHMgaW4gdGhlIHJvd1xyXG4gICAgICAgIC8vIEFycmF5LmZyb20ocm93LmNlbGxzKS5mb3JFYWNoKGNlbGwgPT4ge1xyXG4gICAgICAgIC8vICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJmYWRlLW91dFwiKTtcclxuICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgLy8gRGVsYXkgdGhlIHJvdyByZW1vdmFsIGZvciAzMDAgbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3cucm93SW5kZXgpO1xyXG5cclxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAvLyAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcbiAgICAgICAgLy8gfSwgOTAwKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0QWN0aXZlVGFibGVDZWxsKCk6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYWN0aXZlRWxlbWVudD8uY2xvc2VzdCgndGQnKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyBzdGF0aWMgaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHRhcmdldEhleENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBjb25zdCBhY3RpdmVDZWxsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyAgICAgaWYgKCFhY3RpdmVDZWxsIHx8IGFjdGl2ZUNlbGwudGFnTmFtZSAhPT0gJ1REJyB8fCAhYWN0aXZlQ2VsbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInKSkge1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAvLyAgICAgfVxyXG5cclxuICAgIC8vICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoYWN0aXZlQ2VsbCk7XHJcbiAgICAvLyAgICAgY29uc3QgY3VycmVudEJhY2tncm91bmRDb2xvciA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xyXG5cclxuICAgIC8vICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcclxuXHJcbiAgICAvLyAgICAgcmV0dXJuIGhleEJhY2tncm91bmRDb2xvci50b1VwcGVyQ2FzZSgpID09PSB0YXJnZXRIZXhDb2xvci50b1VwcGVyQ2FzZSgpO1xyXG4gICAgLy8gfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0TGFzdFRhYmxlQ2VsbCh0YWJsZTogSFRNTFRhYmxlRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucm93c1tpXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IHJvdy5jZWxscy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0Rmlyc3RUYWJsZUNlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSB0YWJsZS5yb3dzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxsc1tqXTtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gY2VsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVpZ2hib3JDZWxsKHRhYmxlOiBIVE1MVGFibGVFbGVtZW50LCBjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogSFRNTFRhYmxlQ2VsbEVsZW1lbnQgfCBudWxsIHtcclxuXHJcbiAgICAgICAgaWYgKCFjZWxsLnBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByb3dJbmRleCA9IChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkucm93SW5kZXg7XHJcbiAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gY2VsbC5jZWxsSW5kZXg7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1JpZ2h0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjZWxsLnBhcmVudEVsZW1lbnQgYXMgSFRNTFRhYmxlUm93RWxlbWVudCkuY2VsbHNbY2VsbEluZGV4ICsgMV0gPz8gbnVsbDtcclxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb25zLkFycm93TGVmdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAoY2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQpLmNlbGxzW2NlbGxJbmRleCAtIDFdID8/IG51bGw7XHJcbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9ucy5BcnJvd1VwOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggLSAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbnMuQXJyb3dEb3duOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLnJvd3Nbcm93SW5kZXggKyAxXT8uY2VsbHNbY2VsbEluZGV4XSA/PyBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHN0YXRpYyBjaGFuZ2VDZWxsQm9yZGVyQ29sb3IoXHJcbiAgICAgICAgdGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgc2NvcGU6IFRhYmxlU2NvcGVzLFxyXG4gICAgICAgIGNvbG9yOiBzdHJpbmdcclxuICAgICkge1xyXG4gICAgICAgIGxldCBjZWxsc1RvQ2hhbmdlOiBOb2RlTGlzdE9mPEhUTUxUYWJsZUNlbGxFbGVtZW50PiB8IEhUTUxDb2xsZWN0aW9uT2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoc2NvcGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUYWJsZVNjb3Blcy5Db2x1bW46XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9ICh0YWJsZS5xdWVyeVNlbGVjdG9yKFwidGQuc2VsZWN0ZWRcIikgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQpPy5jZWxsSW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKGB0ZDpudGgtY2hpbGQoJHtjb2x1bW5JbmRleCArIDF9KWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuUm93OlxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxsID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRkLnNlbGVjdGVkXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGVjdGVkQ2VsbC5wYXJlbnRFbGVtZW50IGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbHNUb0NoYW5nZSA9IHJvdy5jZWxscztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFRhYmxlU2NvcGVzLkNlbGw6XHJcbiAgICAgICAgICAgICAgICBjZWxsc1RvQ2hhbmdlID0gdGFibGUucXVlcnlTZWxlY3RvckFsbChcInRkLnNlbGVjdGVkXCIpIGFzIE5vZGVMaXN0T2Y8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgVGFibGVTY29wZXMuU2VsZWN0ZWRDZWxsczpcclxuICAgICAgICAgICAgICAgIGNlbGxzVG9DaGFuZ2UgPSB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKFwidGQuc2VsZWN0ZWRcIikgYXMgTm9kZUxpc3RPZjxIVE1MVGFibGVDZWxsRWxlbWVudD47XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2NvcGUuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNlbGxzVG9DaGFuZ2UpIHtcclxuXHJcblxyXG5cclxuICAgICAgICAgICAgQXJyYXkuZnJvbShjZWxsc1RvQ2hhbmdlKS5mb3JFYWNoKChjZWxsKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSBgMXB4IGRvdWJsZSAke2NvbG9yfWA7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJveFNoYWRvdyA9IGAwIDAgMCAxcHggJHtjb2xvcn0gaW5zZXRgO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJveFNoYWRvdyA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCdib3gtc2hhZG93Jyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBib3JkZXIgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnYm9yZGVyJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJiYmJcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlciA9IGJvcmRlcjtcclxuICAgICAgICAgICAgICAgIC8vIGNlbGwuc3R5bGUuYm94U2hhZG93ID0gYm94U2hhZG93O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCb3ggU2hhZG93OicsIGJveFNoYWRvdyk7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQm9yZGVyOicsIGJvcmRlcik7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgbW92ZUZvY3VzVG9CZWxvd0NlbGwodGFibGU6IEhUTUxUYWJsZUVsZW1lbnQsIGNlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgbmV4dFJvdyA9IGNlbGwucGFyZW50RWxlbWVudD8ubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQgfCBudWxsO1xyXG4gICAgICAgIGlmICghbmV4dFJvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIE5vIGNlbGwgYmVsb3dcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IGNlbGwuY2VsbEluZGV4O1xyXG4gICAgICAgIGNvbnN0IGJlbG93Q2VsbCA9IG5leHRSb3cuY2VsbHNbY2VsbEluZGV4XTtcclxuICAgICAgICBpZiAoIWJlbG93Q2VsbCB8fCAhYmVsb3dDZWxsLmlzQ29udGVudEVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gZWRpdGFibGUgY2VsbCBiZWxvd1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYmVsb3dDZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG59IiwiaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVUlDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbW9uL0Jhc2VVSUNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJUXVpY2tNZW51IH0gZnJvbSBcIi4uL3F1aWNrLW1lbnUvSVF1aWNrTWVudVwiO1xyXG5pbXBvcnQgeyBJU2hvcnRjdXRMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBJVGFibGVMaXN0ZW5lcnMgfSBmcm9tIFwiQC9jb3JlL2xpc3RlbmVycy9JVGFibGVMaXN0ZW5lcnNcIjtcclxuaW1wb3J0IHsgSVRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCIuLi9mbG9hdGluZy10b29sYmFyL0lUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IERlZmF1bHRKU0V2ZW50cyB9IGZyb20gXCJAL2NvbW1vbi9EZWZhdWx0SlNFdmVudHNcIjtcclxuaW1wb3J0IHsgS2V5Ym9hcmRLZXlzIH0gZnJvbSBcIkAvY29tbW9uL0tleWJvYXJkS2V5c1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnQgZXh0ZW5kcyBCYXNlVUlDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHt9KTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXQoKTogSFRNTEVsZW1lbnQge1xyXG5cclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImNvbnRlbnRcIik7XHJcblxyXG4gICAgICAgIGlmICh3aW5kb3cuZWRpdG9yQ29uZmlnPy5pbmNsdWRlRmlyc3RQYXJhZ3JhcGggfHwgdHJ1ZSkge1xyXG4gICAgICAgICAgICBodG1sRWxlbWVudC5hcHBlbmQoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGh0bWxFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBDbGVhcnMgdGV4dCBzZWxlY3Rpb24gd2hlbiBpbml0aWF0aW5nIGEgZHJhZyBmcm9tIGVsZW1lbnRzIHdpdGggdGhlIGAuZHJhZy1oYW5kbGVyYCBjbGFzcy5cclxuICAgICogVGhpcyBmdW5jdGlvbiBhdHRhY2hlcyBhIGBtb3VzZWRvd25gIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBlbnRpcmUgZG9jdW1lbnQuIFdoZW4gYSBtb3VzZWRvd25cclxuICAgICogZXZlbnQgb2NjdXJzIG9uIGFuIGVsZW1lbnQgdGhhdCBpcyBhIGNoaWxkIG9mIGEgYC5kcmFnLWhhbmRsZXJgIG9yIG9uIHRoZSBgLmRyYWctaGFuZGxlcmAgaXRzZWxmLFxyXG4gICAgKiBpdCBjaGVja3MgaWYgdGhlIHRhcmdldCBvciBpdHMgcGFyZW50IGlzIGEgZGVzaWduYXRlZCBkcmFnIGhhbmRsZXIuIElmIHRydWUsIGl0IGNsZWFycyBhbnkgY3VycmVudCB0ZXh0IHNlbGVjdGlvbnMuXHJcbiAgICAqIFRoaXMgcHJldmVudHMgdGV4dCBmcm9tIGJlaW5nIGFjY2lkZW50YWxseSBzZWxlY3RlZCBkdXJpbmcgZHJhZy1hbmQtZHJvcCBpbnRlcmFjdGlvbnMsIGVuaGFuY2luZyBVWCBpbiBkcmFnZ2FibGUgaW50ZXJmYWNlcy5cclxuICAgICogXHJcbiAgICAqIEBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbk9uRHJhZ1xyXG4gICAgKi9cclxuICAgIGNsZWFyU2VsZWN0aW9uT25EcmFnKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNlZG93biwgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnQ6IEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmNsb3Nlc3QoXCIuZHJhZy1oYW5kbGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBhdHRhY2hFdmVudCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbk9uRHJhZygpO1xyXG4gICAgICAgIHRoaXMucmVSZW5kZXJQbGFjZWhvbGRlcigpO1xyXG5cclxuXHJcbiAgICAgICAgLy8gRXZlbnQgc2VsZWN0b3JcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5DbGljaywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIGNsYXNzZSAnYmxvY2stc2VsZWN0ZWQnIGRlIHF1YWxxdWVyIGJsb2NvIHByZXZpYW1lbnRlIHNlbGVjaW9uYWRvXHJcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcblxyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkLmZvckVhY2goc2VsZWN0ZWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQuY2xhc3NMaXN0LnJlbW92ZSgnc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7IC8vIFJlbW92ZSB0YWJpbmRleCBxdWFuZG8gbsOjbyBlc3TDoSBtYWlzIHNlbGVjaW9uYWRvXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2UgbyBlbGVtZW50byBjbGljYWRvIMOpIHVtIGZpbGhvIGRlIHVtICdzZXBhcmF0b3InXHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCBkbyB0YXJnZXQgcGFyYSBIVE1MRWxlbWVudFxyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoXCIuc2VwYXJhdG9yLXdyYXBwZXJcIikpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLnNlcGFyYXRvci13cmFwcGVyJykgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgcGFyYSBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2suY2xhc3NMaXN0LmFkZCgnc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50QmxvY2suc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICctMScpOyAvLyBBZGljaW9uYSB0YWJpbmRleCBwYXJhIHBlcm1pdGlyIGZvY29cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLmZvY3VzKCk7IC8vIENvbG9jYSBvIGZvY28gbm8gYmxvY28gc2VsZWNpb25hZG9cclxuICAgICAgICAgICAgICAgICAgICB9LCA1MCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkJsdXIsIChldmVudDogRm9jdXNFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xvc2VzdCgnLnNlcGFyYXRvci1zZWxlY3RlZCcpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB0YXJnZXQuY2xvc2VzdCgnLnNlcGFyYXRvci1zZWxlY3RlZCcpITtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IuY2xhc3NMaXN0LnJlbW92ZSgnc2VwYXJhdG9yLXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgICAgICBzZXBhcmF0b3IucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpOyAvLyBMaW1wYSBvIGF0cmlidXRvIHBhcmEgbsOjbyBpbnRlcmZlcmlyIGNvbSBhIG5hdmVnYcOnw6NvIG5vcm1hbFxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlYXBsaWNhciBhdHJpYnV0b3MgcXVlIGdhcmFudGVtIG8gZm9jb1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgc2VwYXJhdG9yLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcclxuICAgICAgICAgICAgICAgIC8vIH0sIDUwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHRydWUpO1xyXG4gICAgICAgIC8vZW5kIGV2ZW50IHNlbGVjdG9yXHJcblxyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29waWVkVGV4dFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvcHlFbGVtZW50SXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY29weU9wdGlvbiAudGV4dC1vcHRpb24gc3BhblwiKSBhcyBIVE1MU3BhbkVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChjb3B5RWxlbWVudEl0ZW0pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcGllZCFcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb3B5RWxlbWVudEl0ZW0udGV4dENvbnRlbnQgPSBcIkNvcHlcIjtcclxuICAgICAgICAgICAgICAgIH0sIDE1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vRm9jdXMgb24gUCB3aGVuIGxvYWRcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5ET01Db250ZW50TG9hZGVkLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1lZGl0b3InKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIGxldCBibG9ja3MgPSBlZGl0b3IucXVlcnlTZWxlY3RvckFsbCgnLmJsb2NrJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGJsb2Nrcy5sZW5ndGggPT0gMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gYmxvY2tzWzBdLnF1ZXJ5U2VsZWN0b3IoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocC5pbm5lclRleHQgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmIERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50LXdyYXBwZXIgLnRpdGxlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLnByZXNzZWRFbnRlck9uVGl0bGUsIHt9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCB0cnVlKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgYXN5bmMgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoRE9NVXRpbHMuaXNFdmVudFRhcmdldERlc2NlbmRhbnRPZihldmVudCwgXCIuaWdub3JlLWV2ZW50c1wiKSAmJiBldmVudC5rZXkgIT09ICdUYWInKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHF1aWNrTWVudSA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJUXVpY2tNZW51PihcIklRdWlja01lbnVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9vbGJhciA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyPihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5hbHRLZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5FbnRlciAmJiAhZXZlbnQuc2hpZnRLZXkgJiYgIXF1aWNrTWVudS5pc1Zpc2libGUgJiYgIXRhYmxlVG9vbGJhci5pc1Zpc2libGUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZihET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5qb2hhbm5lcy1jb2RlXCIpKXtcclxuICAgICAgICAgICAgICAgIC8vICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZUNvbnRyb2xsZXIgPSAoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoXCIudGFibGUtY29udHJvbGxlclwiKTtcclxuICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbnRyb2xsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS5jbG9zZXN0KFwidGQsIHRoXCIpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVDb250cm9sbGVyLnF1ZXJ5U2VsZWN0b3IoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2VkQmVsb3cgPSBUYWJsZVV0aWxzLm1vdmVGb2N1c1RvQmVsb3dDZWxsKHRhYmxlLCBhY3RpdmVDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2N1c2VkQmVsb3cpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZm9jdXNPbk5leHRCbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCkuY2xvc2VzdChcIi5qb2hhbm5lcy1jb2RlXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGRlZmF1bHQgYmxvY2sgd2hlbiBwcmVzcyBFbnRlclxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnROZXcsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5CYWNrc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnc2VwYXJhdG9yLXdyYXBwZXInKSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldC5jbG9zZXN0KFwiLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudFwiKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0U3RhcnQgJiYgc2VsZWN0ZWRDb250ZW50Py5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLm1lcmdlV2l0aFByZXZpb3VzQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLkRlbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZXBhcmF0b3Itd3JhcHBlcicpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uTmV4dCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSAmJiB0YXJnZXQudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gJycpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdFN0YXJ0LCBhdEVuZCB9ID0gRE9NVXRpbHMuZ2V0U2VsZWN0aW9uVGV4dEluZm8odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKT8udG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0RW5kICYmIHNlbGVjdGVkQ29udGVudD8ubGVuZ3RoID09IDApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5tZXJnZVdpdGhOZXh0QmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgJiYgQ29udGVudC5pc0N1cnNvckF0RW5kKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fTkVYVCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgQ29udGVudC5pc0N1cnNvckF0U3RhcnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9QUkVWSU9VUywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgJiYgQ29udGVudC5pc0N1cnNvck9uTGFzdExpbmUoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhULCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgJiYgQ29udGVudC5pc0N1cnNvck9uRmlyc3RMaW5lKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLkJMT0NLX09QRVJBVElPTlMuRk9DVVNfT05fUFJFVklPVVMsIGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKERPTVV0aWxzLmlzRXZlbnRUYXJnZXREZXNjZW5kYW50T2YoZXZlbnQsIFwiLmpvaGFubmVzLWNvZGVcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYkNoYXJhY3RlciA9ICdcXHUwMGEwXFx1MDBhMFxcdTAwYTBcXHUwMGEwJzsgIC8vIFJlcHJlc2VudGEgNCBlc3Bhw6dvcyAob3Ugdm9jw6ogcG9kZSB1c2FyIHVtIHZlcmRhZGVpcm8gY2FyYWN0ZXJlIGRlIHRhYnVsYcOnw6NvICdcXHQnIHNlIHByZWZlcmlyKVxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0JywgZmFsc2UsIHRhYkNoYXJhY3Rlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkJsdXIsIChldmVudDogRXZlbnQpID0+IHRoaXMuc2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyKGV2ZW50KSwgdHJ1ZSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gVmVyaWZpY2Egc2UgbyBlbGVtZW50byBhbHZvIMOpIGNvbnRlbnRlZGl0YWJsZVxyXG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY29udGVudEVkaXRhYmxlID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImxpcG91XCIpO1xyXG4gICAgICAgICAgICBET01VdGlscy5zYW5pdGl6ZUNvbnRlbnRFZGl0YWJsZSh0YXJnZXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEFkZHMgYW4gaW5wdXQgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGVudGlyZSBkb2N1bWVudCB0byBoYW5kbGUgcGxhY2Vob2xkZXIgYmVoYXZpb3IgZm9yIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50cy5cclxuICAgICogVGhpcyB3b3JrYXJvdW5kIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBhZGRyZXNzIGEga25vd24gaXNzdWUgaW4gRmlyZWZveCB3aGVyZSBjb250ZW50RWRpdGFibGUgZWxlbWVudHNcclxuICAgICogZG8gbm90IHByb3Blcmx5IHJlc2V0IHRoZWlyIHBsYWNlaG9sZGVycyBhZnRlciB0aGUgY29udGVudCBpcyBkZWxldGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgKiBcclxuICAgICogVGhlIGV2ZW50IGxpc3RlbmVyIGNoZWNrcyBpZiB0aGUgdGFyZ2V0IG9mIHRoZSBpbnB1dCBldmVudCBpcyBhIGNvbnRlbnRFZGl0YWJsZSBlbGVtZW50IGFuZCB3aGV0aGVyIGl0IGhhcyBhXHJcbiAgICAqIGN1c3RvbSAnZGF0YS1wbGFjZWhvbGRlcicgYXR0cmlidXRlLiBJZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgZW1wdHkgKGlnbm9yaW5nIHdoaXRlIHNwYWNlcyksIHRoZSBmdW5jdGlvblxyXG4gICAgKiByZXNldHMgdGhlICdkYXRhLXBsYWNlaG9sZGVyJyB0byBlbnN1cmUgaXQgZGlzcGxheXMgY29ycmVjdGx5LCBhbmQgY2xlYXJzIGFueSByZXNpZHVhbCB0ZXh0IGNvbnRlbnQgdGhhdCBtaWdodFxyXG4gICAgKiBpbnRlcmZlcmUgd2l0aCB0aGUgcGxhY2Vob2xkZXIgZGlzcGxheS5cclxuICAgICogXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIFRvIHV0aWxpemUgdGhpcyB3b3JrYXJvdW5kLCBlbnN1cmUgeW91ciBjb250ZW50RWRpdGFibGUgZWxlbWVudHMgaGF2ZSBhICdkYXRhLXBsYWNlaG9sZGVyJyBhdHRyaWJ1dGUuXHJcbiAgICAqIC8vIDxkaXYgY29udGVudEVkaXRhYmxlPVwidHJ1ZVwiIGRhdGEtcGxhY2Vob2xkZXI9XCJFbnRlciB0ZXh0IGhlcmUuLi5cIj48L2Rpdj5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGlucHV0IGV2ZW50IHRyaWdnZXJlZCBieSB1c2VyIGludGVyYWN0aW9uIHdpdGggdGhlIGRvY3VtZW50J3MgaW5wdXQtY2FwYWJsZSBlbGVtZW50cy5cclxuICAgICovXHJcbiAgICByZVJlbmRlclBsYWNlaG9sZGVyKCkge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLklucHV0LCBmdW5jdGlvbiAoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVBsYWNlaG9sZGVyID0gZWRpdGFibGVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsIGN1c3RvbVBsYWNlaG9sZGVyIHx8ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yQXRFbmQodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IHRhcmdldC5jbG9zZXN0KCcuZm9jdXNhYmxlJyk7XHJcbiAgICAgICAgaWYgKCFmb2N1c2FibGVQYXJlbnQpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgbGV0IGVuZE5vZGU6IE5vZGUgfCBudWxsID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgIGlmIChlbmROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgICBlbmROb2RlID0gZW5kTm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIGVuZE5vZGUgPT09IGZvY3VzYWJsZVBhcmVudCAmJiByYW5nZS5lbmRPZmZzZXQgPT09IChyYW5nZS5lbmRDb250YWluZXIudGV4dENvbnRlbnQgfHwgJycpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JBdFN0YXJ0KHRhcmdldDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb2N1c2FibGVQYXJlbnQgPSB0YXJnZXQuY2xvc2VzdCgnLmZvY3VzYWJsZScpO1xyXG4gICAgICAgIGlmICghZm9jdXNhYmxlUGFyZW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnROb2RlOiBOb2RlIHwgbnVsbCA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgIGlmIChzdGFydE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAgIHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmFuZ2UuY29sbGFwc2VkICYmIHN0YXJ0Tm9kZSA9PT0gZm9jdXNhYmxlUGFyZW50ICYmIHJhbmdlLnN0YXJ0T2Zmc2V0ID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0Rmlyc3RWaXNpYmxlTGluZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KGVsZW1lbnQsIDApO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlVG9wID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJhbmdlVG9wID09PSBlbGVtZW50VG9wO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0F0TGFzdFZpc2libGVMaW5lKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgICAgIHJhbmdlLnNldEVuZChlbGVtZW50LCBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCByYW5nZUJvdHRvbSA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtcclxuICAgICAgICBjb25zdCBlbGVtZW50Qm90dG9tID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZUJvdHRvbSA9PT0gZWxlbWVudEJvdHRvbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGRpZEN1cnNvck1vdmUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgICAgIGlmICghc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVjdCA9IG9yaWdpbmFsUmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JlY3QgPSBuZXdSYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRNb3ZlID0gIShvcmlnaW5hbFJlY3QudG9wID09PSBuZXdSZWN0LnRvcCAmJiBvcmlnaW5hbFJlY3QubGVmdCA9PT0gbmV3UmVjdC5sZWZ0KTtcclxuICAgICAgICAgICAgICAgIGlmICghZGlkTW92ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGRpZE1vdmUpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDdXJzb3JPbkZpcnN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydE9mZnNldCA9PT0gMCAmJiByYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQ3Vyc29yT25MYXN0TGluZSgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgICAgIHJldHVybiByYW5nZS5lbmRPZmZzZXQgPT09IHJhbmdlLmVuZENvbnRhaW5lci50ZXh0Q29udGVudD8ubGVuZ3RoICYmIHJhbmdlLmVuZENvbnRhaW5lciA9PT0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IENvbnRlbnQge1xyXG5cclxuICAgICAgICBjb25zdCBzaG9ydGN1dExpc3RlbmVyID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElTaG9ydGN1dExpc3RlbmVycz4oXCJJU2hvcnRjdXRMaXN0ZW5lcnNcIik7XHJcbiAgICAgICAgY29uc3QgdGFibGVMaXN0ZW5lcnMgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlTGlzdGVuZXJzPihcIklUYWJsZUxpc3RlbmVyc1wiKTtcclxuICAgICAgICByZXR1cm4gbmV3IENvbnRlbnQoKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IENvbnRlbnQgfSBmcm9tIFwiQC9jb21wb25lbnRzL2NvbnRlbnQvQ29udGVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRlbnRCdWlsZGVyIHtcclxuICAgIHN0YXRpYyBidWlsZCgpOiBDb250ZW50IHtcclxuICAgICAgICByZXR1cm4gQ29udGVudC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgRmxvYXRpbmdUb29sYmFyIH0gZnJvbSBcIi4vRmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IElUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9JVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCIuLi8uLi9jb21tb24vRGlyZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBEZWZhdWx0SlNFdmVudHMgfSBmcm9tIFwiLi4vLi4vY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCIuLi8uLi9jb21tb24vRE9NRWxlbWVudHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEtleWJvYXJkS2V5cyB9IGZyb20gXCJAL2NvbW1vbi9LZXlib2FyZEtleXNcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiLi9UZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhclwiO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlcyB9IGZyb20gXCIuL1NlbGVjdGlvbk1vZGVcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQC9jb21tYW5kcy9FdmVudEVtaXR0ZXJcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEN1c3RvbVVJRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbVVJRXZlbnRzXCI7XHJcbmltcG9ydCB7IElVSUV2ZW50RGV0YWlsIH0gZnJvbSBcIkAvY29tbWFuZHMvSVVJRXZlbnREZXRhaWxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBGbG9hdGluZ1Rvb2xiYXIgaW1wbGVtZW50cyBJVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZDogc3RyaW5nID0gXCJ0YWJsZUZsb2F0aW5nVG9vbGJhclwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcjtcclxuXHJcbiAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaztcclxuICAgIHNlbGVjdGVkQ2VsbHM6IEhUTUxUYWJsZUNlbGxFbGVtZW50W10gPSBbXTtcclxuICAgIGFjdHVhbEZvY3VzZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xyXG5cclxuXHJcbiAgICAvLyBUaGUgc2VsZWN0aW9uIG1vZGUgYW5kIHNlbGVjdGlvbkFjdGl2ZUZsYWcgd29yayB0b2dldGhlciB3aGVuIHdlIHN0YXJ0IHNlbGVjdGluZyB0ZXh0IGluc2lkZSBhIGNlbGwgb3IgcHJlc3Mgc2hpZnQgdG8gYWN0aXZhdGUgdGhlIHNlbGVjdGlvbkFjdGl2ZUZsYWcuXHJcbiAgICAvLyBBZnRlciBhY3RpdmF0aW5nIHRoZSBmbGFnLCB3ZSBjYW4gc2VsZWN0IHRleHQgaW5zaWRlIGEgY2VsbC4gSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgdGV4dCBpbnNpZGUgdGhlIGNlbGwgdXNpbmcgc2hpZnQgKyBkaXJlY3Rpb25hbCBrZXlzIG9yIHBsYWNlIHRoZSBjdXJzb3Igb3V0c2lkZVxyXG4gICAgLy8gdGhlIGFjdGl2ZSBjZWxsLCBpdCBpbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGVudGVyIGNlbGwgc2VsZWN0aW9uIG1vZGUuIFdlIGNoYW5nZSB0aGUgc2VsZWN0aW9uIG1vZGUgaW4gdGhlc2UgY2FzZXMuXHJcbiAgICBzZWxlY3Rpb25Nb2RlOiBTZWxlY3Rpb25Nb2RlcyA9IFNlbGVjdGlvbk1vZGVzLlRleHQ7IC8vIFRoZSBkZWZhdWx0IHNlbGVjdGlvbiBtb2RlXHJcbiAgICBzZWxlY3Rpb25GbGFnOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgdG8gdHJhY2sgd2hldGhlciB0ZXh0IHNlbGVjdGlvbiBpcyBhY3RpdmVcclxuICAgIHNlbGVjdGVkVGV4dDogc3RyaW5nID0gXCJcIjsgLy8gU3RvcmFnZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihmb2N1c1N0YWNrOiBJRm9jdXNTdGFjaywgdGFibGVPcGVyYXRpb25zU2VydmljZTogSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCk7XHJcbiAgICAgICAgdGhpcy5jbGVhckFuZEhpZGUgPSB0aGlzLmNsZWFyQW5kSGlkZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuekluZGV4ID0gWkluZGV4Lk1vZGVyYXRlbHlJbXBvcnRhbnQ7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2hFdmVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuTW91c2Vkb3duLCB0aGlzLmhhbmRsZU1vdXNlRG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Nb3VzZW1vdmUsIHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLk1vdXNldXAsIHRoaXMuaGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVTdGFydFNlbGVjdGlvbkluQ2VsbEtleURvd24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuS2V5ZG93biwgdGhpcy5oYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXl1cCwgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hVSUV2ZW50KCk7XHJcblxyXG4gICAgICAgIHN1cGVyLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY2VsbCAmJiAhY2VsbC5tYXRjaGVzKCcuZmlndXJlLWVtYmVkLWNvbnRhaW5lciB0ZCcpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTW91c2VEb3duIGV2ZW50IG9uOiBcIiwgZXZlbnQudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCAhPSB0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjZWxsKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25GbGFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3Rpb25Nb2RlQnlNb3VzZUV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gU2VsZWN0aW9uTW9kZXMuQ2VsbCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5IaWRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENlbGwoY2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblN0YXRlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudENlbGwgJiYgIWN1cnJlbnRDZWxsLm1hdGNoZXMoJy5naXN0IHRkJykpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gS2V5Ym9hcmRLZXlzLkVudGVyICYmICFldmVudC5zaGlmdEtleSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSAmJiAhZXZlbnQuYWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIC8vIGFsZXJ0KFwianVtcCB0byBuZXh0IGxpbmVcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUgJiYgdGhpcy5jYW5IaWRlICYmICFUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhci5nZXRJbnN0YW5jZSgpLmlzVmlzaWJsZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDZWxsICYmICFjdXJyZW50Q2VsbC5tYXRjaGVzKCcuZ2lzdCB0ZCcpKSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQucmVwZWF0ICYmIGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRLZXlzLlNoaWZ0KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDZWxsKGN1cnJlbnRDZWxsKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVDZWxsU2VsZWN0aW9uQ29udGludWF0aW9uT25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uRmxhZykge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsID0gdGFyZ2V0LmNsb3Nlc3QoRE9NRWxlbWVudHMuVEQpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDZWxsICYmICFjdXJyZW50Q2VsbC5tYXRjaGVzKCcuZ2lzdCB0ZCcpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IFNlbGVjdGlvbk1vZGVzLkNlbGwgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5LnN0YXJ0c1dpdGgoJ0Fycm93JykgJiYgIWV2ZW50LnJlcGVhdCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGN1cnJlbnRDZWxsLmNsb3Nlc3QoRE9NRWxlbWVudHMuVEFCTEUpITtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2VsbCA9IFRhYmxlVXRpbHMuZ2V0TmVpZ2hib3JDZWxsKHRhYmxlLCBjdXJyZW50Q2VsbCwgZXZlbnQua2V5IGFzIERpcmVjdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChjdXJyZW50Q2VsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2VsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2VsbChuZXh0Q2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZVRleHQodGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRleHRcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxyXG4gICAgICAgICAgICAudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gbW9kZSBieSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gZnJvbSB0aGUgZG9jdW1lbnRcclxuICAgICogd2l0aCB0aGUgc3RvcmVkIHNlbGVjdGVkIHRleHQuIElmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtYXRjaGVzIHRoZSBwcmV2aW91c2x5IHN0b3JlZFxyXG4gICAgKiBzZWxlY3Rpb24sIGl0IHN3aXRjaGVzIHRoZSBzZWxlY3Rpb24gbW9kZSB0byBjZWxsIHNlbGVjdGlvbiBhbmQgcmVzZXRzIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgKiBJZiB0aGVyZSBpcyBhIG5ldyBzZWxlY3Rpb24gKGFjdHVhbFNlbGVjdGlvbiBpcyBub3QgZW1wdHkpLCBpdCB1cGRhdGVzIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dFxyXG4gICAgKiB0byByZWZsZWN0IHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cclxuICAgICpcclxuICAgICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkZsYWcpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNlbGVjdGlvbiA9IHRoaXMubm9ybWFsaXplVGV4dChzZWxlY3Rpb24udG9TdHJpbmcoKS50cmltKCkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoY3VycmVudENlbGwubWF0Y2hlcygnLmdpc3QgdGQnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDZWxsVGV4dCA9IHRoaXMubm9ybWFsaXplVGV4dCgoY3VycmVudENlbGwudGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGF0U3RhcnQsIGF0RW5kIH0gPSBET01VdGlscy5nZXRTZWxlY3Rpb25UZXh0SW5mbyhjdXJyZW50Q2VsbCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpbnRlcmFjdGlvbiBrZWVwcyB0aGUgbWVudSB2aXNpYmxlIGFmdGVyIGFsbCB0ZXh0IGlzIHNlbGVjdGVkLCBlbmhhbmNpbmcgdXNlciBlbmdhZ2VtZW50LiBcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHByZXNzZXMgYSBkaXJlY3Rpb25hbCBrZXkgYWdhaW4gYmV5b25kIHRoaXMgcG9pbnQsIHRoZSBtZW51IGlzIGhpZGRlbiBhbmQgY2VsbCBzZWxlY3Rpb24gbW9kZSBpcyBpbml0aWF0ZWQsIFxyXG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtbGluaW5nIHRoZSBpbnRlcmZhY2UgYW5kIGZvY3VzaW5nIG9uIHN1YnNlcXVlbnQgdGFza3MuXHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENlbGxUZXh0ID09PSBcIlwiIHx8IChhY3R1YWxTZWxlY3Rpb24gPT09IHRoaXMuc2VsZWN0ZWRUZXh0LnRyaW0oKSAmJiAoYXRTdGFydCB8fCBhdEVuZCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuQ2VsbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gYWN0dWFsU2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHByaXZhdGUgdXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBmbGFnIGlzIHNldCwgaW5kaWNhdGluZyB0aGF0IHNlbGVjdGlvbiB1cGRhdGVzIHNob3VsZCBiZSBtb25pdG9yZWRcclxuICAgIC8vICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBzZWxlY3Rpb24gZnJvbSB0aGUgZG9jdW1lbnRcclxuICAgIC8vICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVUZXh0KGRvY3VtZW50LmdldFNlbGVjdGlvbigpPy50b1N0cmluZygpLnRyaW0oKSB8fCBcIlwiKTtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIC8vICAgICAgICAgY29uc3QgY3VycmVudENlbGwgPSB0YXJnZXQuY2xvc2VzdChET01FbGVtZW50cy5URCkgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRleHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQoKGN1cnJlbnRDZWxsLnRleHRDb250ZW50IHx8IFwiXCIpLnRyaW0oKSk7XHJcblxyXG4gICAgLy8gICAgICAgICBsZXQgaXNUaGVFbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvLyAgICAgICAgIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24/LmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHNlbGVjdGlvblJhbmdlKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnRPZmZzZXQgPSBzZWxlY3Rpb25SYW5nZS5zdGFydE9mZnNldDtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25FbmRPZmZzZXQgPSBzZWxlY3Rpb25SYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFRleHRMZW5ndGggPSBjdXJyZW50Q2VsbFRleHQubGVuZ3RoO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93UmlnaHQgfHwgZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93RG93bikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciB0aGUgY2FyZXQgYmVpbmcgYXQgdGhlIGVuZCBvZiB0aGUgY2VsbCB0ZXh0XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGlzVGhlRW5kID0gc2VsZWN0aW9uRW5kT2Zmc2V0ID49IGNlbGxUZXh0TGVuZ3RoO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBEaXJlY3Rpb25zLkFycm93TGVmdCB8fCBldmVudC5rZXkgPT09IERpcmVjdGlvbnMuQXJyb3dVcCkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciB0aGUgY2FyZXQgYmVpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjZWxsIHRleHRcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgaXNUaGVFbmQgPSBzZWxlY3Rpb25TdGFydE9mZnNldCA9PT0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBtYXRjaGVzIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dFxyXG4gICAgLy8gICAgICAgICBpZiAoY3VycmVudENlbGxUZXh0ID09PSBcIlwiIHx8IChhY3R1YWxTZWxlY3Rpb24gPT09IHRoaXMuc2VsZWN0ZWRUZXh0LnRyaW0oKSAmJiBpc1RoZUVuZCkpIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vIElmIHRoZXkgYXJlIHRoZSBzYW1lLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZWN0aW9uIGhhc24ndCBjaGFuZ2VkLFxyXG4gICAgLy8gICAgICAgICAgICAgLy8gc28gc3dpdGNoIHRvIGNlbGwgc2VsZWN0aW9uIG1vZGUgYW5kIHJlc2V0IHRoZSBzdG9yZWQgdGV4dFxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuQ2VsbDtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0ID0gXCJcIjtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxTZWxlY3Rpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV3IHNlbGVjdGlvbiwgdXBkYXRlIHRoZSBzdG9yZWQgc2VsZWN0ZWQgdGV4dCB0byB0aGUgbmV3IHZhbHVlXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IGFjdHVhbFNlbGVjdGlvbjtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKipcclxuICAgICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIG1vZGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgbW91c2UgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGFjdHVhbCBmb2N1c2VkIGNlbGwuXHJcbiAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBtb3VzZSBpcyBvdXRzaWRlIHRoZSBib3VuZHMgb2YgdGhlIGZvY3VzZWQgY2VsbCwgYW5kIGlmIHNvLCBzd2l0Y2hlcyB0aGVcclxuICAgICogc2VsZWN0aW9uIG1vZGUgdG8gY2VsbCBzZWxlY3Rpb24gbW9kZS5cclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQgLSBUaGUgbW91c2UgZXZlbnQgdGhhdCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLCB0eXBpY2FsbHkgaW52b2x2aW5nIG1vdXNlIG1vdmVtZW50LlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlU2VsZWN0aW9uTW9kZUJ5TW91c2VFdmVudChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25GbGFnICYmIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxSZWN0ID0gdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlWCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlWSA9IGV2ZW50LmNsaWVudFk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIShtb3VzZVggPj0gY2VsbFJlY3QubGVmdCAmJiBtb3VzZVggPD0gY2VsbFJlY3QucmlnaHQgJiYgbW91c2VZID49IGNlbGxSZWN0LnRvcCAmJiBtb3VzZVkgPD0gY2VsbFJlY3QuYm90dG9tKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuQ2VsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRhcmdldC5jbG9zZXN0KERPTUVsZW1lbnRzLlREKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDZWxsKSB7XHJcblxyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGhlU2VsZWN0aW9uTW9kZUJ5Q3VycmVudFNlbGVjdGlvblN0YXRlKGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkS2V5cy5TaGlmdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGlvblN0YXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRTZWxlY3RlZENlbGwoY2VsbDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENlbGxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMucHVzaChjZWxsKTtcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpO1xyXG5cclxuICAgICAgICAgICAgLy9DaGFuZ2UgdGhlIGFjdHVhbCBmb2N1c2VkIGNlbGwgb25seSBpZiBhdCBzYW1lIHRhYmxlXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICBjZWxsLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0U2VsZWN0ZWRDZWxsID0gdGhpcy5zZWxlY3RlZENlbGxzW3RoaXMuc2VsZWN0ZWRDZWxscy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkQ2VsbFRhYmxlID0gbGFzdFNlbGVjdGVkQ2VsbC5jbG9zZXN0KCd0YWJsZScpO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2VsbFRhYmxlID0gY2VsbC5jbG9zZXN0KCd0YWJsZScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxhc3RTZWxlY3RlZENlbGxUYWJsZSA9PT0gY3VycmVudENlbGxUYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkQ2VsbHMuaW5kZXhPZihjZWxsKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMucHVzaChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vQ2hhbmdlIHRoZSBhY3R1YWwgZm9jdXNlZCBjZWxsIG9ubHkgaWYgYXQgc2FtZSB0YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsRm9jdXNlZENlbGwgPSBjZWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9DZWx1bGEgasOhIGZheiBwYXJ0ZSBkYSBsaXN0YSBhcGVuYXMgZm9jYSBlIGNvbnRpbnVhXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCA9IGNlbGw7XHJcbiAgICAgICAgICAgICAgICAgICAgY2VsbC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXR0YWNoVUlFdmVudCgpIHtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEN1c3RvbVVJRXZlbnRzLkNsb3NlRWxlbWVudCwgdGhpcy5oYW5kbGVDbG9zZUVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDbG9zZUVsZW1lbnRFdmVudChldmVudDogRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBldmVudCBhcyBDdXN0b21FdmVudDxJVUlFdmVudERldGFpbD47XHJcbiAgICAgICAgY29uc3QgZGV0YWlscyA9IGN1c3RvbUV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhci5pZCA9PSBkZXRhaWxzLnRhcmdldElkISkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyQW5kSGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG93KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuYWN0dWFsRm9jdXNlZENlbGwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignTm8gZm9jdXNlZCBjZWxsIGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCh0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKTtcclxuICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyh0aGlzLmFjdHVhbEZvY3VzZWRDZWxsKTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzKCk7XHJcblxyXG4gICAgICAgIHN1cGVyLnNob3coKTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5CbHVyLCB0aGlzLmNsZWFyQW5kSGlkZSwgeyBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICAvLyBleGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcclxuXHJcbiAgICAvLyAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xyXG5cclxuICAgIC8vICAgICBpZiAoYWN0aXZlQ2VsbCkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCB0YWJsZSA9IGFjdGl2ZUNlbGwuY2xvc2VzdCgndGFibGUnKSE7XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxzID0gdGFibGUucXVlcnlTZWxlY3RvckFsbCgndGQuc2VsZWN0ZWQnKTtcclxuXHJcbiAgICAvLyAgICAgICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcclxuICAgIC8vICAgICAgICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcclxuICAgIC8vICAgICAgICAgfSk7XHJcblxyXG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XHJcblxyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjZWxsIG5vdCBmb3VuZFwiKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcHJvY2Vzc1NlbGVjdGlvbkNoYW5nZUVmZmVjdHMoKSB7XHJcblxyXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvclJlZF0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yUmVkKTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmVlbl0gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yR3JlZW4pO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvckJsdWVdID0gdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yKHRoaXMuc2VsZWN0ZWRDZWxscywgQ29sb3JzLkJhY2tncm91bmRDb2xvckJsdWUpO1xyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcnNbQ29sb3JzLkJhY2tncm91bmRDb2xvclllbGxvd10gPSB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucXVlcnlBbGxTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodGhpcy5zZWxlY3RlZENlbGxzLCBDb2xvcnMuQmFja2dyb3VuZENvbG9yWWVsbG93KTtcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3JzW0NvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmV5XSA9IHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5xdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcih0aGlzLnNlbGVjdGVkQ2VsbHMsIENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JHcmV5KTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoYmFja2dyb3VuZENvbG9ycykuZm9yRWFjaCgoW2NvbG9yLCBhY3RpdmVdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgY29sb3IsIFwic2hvd1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvLyByZXNldENoZWNrZWRDb2xvcigpIHtcclxuXHJcbiAgICAvLyAgICAgY29uc3QgZHJvcGRvd25Db2xvciA9IHRoaXMuZHJvcGRvd25zLmZpbmQoZSA9PiBlLmlkID09IFwidGFibGVDb2xvck9wdGlvbnNNZW51XCIpITtcclxuXHJcbiAgICAvLyAgICAgZHJvcGRvd25Db2xvci5kcm9wZG93bkxpc3QuZHJvcGRvd25JdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgaXRlbS5yZXNldEFjdGl2ZUljb24oKTtcclxuICAgIC8vICAgICB9KTtcclxuXHJcbiAgICAvLyAgICAgZHJvcGRvd25Db2xvci5kcm9wZG93bkxpc3QuZHJvcGRvd25JdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgY29uc3QgY29sb3IgPSBpdGVtLmdldExlZnRJY29uQmFja2dyb3VuZENvbG9yKCk7XHJcblxyXG4gICAgLy8gICAgICAgICBpZiAoY29sb3IgJiYgdGhpcy5hcmVBbGxTZWxlY3RlZENlbGxzU2FtZUJnQ29sb3IoY29sb3IpICYmIGNvbG9yICE9IFwidHJhbnNwYXJlbnRcIikge1xyXG4gICAgLy8gICAgICAgICAgICAgaXRlbS5jaGFuZ2VBY3RpdmVJY29uVG9WaXNpYmxlKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBjaGFuZ2VUb29sYmFyUG9zaXRpb25Ub0JlQ2xvc2VkVG8oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50V2lkdGggPSB0aGlzLmh0bWxFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBsZWZ0UG9zaXRpb24gPSByZWN0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWCArIDA7XHJcblxyXG4gICAgICAgIGlmIChsZWZ0UG9zaXRpb24gKyBlbGVtZW50V2lkdGggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xyXG4gICAgICAgICAgICBsZWZ0UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGVsZW1lbnRXaWR0aCAtIDIwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWxlbWVudEhlaWdodCA9IHRoaXMuaHRtbEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QudG9wICsgd2luZG93LnNjcm9sbFkgLSBlbGVtZW50SGVpZ2h0IC0gMTA7XHJcblxyXG4gICAgICAgIGlmICh0b3BQb3NpdGlvbiA8IDApIHtcclxuICAgICAgICAgICAgdG9wUG9zaXRpb24gPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0UG9zaXRpb259cHhgO1xyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wUG9zaXRpb259cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0U2VsZWN0aW9uU3RhdGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZXMuVGV4dDtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkZsYWcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxGb2N1c2VkQ2VsbCA9IG51bGw7XHJcbiAgICAgICAgY29uc3QgYWxsVGFibGVDZWxscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XHJcbiAgICAgICAgYWxsVGFibGVDZWxscy5mb3JFYWNoKGNlbGwgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbkhpZGUpIHtcclxuICAgICAgICAgICAgc3VwZXIuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckFuZEhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbGVhckFsbCgpO1xyXG4gICAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRBYm9ydENvbnRyb2xsZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcclxuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIoZm9jdXNTdGFjaywgdGFibGVPcGVyYXRpb25zU2VydmljZSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCJAL2NvbW1hbmRzL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IENvbG9ycyB9IGZyb20gXCJAL2NvbW1vbi9Db2xvcnNcIjtcclxuaW1wb3J0IHsgU2l6ZXMgfSBmcm9tIFwiQC9jb21tb24vU2l6ZXNcIjtcclxuaW1wb3J0IHsgU1ZHSWNvbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvY29tbW9uL1NWR0ljb25cIjtcclxuaW1wb3J0IHsgQ29sb3JJY29uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvQ29sb3JJY29uXCI7XHJcbmltcG9ydCB7IERyb3Bkb3duTWVudSB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVCdXR0b24gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVCdXR0b25cIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdCB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9kcm9wZG93bi10b29sL0Ryb3Bkb3duTWVudUxpc3RcIjtcclxuaW1wb3J0IHsgRHJvcGRvd25NZW51TGlzdEl0ZW0gfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvZHJvcGRvd24tdG9vbC9Ecm9wZG93bk1lbnVMaXN0SXRlbVwiO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlIH0gZnJvbSBcIkAvY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL2Ryb3Bkb3duLXRvb2wvRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZVwiO1xyXG5pbXBvcnQgeyBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3IgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvc2VwYXJhdG9yL0Zsb2F0aW5nVG9vbGJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgeyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL2Zsb2F0aW5nLXRvb2xiYXIvVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyXCI7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnlTZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZVwiO1xyXG5pbXBvcnQgeyBJVGFibGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSWNvbnMgfSBmcm9tIFwiQC9jb21tb24vSWNvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIHtcclxuXHJcbiAgICAgICAgY29uc3QgdGFibGVPcGVyYXRpb25TZXJ2aWNlID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlPihcIklUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG5cclxuICAgICAgICBjb25zdCB0YWJsZVRvb2xiYXIgPSBUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXIuZ2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgdGFibGVUb29sYmFyLmFwcGVuZERyb3Bkb3duKFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIudGFibGVPcHRpb25zKHRhYmxlT3BlcmF0aW9uU2VydmljZSkpO1xyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmRTZXBhcmF0b3IoVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5zZXBhcmF0b3IoXCJ0YWJsZU9wZXJhdGlvbnNTZXBhcmF0b3JcIikpO1xyXG4gICAgICAgIHRhYmxlVG9vbGJhci5hcHBlbmREcm9wZG93bihUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyLnRhYmxlQ29sb3JEcm9wZG93bigpKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiB0YWJsZVRvb2xiYXI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHRhYmxlT3B0aW9ucyh0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSk6IERyb3Bkb3duTWVudSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyTGlzdCA9IG5ldyBEcm9wZG93bk1lbnVMaXN0KFwidGFibGVPcHRpb25zU2VsZWN0XCIpO1xyXG4gICAgICAgIGNvbnN0IHR1cm5JbnRvQmFyQnV0dG9uID0gbmV3IERyb3Bkb3duTWVudUJ1dHRvbihcInRhYmxlT3B0aW9uc1wiLCBcIk9wdGlvbnNcIiwgdHVybkludG9CYXJMaXN0KTtcclxuICAgICAgICBjb25zdCB0dXJuSW50b0Ryb3Bkb3duID0gbmV3IERyb3Bkb3duTWVudShcInRhYmxlT3B0aW9uc01lbnVcIiwgdHVybkludG9CYXJCdXR0b24sIHR1cm5JbnRvQmFyTGlzdCk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUodHVybkludG9CYXJMaXN0LCBcIkluc2VydCBDb2x1bW5cIikpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVGV4dFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5Db2x1bW5MZWZ0LCBTaXplcy5tZWRpdW0pLmh0bWxFbGVtZW50LCBcIkxlZnRcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25UZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodCwgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUEFSQUdSQVBILCBTVkdJY29uLmNyZWF0ZShJY29ucy5Db2x1bW5SaWdodCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJSaWdodFwiKSk7XHJcblxyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtVGl0bGUodHVybkludG9CYXJMaXN0LCBcIkluc2VydCBSb3dcIikpO1xyXG4gICAgICAgIHR1cm5JbnRvQmFyTGlzdC5hcHBlbmQobmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25Ub2RvTGlzdFwiLCB0dXJuSW50b0Jhckxpc3QsIENvbW1hbmRzLmluc2VydFRhYmxlUm93QWJvdmUsIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1QsIFNWR0ljb24uY3JlYXRlKEljb25zLlJvd0Fib3ZlLCBTaXplcy5tZWRpdW0pLmh0bWxFbGVtZW50LCBcIkFib3ZlXCIpKTtcclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcInR1cm5JbnRvT3B0aW9uVG9kb0xpc3RcIiwgdHVybkludG9CYXJMaXN0LCBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0JlbG93LCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5Sb3dCZWxvdywgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJCZWxvd1wiKSk7XHJcblxyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbVRpdGxlKHR1cm5JbnRvQmFyTGlzdCwgXCJSZW1vdmVcIikpO1xyXG5cclxuICAgICAgICBjb25zdCBkZWxldGVDb2x1bW5JdGVtID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwidHVybkludG9PcHRpb25UZXh0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMucmVtb3ZlQ29sdW1uLCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgsIFNWR0ljb24uY3JlYXRlKEljb25zLmRlbGV0ZVN3ZWVwLCBTaXplcy5tZWRpdW0pLmh0bWxFbGVtZW50LCBcIkNvbHVtblwiKTtcclxuICAgICAgICBkZWxldGVDb2x1bW5JdGVtLmFkZENzc0NsYXNzKFwiZGFuZ2VyLW9wdGlvblwiKTtcclxuICAgICAgICAvLyBkZWxldGVDb2x1bW5JdGVtLmF0dGFjaE9uRm9jdXModGFibGVPcGVyYXRpb25zU2VydmljZS5lbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50LCBUYWJsZVNjb3Blcy5Db2x1bW4sIENvbG9ycy5Ub21hdG8pO1xyXG4gICAgICAgIC8vIGRlbGV0ZUNvbHVtbkl0ZW0uYXR0YWNoT25Mb3NlRm9jdXModGFibGVPcGVyYXRpb25zU2VydmljZS5lbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50LCBUYWJsZVNjb3Blcy5Db2x1bW4sIENvbG9ycy5PcmlnaW5hbFRhYmxlQ29sb3IpO1xyXG5cclxuICAgICAgICB0dXJuSW50b0Jhckxpc3QuYXBwZW5kKGRlbGV0ZUNvbHVtbkl0ZW0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGRlbGV0ZVJvd0l0ZW0gPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJ0dXJuSW50b09wdGlvblRvZG9MaXN0XCIsIHR1cm5JbnRvQmFyTGlzdCwgQ29tbWFuZHMucmVtb3ZlUm93LCBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNULCBTVkdJY29uLmNyZWF0ZShJY29ucy5kZWxldGVTd2VlcCwgU2l6ZXMubWVkaXVtKS5odG1sRWxlbWVudCwgXCJSb3dcIik7XHJcbiAgICAgICAgZGVsZXRlUm93SXRlbS5hZGRDc3NDbGFzcyhcImRhbmdlci1vcHRpb25cIik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZGVsZXRlUm93SXRlbS5hdHRhY2hPbkZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuUm93LCBDb2xvcnMuVG9tYXRvKTtcclxuICAgICAgICAvLyBkZWxldGVSb3dJdGVtLmF0dGFjaE9uTG9zZUZvY3VzKHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCwgVGFibGVTY29wZXMuUm93LCBDb2xvcnMuT3JpZ2luYWxUYWJsZUNvbG9yKTtcclxuXHJcbiAgICAgICAgdHVybkludG9CYXJMaXN0LmFwcGVuZChkZWxldGVSb3dJdGVtKTtcclxuXHJcblxyXG4gICAgICAgIHJldHVybiB0dXJuSW50b0Ryb3Bkb3duO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB0YWJsZUNvbG9yRHJvcGRvd24oKTogRHJvcGRvd25NZW51IHtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JEcm9wZG93bkxpc3QgPSBuZXcgRHJvcGRvd25NZW51TGlzdChcImNvbG9yVGFibGVPcHRpb25TZWxlY3RcIik7XHJcbiAgICAgICAgY29uc3QgY29sb3JCdXR0b24gPSBuZXcgRHJvcGRvd25NZW51QnV0dG9uKFwiY29sb3JUYWJsZUJ1dHRvblwiLCBuZXcgQ29sb3JJY29uKFwiI0ZBRjREMVwiKS5odG1sRWxlbWVudCwgY29sb3JEcm9wZG93bkxpc3QpO1xyXG4gICAgICAgIGNvbnN0IGNvbG9yRHJvcGRvd24gPSBuZXcgRHJvcGRvd25NZW51KFwidGFibGVDb2xvck9wdGlvbnNNZW51XCIsIGNvbG9yQnV0dG9uLCBjb2xvckRyb3Bkb3duTGlzdCk7XHJcblxyXG4gICAgICAgIGNvbG9yRHJvcGRvd25MaXN0LmFwcGVuZChuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZShjb2xvckRyb3Bkb3duTGlzdCwgXCJCYWNrZ3JvdW5kXCIpKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JSZWQgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uUmVkXCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclJlZCwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JSZWQpLmh0bWxFbGVtZW50LCBcIlJlZFwiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yUmVkLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbiA9IG5ldyBEcm9wZG93bk1lbnVMaXN0SXRlbShcImJhY2tncm91bmRPcHRpb25HcmVlblwiLCBjb2xvckRyb3Bkb3duTGlzdCwgQ29tbWFuZHMudG9nZ2xlQ2VsbEhpbGl0ZUNvbG9yLCBDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbiwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmVlbikuaHRtbEVsZW1lbnQsIFwiR3JlZW5cIik7XHJcbiAgICAgICAgY2VsbEJhY2tncm91bmRDb2xvckdyZWVuLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkJsdWVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yQmx1ZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JCbHVlKS5odG1sRWxlbWVudCwgXCJCbHVlXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JZZWxsb3cgPSBuZXcgRHJvcGRvd25NZW51TGlzdEl0ZW0oXCJiYWNrZ3JvdW5kT3B0aW9uWWVsbG93XCIsIGNvbG9yRHJvcGRvd25MaXN0LCBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3IsIENvbG9ycy5IaWxpdGVDb2xvclllbGxvdywgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JZZWxsb3cpLmh0bWxFbGVtZW50LCBcIlllbGxvd1wiKTtcclxuICAgICAgICBjZWxsQmFja2dyb3VuZENvbG9yWWVsbG93LmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5ID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbkdyZXlcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yR3JleSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JHcmV5KS5odG1sRWxlbWVudCwgXCJHcmV5XCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5LmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lID0gbmV3IERyb3Bkb3duTWVudUxpc3RJdGVtKFwiYmFja2dyb3VuZE9wdGlvbk5vbmVcIiwgY29sb3JEcm9wZG93bkxpc3QsIENvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvciwgQ29sb3JzLkhpbGl0ZUNvbG9yTm9uZSwgbmV3IENvbG9ySWNvbihDb2xvcnMuSGlsaXRlQ29sb3JOb25lKS5odG1sRWxlbWVudCwgXCJOb25lXCIpO1xyXG4gICAgICAgIGNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lLmFkZENsYXNzKFwiYmFja2dyb3VuZENvbG9yXCIpO1xyXG5cclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclJlZCk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmVlbik7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JCbHVlKTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvclllbGxvdyk7XHJcbiAgICAgICAgY29sb3JEcm9wZG93bkxpc3QuYXBwZW5kKGNlbGxCYWNrZ3JvdW5kQ29sb3JHcmV5KTtcclxuICAgICAgICBjb2xvckRyb3Bkb3duTGlzdC5hcHBlbmQoY2VsbEJhY2tncm91bmRDb2xvck5vbmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gY29sb3JEcm9wZG93bjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2VwYXJhdG9yKGlkOiBzdHJpbmcpOiBGbG9hdGluZ1Rvb2xiYXJTZXBhcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRpbmdUb29sYmFyU2VwYXJhdG9yKGlkKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJhc2VVSUNvbXBvbmVudCB9IGZyb20gXCIuLi9jb21tb24vQmFzZVVJQ29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIkAvY29yZS9EZXBlbmRlbmN5Q29udGFpbmVyXCI7XHJcbmltcG9ydCB7IFpJbmRleCB9IGZyb20gXCJAL2NvbW1vbi9aSW5kZXhcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XHJcbmltcG9ydCB7IEVtYmVkVG9vbCwgRW1iZWRUeXBlcyB9IGZyb20gXCJAL2NvcmUvRW1iZWRUb29sXCI7XHJcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xyXG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVkaWFJbnB1dHRlciBleHRlbmRzIEJhc2VVSUNvbXBvbmVudCB7XHJcblxyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IGlkID0gXCJtZWRpYUlucHV0dGVyXCI7XHJcbiAgICAgICAgc3VwZXIoe1xyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJRm9jdXNTdGFjaz4oXCJJRm9jdXNTdGFja1wiKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBodG1sRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgaHRtbEVsZW1lbnQuaWQgPSB0aGlzLnByb3BzLmlkO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0YWItY29udGFpbmVyXCIsIFwic29mdC1ib3gtc2hhZG93XCIpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBodG1sRWxlbWVudC5zdHlsZS56SW5kZXggPSBaSW5kZXguRXh0cmVtZWx5SW1wb3J0YW50O1xyXG5cclxuICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInVsXCIpO1xyXG4gICAgICAgIGhlYWQuY2xhc3NMaXN0LmFkZChcIm5hdlwiLCBcIm5hdi11bmRlcmxpbmVcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IHVwbG9hZFRhYiA9IHRoaXMuY3JlYXRlTmF2SXRlbShcInVwbG9hZFRhYlwiLCBcIlVwbG9hZFwiLCB0cnVlKTtcclxuXHJcbiAgICAgICAgY29uc3QgZW1iZWRUYWIgPSB0aGlzLmNyZWF0ZU5hdkl0ZW0oXCJlbWJlZFRhYlwiLCBcIkVtYmVkXCIpO1xyXG5cclxuICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHVwbG9hZFRhYik7XHJcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbWJlZFRhYik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcInRhYi1jb250ZW50XCIpO1xyXG5cclxuICAgICAgICBjb25zdCB1cGxvYWRDb250ZW50ID0gdGhpcy5jcmVhdGVVcGxvYWRDb250ZW50KCk7XHJcbiAgICAgICAgY29uc3QgZW1iZWRDb250ZW50ID0gdGhpcy5jcmVhdGVFbWJlZENvbnRlbnQoKTtcclxuXHJcbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZCh1cGxvYWRDb250ZW50KTtcclxuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVtYmVkQ29udGVudCk7XHJcblxyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGhlYWQpO1xyXG4gICAgICAgIGh0bWxFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICByZXR1cm4gaHRtbEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlTmF2SXRlbShpZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIGFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO1xyXG4gICAgICAgIGxpLmNsYXNzTGlzdC5hZGQoXCJuYXYtaXRlbVwiKTtcclxuICAgICAgICBsaS5pZCA9IGlkO1xyXG5cclxuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgICAgYS5jbGFzc0xpc3QuYWRkKFwibmF2LWxpbmtcIik7XHJcbiAgICAgICAgYS5pbm5lclRleHQgPSB0ZXh0O1xyXG4gICAgICAgIGxpLmFwcGVuZENoaWxkKGEpO1xyXG5cclxuICAgICAgICByZXR1cm4gbGk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVXBsb2FkQ29udGVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuaWQgPSBcInVwbG9hZENvbnRlbnRcIjtcclxuICAgICAgICBkaXYuY2xhc3NMaXN0LmFkZChcInVwbG9hZC1jb250ZW50XCIsIFwiY29udGVudC1kYXRhXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcclxuICAgICAgICBsYWJlbC5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XHJcbiAgICAgICAgbGFiZWwuaW5uZXJUZXh0ID0gXCJVcGxvYWQgZmlsZVwiO1xyXG5cclxuICAgICAgICBjb25zdCB0ZXh0SW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdGV4dEluZm8uY2xhc3NMaXN0LmFkZChcInRleHQtaW5mb1wiKTtcclxuICAgICAgICB0ZXh0SW5mby5pbm5lclRleHQgPSBcIk1heGltdW0gZmlsZSBzaXplOiA1TUJcIjtcclxuXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGxhYmVsKTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dEluZm8pO1xyXG5cclxuICAgICAgICByZXR1cm4gZGl2O1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVtYmVkQ29udGVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBkaXYuaWQgPSBcImVtYmVkQ29udGVudFwiO1xyXG4gICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKFwiY29udGVudC1kYXRhXCIsIFwiZW1iZWQtY29udGVudFwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9IFwidGV4dFwiO1xyXG5cclxuICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xyXG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwiYmx1ZS1idXR0b25cIik7XHJcbiAgICAgICAgYnV0dG9uLmlubmVyVGV4dCA9IFwiRW1iZWRcIjtcclxuXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGlucHV0KTtcclxuICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuXHJcbiAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLkNsaWNrLCAoKSA9PiB0aGlzLmVtYmVkR2VuZXJpYyhpbnB1dCkpO1xyXG5cclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5LZXlkb3duLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuRW50ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1iZWRHZW5lcmljKGlucHV0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKERlZmF1bHRKU0V2ZW50cy5Gb2N1c2luLCAoKSA9PiB0aGlzLnJlc2V0SW5wdXRCZ0NvbG9yKGlucHV0KSk7XHJcblxyXG4gICAgICAgIHJldHVybiBkaXY7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRJbnB1dEJnQ29sb3IoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVtYmVkR2VuZXJpYyhpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgICAgICBjb25zdCBzdHJpbmdVUkwgPSBpbnB1dC52YWx1ZTtcclxuICAgICAgICBjb25zdCBmb2N1c2VkRWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBmb2N1c2VkRWxlbWVudD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKT8uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb250ZW50LXR5cGVcIik7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoc3RyaW5nVVJMKTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFVdGlscy5pc1ZhbGlkVXJsKHVybC50b1N0cmluZygpKSl7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFVSTFwiKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFmb2N1c2VkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIm5vdCBlbGVtZW50IGZvdW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkltYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBFbWJlZFRvb2wuZW1iZWRJbWFnZShzdHJpbmdVUkwsIGZvY3VzZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuSWZyYW1lKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZW1iZWRUeXBlID0gRW1iZWRUb29sLmRldGVybWluZUVtYmVkVHlwZShzdHJpbmdVUkwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZW1iZWRUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Zb3VUdWJlVmlkZW86XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFlvdVR1YmVWaWRlb0FzSWZyYW1lKHVybCwgZm9jdXNlZEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLllvdVR1YmVQbGF5bGlzdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgRW1iZWRUb29sLmVtYmVkWW91VHViZVBsYXlsaXN0QXNJZnJhbWUodXJsLCBmb2N1c2VkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuWW91VHViZVNob3J0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRZb3VUdWJlU2hvcnRBc0lmcmFtZSh1cmwsIGZvY3VzZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5TcG90aWZ5VHJhY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVBsYXlsaXN0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLlNwb3RpZnlBcnRpc3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeUVwaXNvZGU6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVNob3c6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZFNwb3RpZnlDb250ZW50KHVybCwgZm9jdXNlZEVsZW1lbnQsIGVtYmVkVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEVtYmVkVHlwZXMuU3BvdGlmeVBsYXlsaXN0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRTcG90aWZ5Q29udGVudCh1cmwsIGZvY3VzZWRFbGVtZW50LCBlbWJlZFR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBFbWJlZFR5cGVzLkdpdEh1Ykdpc3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkVG9vbC5lbWJlZEdpc3RBc1NjcmlwdCh1cmwsIGZvY3VzZWRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgRW1iZWRUeXBlcy5Db2RlUGVuOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFbWJlZFRvb2wuZW1iZWRDb2RlcGVuQXNJZnJhbWUodXJsLCBmb2N1c2VkRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZENvbnRlbnQgaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKGlucHV0KSB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcInJnYigyNTMsIDIyMiwgMjIyKVwiO1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NMaXN0LmFkZChcInNoYWtlLWFuaW1hdGlvblwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QucmVtb3ZlKFwic2hha2UtYW5pbWF0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHNldCBpbnB1dFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCBpbnB1dFRleHQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKTtcclxuICAgICAgICBpZiAoaW5wdXRUZXh0KSB7XHJcbiAgICAgICAgICAgIGlucHV0VGV4dC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcImZsZXhcIjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXR0YWNoRXZlbnRzKCk6IHZvaWQge1xyXG5cclxuICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkVGFiXCIpO1xyXG4gICAgICAgIHVwbG9hZFRhYj8uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIoJ3VwbG9hZFRhYicsICd1cGxvYWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGVtYmVkVGFiID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkVGFiXCIpO1xyXG4gICAgICAgIGVtYmVkVGFiPy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYignZW1iZWRUYWInLCAnZW1iZWRDb250ZW50Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleWRvd24sIHRoaXMuaGFuZGxlcktleWRvd25FdmVudHMuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihEZWZhdWx0SlNFdmVudHMuQ2xpY2ssIHRoaXMuaGFuZGxlckNsaWNrRXZlbnRzLmJpbmQodGhpcykpO1xyXG5cclxuICAgICAgICBzdXBlci5hdHRhY2hVSUV2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlcktleWRvd25FdmVudHMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09IEtleWJvYXJkS2V5cy5Fc2NhcGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuSGlkZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlckNsaWNrRXZlbnRzKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gY29uc3QgZW1iZWRJbWFnZSA9IERPTVV0aWxzLmZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUlkKGV2ZW50LCBcImVtYmVkSW1hZ2VcIik7XHJcbiAgICAgICAgLy8gaWYgKGVtYmVkSW1hZ2UpIHtcclxuICAgICAgICAvLyAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5lbWJlZEltYWdlKGVsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB0aGlzLmhpZGVNZWRpYUlucHV0dGVyT25FeHRlcm5hbENsaWNrKGV2ZW50KVxyXG4gICAgICAgIHRoaXMuc2hvd01lZGlhSW5wdXR0ZXJPbk1lZGlhSW5wdXR0ZXJFbGVtZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoaWRlTWVkaWFJbnB1dHRlck9uRXh0ZXJuYWxDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG1lZGlhSW5wdXR0ZXIgPSBET01VdGlscy5maW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZChldmVudCwgdGhpcy5pZCk7XHJcbiAgICAgICAgY29uc3QgY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRPbkNsaWNrKTtcclxuICAgICAgICBpZiAoIW1lZGlhSW5wdXR0ZXIgJiYgIWNsaWNrZWRPbkVsZW1lbnRXaXRoU2hvd01lZGlhSW5wdXRDbGFzcyAmJiB0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd01lZGlhSW5wdXR0ZXJPbk1lZGlhSW5wdXR0ZXJFbGVtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgICAgICAgY29uc3QgY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzID0gRE9NVXRpbHMuZmluZENsaWNrZWRFbGVtZW50T3JBbmNlc3RvckJ5Q2xhc3MoZXZlbnQsIENvbW1vbkNsYXNzZXMuU2hvd01lZGlhSW5wdXRPbkNsaWNrKTtcclxuICAgICAgICBpZiAoY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2goY2xpY2tlZE9uRWxlbWVudFdpdGhTaG93TWVkaWFJbnB1dENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZmluZENsYXNzV2l0aFN1ZmZpeChlbGVtZW50OiBFbGVtZW50LCBzdWZmaXg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgLioke3N1ZmZpeH0kYCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGNsYXNzTmFtZSBvZiBlbGVtZW50LmNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0VGFiKHRhYklkOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRlbnRJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QWN0aXZlVGFiKHRhYklkOiBzdHJpbmcsIGNvbnRlbnRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hdi1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29udGVudC1kYXRhJykuZm9yRWFjaChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRUYWIodGFiSWQpPy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgICAgICB0aGlzLmdldENvbnRlbnQoY29udGVudElkKT8uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzZWQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xyXG5cclxuICAgICAgICBjb25zdCBzaG93SW5wdXRNZWRpYSA9IGxhc3RGb2N1c2VkPy5xdWVyeVNlbGVjdG9yKGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0T25DbGlja31gKSB8fCBsYXN0Rm9jdXNlZD8uY2xvc2VzdChgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dE9uQ2xpY2t9YCk7XHJcblxyXG4gICAgICAgIGlmIChzaG93SW5wdXRNZWRpYSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0UGxhY2Vob2xkZXIgPSB0aGlzLmZpbmRDbGFzc1dpdGhTdWZmaXgoc2hvd0lucHV0TWVkaWEsIFwiLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIik7XHJcblxyXG4gICAgICAgICAgICBpZiAodGV4dFBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldElucHV0UGxhY2Vob2xkZXIodGV4dFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxhc3RGb2N1c2VkKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmF0ZU1lZGlhVXBsb2FkID0gbGFzdEZvY3VzZWQucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5TaG93TWVkaWFJbnB1dFVwbG9hZH1gKSB8fCBsYXN0Rm9jdXNlZC5jbG9zZXN0KGAuJHtDb21tb25DbGFzc2VzLlNob3dNZWRpYUlucHV0VXBsb2FkfWApO1xyXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRUYWIgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkVGFiXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBlbWJlZFRhYiA9IHRoaXMuaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZFRhYlwiKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHVwbG9hZENvbnRlbnQgPSB0aGlzLmh0bWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjdXBsb2FkQ29udGVudFwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgZW1iZWRDb250ZW50ID0gdGhpcy5odG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkQ29udGVudFwiKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIG1lZGlhIHVwbG9hZCBpcyBhY3RpdmUsIHRoZSBtZWRpYUlucHV0dGVyIHVzZXMgbWVkaWEgdXBsb2FkIGFzIHRoZSBkZWZhdWx0LlxyXG4gICAgICAgICAgICBpZiAoYWN0aXZhdGVNZWRpYVVwbG9hZCAmJiB1cGxvYWRUYWIgJiYgdXBsb2FkQ29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkVGFiLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHVwbG9hZFRhYi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGVtYmVkQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1cGxvYWRUYWIuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHVwbG9hZFRhYi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgdXBsb2FkQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGVtYmVkQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICAgICAgZW1iZWRUYWIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcblxyXG4gICAgICAgIGlmIChsYXN0Rm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZVRvb2xiYXJQb3NpdGlvblRvQmVDbG9zZWRUbyhsYXN0Rm9jdXNlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5zaG93KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNlbWJlZENvbnRlbnQgaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgaWYgKGlucHV0ICYmIHRoaXMuaXNFbGVtZW50VmlzaWJsZShpbnB1dCkpIHtcclxuXHJcbiAgICAgICAgICAgIGlucHV0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwid2hpdGVcIjtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGVtYmVkOiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2VtYmVkQ29udGVudCBpbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoZW1iZWQgPT0gXCJpbWFnZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcclxuICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL2ltYWdlLmpwZ1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVtYmVkID09IFwieW91dHViZS1lbWJlZC1wbGFjZWhvbGRlci10ZXh0XCIpIHtcclxuICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgXCJodHRwczovL3d3dy55b3V0dWJlLmNvbS8uLi5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbWJlZCA9PSBcInNwb3RpZnktZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XHJcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tLy4uLlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVtYmVkID09IFwiZ2l0aHViLWdpc3QtZW1iZWQtcGxhY2Vob2xkZXItdGV4dFwiKSB7XHJcbiAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vLi4uXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW1iZWQgPT0gXCJjb2RlcGVuLWVtYmVkLXBsYWNlaG9sZGVyLXRleHRcIikge1xyXG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCBcImh0dHBzOi8vY29kZXBlbi5pby8uLi5cIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIFwiUGFzdGUgVVJMIGhlcmUuLi5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgaXNFbGVtZW50VmlzaWJsZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm9mZnNldFBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICByZXR1cm4gcmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGUoKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gXCJcIjtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaHRtbEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRNaWRwb2ludCA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgKHJlY3Qud2lkdGggLyAyKTtcclxuICAgICAgICBsZXQgbGVmdFBvc2l0aW9uID0gdGFyZ2V0TWlkcG9pbnQgLSAodGhpcy5odG1sRWxlbWVudC5vZmZzZXRXaWR0aCAvIDIpO1xyXG4gICAgICAgIGxldCB0b3BQb3NpdGlvbiA9IHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyAxMDtcclxuXHJcbiAgICAgICAgdGhpcy5odG1sRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdFBvc2l0aW9ufXB4YDtcclxuICAgICAgICB0aGlzLmh0bWxFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcFBvc2l0aW9ufXB4YDtcclxuICAgIH1cclxufSIsImltcG9ydCB7IE1lZGlhSW5wdXR0ZXIgfSBmcm9tIFwiQC9jb21wb25lbnRzL21lZGlhLWlucHV0dGVyL01lZGlhSW5wdXR0ZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNZWRpYUlucHV0dGVyQnVpbGRlciB7XHJcbiAgICBzdGF0aWMgYnVpbGQoKTogTWVkaWFJbnB1dHRlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lZGlhSW5wdXR0ZXIgPSBuZXcgTWVkaWFJbnB1dHRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gbWVkaWFJbnB1dHRlcjtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEVkaXRvciB9IGZyb20gXCJAL2NvbXBvbmVudHMvZWRpdG9yL0VkaXRvclwiO1xyXG5pbXBvcnQgeyBBZGRCbG9ja0J1aWxkZXIgfSBmcm9tIFwiLi9BZGRCbG9ja0J1aWxkZXJcIjtcclxuaW1wb3J0IHsgVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyIH0gZnJvbSBcIi4vVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFF1aWNrTWVudUJ1aWxkZXIgfSBmcm9tIFwiLi9RdWlja01lbnVCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRpdGxlQnVpbGRlciB9IGZyb20gXCIuL1RpdGxlQnVpbGRlclwiO1xyXG5pbXBvcnQgeyBDb250ZW50QnVpbGRlciB9IGZyb20gXCIuL0NvbnRlbnRCdWlsZGVyXCI7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIgfSBmcm9tIFwiLi9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJCdWlsZGVyXCI7XHJcbmltcG9ydCB7IE1lZGlhSW5wdXR0ZXJCdWlsZGVyIH0gZnJvbSBcIi4vTWVkaWFJbnB1dHRlckJ1aWxkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0b3JCdWlsZGVyIHtcclxuXHJcbiAgICBzdGF0aWMgYnVpbGQoKTogRWRpdG9yIHtcclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gRWRpdG9yLmdldEluc3RhbmNlKFxyXG4gICAgICAgICAgICBUaXRsZUJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQ29udGVudEJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgQWRkQmxvY2tCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRleHRDb250ZXh0RmxvYXRpbmdUb29sYmFyQnVpbGRlci5idWlsZCgpLFxyXG4gICAgICAgICAgICBRdWlja01lbnVCdWlsZGVyLmJ1aWxkKCksXHJcbiAgICAgICAgICAgIFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIuYnVpbGQoKSxcclxuICAgICAgICAgICAgTWVkaWFJbnB1dHRlckJ1aWxkZXIuYnVpbGQoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiBlZGl0b3I7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9lZGl0b3IvRWRpdG9yXCI7XHJcbmltcG9ydCBpY29ucyBmcm9tIFwiLi4vYXNzZXRzL2ltZy9pY29ucy5zdmdcIjtcclxuaW1wb3J0IHsgRWRpdG9yQnVpbGRlciB9IGZyb20gXCIuL0VkaXRvckJ1aWxkZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBTaW5nbGV0b24gY2xhc3MgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIGFuZCBtYW5hZ2luZyB0aGUgdXNlciBpbnRlcmZhY2Ugb2YgdGhlIGVkaXRvci5cclxuICogRW5zdXJlcyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFVJQnVpbGRlciBjYW4gZXhpc3QsIG1hbmFnaW5nIHRoZSBjcmVhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFVJQnVpbGRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFVJQnVpbGRlcjtcclxuXHJcbiAgICBwcml2YXRlIGVkaXRvcjogRWRpdG9yO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBmb3IgVUlCdWlsZGVyIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBJbml0aWFsaXplcyB0aGUgVUlCdWlsZGVyIGluc3RhbmNlIHdpdGggYSBnaXZlbiBlZGl0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VkaXRvcn0gZWRpdG9yIFRoZSBlZGl0b3IgaW5zdGFuY2UgdG8gYmUgbWFuYWdlZCBieSBVSUJ1aWxkZXIuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIGFuIGluc3RhbmNlIG9mIFVJQnVpbGRlciBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihlZGl0b3I6IEVkaXRvcikge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XHJcblxyXG4gICAgICAgIFVJQnVpbGRlci5pbnN0YW5jZSA9IHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIGdldCBvciBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVUlCdWlsZGVyLlxyXG4gICAgICogVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgc2luZ2xldG9uIHBhdHRlcm4gYW5kIGVuc3VyZXMgdGhhdCBVSUJ1aWxkZXIgaXMgb25seSBpbnN0YW50aWF0ZWQgb25jZS5cclxuICAgICAqIEByZXR1cm5zIHtVSUJ1aWxkZXJ9IFJldHVybnMgdGhlIGV4aXN0aW5nIG9yIG5ldyBVSUJ1aWxkZXIgaW5zdGFuY2UuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBidWlsZCgpOiBVSUJ1aWxkZXIge1xyXG5cclxuICAgICAgICBpZiAoVUlCdWlsZGVyLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBVSUJ1aWxkZXIuaW5zdGFuY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFVJQnVpbGRlcihFZGl0b3JCdWlsZGVyLmJ1aWxkKCkpO1xyXG5cclxuICAgICAgICByZXR1cm4gYnVpbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgYnkgaW5zZXJ0aW5nIG5lY2Vzc2FyeSBpY29ucyBhbmQgcmV0dXJuaW5nIHRoZSBlZGl0b3IgaW5zdGFuY2UuXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHRvIHN0YXJ0IHRoZSBlZGl0b3IgYW5kIHByZXBhcmUgYWxsIFVJIGNvbXBvbmVudHMuXHJcbiAgICAgKiBAcmV0dXJucyB7RWRpdG9yfSBUaGUgaW5pdGlhbGl6ZWQgZWRpdG9yIGluc3RhbmNlLlxyXG4gICAgICovXHJcbiAgICBzdGFydCgpOiBFZGl0b3Ige1xyXG5cclxuICAgICAgICB0aGlzLmluc2VydEljb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogSW5zZXJ0cyBhIGNvbnRhaW5lciB3aXRoIFNWRyBpY29ucyBpbnRvIHRoZSBkb2N1bWVudCBib2R5LiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXRcclxuICAgICogdGhlIGljb25zIGFyZSBvbmx5IGluc2VydGVkIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgZW50cmllcy5cclxuICAgICovXHJcbiAgICBpbnNlcnRJY29ucygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdmctaWNvbnMtY29udGFpbmVyJykpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3ZnQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgICAgICBzdmdDb250YWluZXIuaW5uZXJIVE1MID0gaWNvbnM7XHJcbiAgICAgICAgICAgIHN2Z0NvbnRhaW5lci5jbGFzc05hbWUgPSAnc3ZnLWljb25zLWNvbnRhaW5lcic7XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN2Z0NvbnRhaW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBDb21tYW5kcyB9IGZyb20gXCIuL0NvbW1hbmRzXCI7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9ibG9jay1vcGVyYXRpb25zL0Jsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCIuL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xyXG5pbXBvcnQgeyBJQmxvY2tPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCJAL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcclxuaW1wb3J0IHsgSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90YWJsZS1vcGVyYXRpb25zL0lUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElUZXh0T3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy90ZXh0LW9wZXJhdGlvbnMvSVRleHRPcGVyYXRpb25zU2VydmljZVwiO1xyXG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCJAL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVTY29wZXNcIjtcclxuaW1wb3J0IHsgQ29sb3JzIH0gZnJvbSBcIkAvY29tbW9uL0NvbG9yc1wiO1xyXG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIENlbnRyYWwgY29tbWFuZCBkaXNwYXRjaGVyIGNsYXNzIGZvciBoYW5kbGluZyB2YXJpb3VzIGVkaXRvciBjb21tYW5kcyByZWxhdGVkIHRvIHRleHQgYW5kIGJsb2NrIG1hbmlwdWxhdGlvbi5cclxuICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG5lZWRlZCB0byBleGVjdXRlIGNvbW1hbmRzIHN1Y2ggYXMgYm9sZCwgaXRhbGljLCB1bmRlcmxpbmUsIGNvbG9yIGNoYW5nZXMsIGFuZCBzdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgdG8gY29udGVudCBibG9ja3Mgd2l0aGluIGFuIGVkaXRvci5cclxuICpcclxuICogQGNsYXNzXHJcbiAqIEBzaW5nbGV0b25cclxuICogTWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSB0cmlnZ2VyZWQgYnkgZXZlbnQgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIGZvciBjdXN0b20gZXZlbnRzIHdoaWNoIGRpY3RhdGUgdGhlIHR5cGUgb2YgY29tbWFuZCB0byBiZSBleGVjdXRlZC5cclxuICpcclxuICogRXhhbXBsZSB1c2FnZTpcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiBjb25zdCBjb21tYW5kRGlzcGF0Y2hlciA9IENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCk7XHJcbiAqIGNvbW1hbmREaXNwYXRjaGVyLmxpc3RlbigpOyAgLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBjb21tYW5kIGFuZCBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy5cclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpc3BhdGNoZXIge1xyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tYW5kRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgYmxvY2tPcGVyYXRpb25zU2VydmljZTogSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U7XHJcbiAgICBwcml2YXRlIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2U6IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSB0ZXh0T3BlcmF0aW9uc1NlcnZpY2U6IElUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGVuZm9yY2Ugc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgYXR0ZW1wdGVkIHRvIGJlIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcclxuICAgICAgICBibG9ja09wZXJhdGlvbnNTZXJ2aWNlOiBJQmxvY2tPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0ZXh0T3BlcmF0aW9uU2VydmljZTogSVRleHRPcGVyYXRpb25zU2VydmljZSxcclxuICAgICAgICB0YWJsZU9wZXJhdGlvbnNTZXJ2aWNlOiBJVGFibGVPcGVyYXRpb25zU2VydmljZSkge1xyXG5cclxuICAgICAgICBpZiAoQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0ZW1wdCB0byBpbnN0YW50aWF0ZSBzaW5nbGV0b24gYENvbW1hbmREaXNwYXRjaGVyYCBtb3JlIHRoYW4gb25jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBibG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xyXG4gICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlID0gdGV4dE9wZXJhdGlvblNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlID0gdGFibGVPcGVyYXRpb25zU2VydmljZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHJpZXZlcyBvciBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbW1hbmREaXNwYXRjaGVyLlxyXG4gICAgICogQHJldHVybnMge0NvbW1hbmREaXNwYXRjaGVyfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDb21tYW5kRGlzcGF0Y2hlci5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb21tYW5kRGlzcGF0Y2hlciB7XHJcblxyXG4gICAgICAgIGNvbnN0IGJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUJsb2NrT3BlcmF0aW9uc1NlcnZpY2U+KFwiSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcbiAgICAgICAgY29uc3QgdGV4dE9wZXJhdGlvblNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRleHRPcGVyYXRpb25zU2VydmljZT4oXCJJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlXCIpO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SVRhYmxlT3BlcmF0aW9uc1NlcnZpY2U+KFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIik7XHJcblxyXG4gICAgICAgIGlmICghQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2UgPSBuZXcgQ29tbWFuZERpc3BhdGNoZXIoYmxvY2tPcGVyYXRpb25zU2VydmljZSwgdGV4dE9wZXJhdGlvblNlcnZpY2UsIHRhYmxlT3BlcmF0aW9uc1NlcnZpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gQ29tbWFuZERpc3BhdGNoZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBsaXN0ZW5lcnMgZm9yIHZhcmlvdXMgZWRpdG9yLXJlbGF0ZWQgZXZlbnRzIHN1Y2ggYXMgY29tbWFuZCByZXF1ZXN0cyBhbmQgc2VsZWN0aW9uIGNoYW5nZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHRoaXMuaGFuZGxlQ29tbWFuZEV2ZW50IGFzIEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQ3VzdG9tRXZlbnRzLmZvY3VzT25GaXJzdFJlcXVlc3RlZCwgdGhpcy5oYW5kbGVGb2N1c09uRmlyc3RSZXF1ZXN0ZWRFdmVudCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihDdXN0b21FdmVudHMucHJlc3NlZEVudGVyT25UaXRsZSwgKCkgPT4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmNyZWF0ZUFOZXdQYXJhZ3JhcGhGcm9tVGl0bGUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIGNvbW1hbmQgZXZlbnRzIGRpc3BhdGNoZWQgZnJvbSBVSSBjb21wb25lbnRzIG9yIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD59IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGNvbW1hbmQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29tbWFuZEV2ZW50ID0gKGV2ZW50OiBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPik6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgY29tbWFuZCwgc2hvd1VJLCB2YWx1ZSwgdGFyZ2V0QmxvY2tUeXBlLCBibG9jaywgc2NvcGUgfSA9IGV2ZW50LmRldGFpbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmxpbmtSZWFkeVRvSW5zZXJ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5saW5rUmVhZHlUb0luc2VydH0gcmVxdWlyZXMgdmFsdWVgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dE9wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNJbnNlcnRMaW5rKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVMaW5rOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1RvZ2dsZUxpbmsoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVCb2xkOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0JvbGQoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJbmxpbmVDb2RlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0lubGluZUNvZGUoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVJdGFsaWM6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjSXRhbGljKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudG9nZ2xlVW5kZXJsaW5lOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY1VuZGVybGluZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZVN0cmlrZVRocm91Z2g6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPcGVyYXRpb25zU2VydmljZS5leGVjU3RyaWtlVGhyb3VnaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLnRvZ2dsZUhpbGl0ZUNvbG9yOlxyXG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy50b2dnbGVIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0hpbGl0ZUNvbG9yKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUZvcmVDb2xvcn0gcmVxdWlyZXMgYSBjb2xvciB2YWx1ZWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0T3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvcmVDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMudHJhbnNmb3JtQmxvY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IGVsZW1lbnQgdHlwZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRyYW5zZm9ybUJsb2NrfSByZXF1aXJlcyBhIGJsb2NrLmApO1xyXG4gICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLnRyYW5zZm9ybUJsb2NrKHZhbHVlLCBibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuZHVwbGljYXRlQmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0R1cGxpY2F0ZUJsb2NrKGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjRGVsZXRlQmxvY2soYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5kZWxldGVCbG9ja0FuZEZvY3VzT25OZXh0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNEZWxldGVBbmRGb2N1c09uTmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmZvY3VzT25OZXh0QmxvY2s6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0ZvY3VzT25OZXh0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlRm9ybWF0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjUmVtb3ZlRm9ybWF0KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLkp1c3RpZnlMZWZ0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5TGVmdH0gcmVxdWlyZXMgYSBibG9jayB0byBqdXN0aWZ5LmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmp1c3RpZnlMZWZ0KGJsb2NrKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5KdXN0aWZ5Q2VudGVyOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5Q2VudGVyfSByZXF1aXJlcyBhIGJsb2NrIHRvIGp1c3RpZnkuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuanVzdGlmeUNlbnRlcihibG9jayk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuSnVzdGlmeVJpZ2h0OlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5KdXN0aWZ5UmlnaHR9IHJlcXVpcmVzIGEgYmxvY2sgdG8ganVzdGlmeS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5qdXN0aWZ5UmlnaHQoYmxvY2spO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlOlxyXG4gICAgICAgICAgICAgICAgaWYgKCFibG9jaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtDb21tYW5kcy5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZX0gcmVxdWlyZXMgYSBibG9jayB0byBjaGFuZ2UgYSBjb2RlIGJsb2NrIGxhbmd1YWdlLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ29kZUJsb2NrTGFuZ3VhZ2V9IHJlcXVpcmVzIGEgdmFsdWUgdG8gY2hhbmdlIGEgY29kZSBibG9jayBsYW5ndWFnZS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jaGFuZ2VDb2RlQmxvY2tMYW5ndWFnZShibG9jaywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY3JlYXRlRGVmYXVsdEJsb2NrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydE5ldzpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0luc2VydE5ldyhjb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5mb2N1c09uUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuZXhlY0ZvY3VzT25QcmV2aW91c0Jsb2NrKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLm1lcmdlV2l0aE5leHRCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoTmV4dEJsb2NrKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMubWVyZ2VXaXRoUHJldmlvdXNCbG9jazpcclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjTWVyZ2VXaXRoUHJldmlvdXNCbG9jaygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1uTGVmdDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5MZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW5SaWdodDpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRDb2x1bW5SaWdodChibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5pbnNlcnRUYWJsZVJvd0Fib3ZlOlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmluc2VydFJvd0Fib3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdzpcclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5pbnNlcnRSb3dCZWxvdyhibG9jayB8fCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy50b2dnbGVDZWxsSGlsaXRlQ29sb3I6XHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLnRvZ2dsZUNlbGxIaWxpdGVDb2xvcn0gcmVxdWlyZXMgYSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbGwgYmFja2dyb3VuZCBjb2xvci5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudGFibGVPcGVyYXRpb25zU2VydmljZS5leGVjQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcjpcclxuICAgICAgICAgICAgICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvcn0gcmVxdWlyZXMgYSBibG9jay5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmNoYW5nZUNhbGxvdXRCYWNrZ3JvdW5kQ29sb3J9IHJlcXVpcmVzIGEgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ2hhbmdlQ2FsbG91dEJhY2tncm91bmQoYmxvY2ssIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVDb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlQ29sdW1uKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBDb21tYW5kcy5yZW1vdmVSb3c6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UucmVtb3ZlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgQ29tbWFuZHMucmVtb3ZlUm93OlxyXG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLnJlbW92ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIENvbW1hbmRzLmNoYW5nZVRhYmxlQm9yZGVyQ29sb3I6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuY2hhbmdlVGFibGVCb3JkZXJDb2xvcihzY29wZSBhcyBUYWJsZVNjb3BlcywgdmFsdWUgYXMgQ29sb3JzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlQ29sdW1uRWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2spO1xyXG4gICAgICAgICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIC8vIGNhc2UgQ29tbWFuZHMuc2hvd0luc2VydFRhYmxlUm93RWxlbWVudDpcclxuICAgICAgICAgICAgLy8gICAgIGlmICghYmxvY2spIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Q29tbWFuZHMuaW5zZXJ0VGFibGVDb2x1bW59IHJlcXVpcmVzIGEgYmxvY2sgd2l0aCBhIHRhcmdldCB0YWJsZSBpbnNpZGUuYCk7XHJcbiAgICAgICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnRhYmxlT3BlcmF0aW9uc1NlcnZpY2Uuc2hvd0luc2VydExpbmVFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAvLyBjYXNlIENvbW1hbmRzLmhpZGVJbnNlcnRUYWJsZVJvd0VsZW1lbnQ6XHJcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWJsb2NrKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0NvbW1hbmRzLmluc2VydFRhYmxlQ29sdW1ufSByZXF1aXJlcyBhIGJsb2NrIHdpdGggYSB0YXJnZXQgdGFibGUgaW5zaWRlLmApO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgdGhpcy50YWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmhpZGVJbnNlcnRSb3dFbGVtZW50KGJsb2NrKTtcclxuICAgICAgICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm8gYWN0aW9uIGRlZmluZWQgZm9yIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBleGVjVHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UudHJhbnNmb3JtQmxvY2sodGFyZ2V0QmxvY2tUeXBlKTtcclxuICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIGV4ZWNSZW1vdmVGb3JtYXQoY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5ub3JtYWxpemUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjQ3JlYXRlRGVmYXVsdEJsb2NrKGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjSW5zZXJ0TmV3KGNvbW1hbmQ6IENvbW1hbmRzKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tPcGVyYXRpb25zU2VydmljZS5jcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleGVjRm9jdXNPblByZXZpb3VzQmxvY2soY29tbWFuZDogQ29tbWFuZHMpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ibG9ja09wZXJhdGlvbnNTZXJ2aWNlLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIGhhbmRsZUZvY3VzT25GaXJzdFJlcXVlc3RlZEV2ZW50ID0gKGNvbW1hbmQ6IENvbW1hbmRzKTogdm9pZCA9PiB7XHJcbiAgICAvLyAgICAgLy8gYWxlcnQoXCJmb2N1cyBvbiBmaXJzdFwiKTtcclxuICAgIC8vICAgICB0aGlzLmJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UpO1xyXG4gICAgLy8gfVxyXG59XHJcbiIsImltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgSUNvbW1hbmRFdmVudERldGFpbCB9IGZyb20gXCJAL2NvbW1hbmRzL0lDb21tYW5kRXZlbnREZXRhaWxcIjtcclxuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xyXG5pbXBvcnQgeyBFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiQC9zZXJ2aWNlcy9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gXCIuL0lTaG9ydGN1dExpc3RlbmVyc1wiO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZXMga2V5Ym9hcmQgc2hvcnRjdXQgbGlzdGVuaW5nIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbiB0byBlbnN1cmVcclxuICogdGhhdCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBpcyBjZW50cmFsaXplZCBhbmQgdGhhdCBtdWx0aXBsZSBpbnN0YW5jZXMgZG8gbm90IGR1cGxpY2F0ZSBldmVudCBsaXN0ZW5lcnMuXHJcbiAqIEl0IGludGVyY2VwdHMga2V5ZG93biBldmVudHMgYW5kIGRpc3BhdGNoZXMgY29tbWFuZHMgYmFzZWQgb24gc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucywgZW5oYW5jaW5nIHRleHQgZWRpdGluZ1xyXG4gKiBjYXBhYmlsaXRpZXMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi5cclxuICogXHJcbiAqIFRoZSBjbGFzcyBpbml0aWFsaXplcyBpdHNlbGYgdGhlIGZpcnN0IHRpbWUgYGdldEluc3RhbmNlYCBpcyBjYWxsZWQgYW5kIHN1YnNlcXVlbnRseSBtYW5hZ2VzIGFsbCBrZXlib2FyZCBzaG9ydGN1dHNcclxuICogdGhyb3VnaCBhIHNpbmdsZSBpbnN0YW5jZS5cclxuICogXHJcbiAqIFVzYWdlIG9mIHRoaXMgY2xhc3Mgb3V0c2lkZSBvZiBpdHMgc2luZ2xldG9uIHBhdHRlcm4gaXMgcmVzdHJpY3RlZCB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlcywgd2hpY2ggaXMgZW5mb3JjZWRcclxuICogYnkgdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBkaXJlY3RseSBhZnRlciBpbml0aWFsaXphdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaG9ydGN1dExpc3RlbmVycyBpbXBsZW1lbnRzIElTaG9ydGN1dExpc3RlbmVycyB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIb2xkcyB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIFNob3J0Y3V0TGlzdGVuZXJzLCBlbnN1cmluZyB0aGUgc2luZ2xldG9uIHBhdHRlcm4uXHJcbiAgICAgKiBAdHlwZSB7U2hvcnRjdXRMaXN0ZW5lcnMgfCBudWxsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFNob3J0Y3V0TGlzdGVuZXJzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbiBvdXRzaWRlIG9mIHRoZSBzaW5nbGV0b24gY29udGV4dC4gSW5pdGlhbGl6ZXMgdGhlXHJcbiAgICAgKiBzaG9ydGN1dCBsaXN0ZW5lciBzZXR1cCBieSBjYWxsaW5nIHRoZSBgbGlzdGVuYCBtZXRob2QsIGVuc3VyaW5nIGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UuXHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRpcmVjdGx5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxpc3RlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0TGlzdGVuKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibGlzdGVuaW5nIGtleWJvYXJkIHNob3J0Y3V0c1wiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBTaG9ydGN1dExpc3RlbmVycyBjbGFzcy4gSWYgdGhlIGluc3RhbmNlIGRvZXMgbm90XHJcbiAgICAgKiBleGlzdCwgaXQgY3JlYXRlcyBhbmQgcmV0dXJucyBpdCwgZW5zdXJpbmcgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Nob3J0Y3V0TGlzdGVuZXJzfSBUaGUgc2luZ2xlIHNoYXJlZCBpbnN0YW5jZSBvZiB0aGUgU2hvcnRjdXRMaXN0ZW5lcnMgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBTaG9ydGN1dExpc3RlbmVycyB7XHJcbiAgICAgICAgaWYgKFNob3J0Y3V0TGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTaG9ydGN1dExpc3RlbmVycy5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgU2hvcnRjdXRMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQXR0YWNoZXMgYSBnbG9iYWwgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50IHRvIGludGVyY2VwdCBrZXlkb3duIGV2ZW50cyBhbmQgcGVyZm9ybSBzcGVjaWZpYyB0ZXh0IHRyYW5zZm9ybWF0aW9uXHJcbiAgICAqIGNvbW1hbmRzIGJhc2VkIG9uIHRoZSBjb21iaW5hdGlvbiBvZiBrZXlzIHByZXNzZWQuIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZW5oYW5jZSB0ZXh0IGVkaXRpbmcgY2FwYWJpbGl0aWVzXHJcbiAgICAqIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbiBieSBwcm92aWRpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIGZvciB2YXJpb3VzIHRleHQgZm9ybWF0dGluZyBhbmQgZWRpdGluZyBhY3Rpb25zLlxyXG4gICAgKlxyXG4gICAgKiBUaGUgZnVuY3Rpb24gdXNlcyBhIGNvbWJpbmF0aW9uIG9mIEN0cmwsIEFsdCAob3IgQWx0R3JhcGgpLCBTaGlmdCwgYW5kIHNwZWNpZmljIGtleXMgdG8gZGV0ZXJtaW5lIHRoZSBhY3Rpb24gdG8gYmVcclxuICAgICogdGFrZW4uIEl0IGhhbmRsZXMgdHJhbnNmb3JtYXRpb24gaW50byBkaWZmZXJlbnQgYmxvY2sgdHlwZXMgbGlrZSBwYXJhZ3JhcGhzLCBjaGVja2xpc3RzLCBudW1iZXJlZCBsaXN0cywgaGVhZGVycywgZXRjLixcclxuICAgICogYXMgd2VsbCBhcyBibG9jayBkdXBsaWNhdGlvbiBhbmQgZGVsZXRpb24uXHJcbiAgICAqXHJcbiAgICAqIFByZXZlbnREZWZhdWx0IGFuZCBzdG9wUHJvcGFnYXRpb24gYXJlIGNhbGxlZCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGtleSBhY3Rpb25zIGFuZCBidWJibGluZyBvZiBldmVudHMsIGVuc3VyaW5nIHRoYXRcclxuICAgICogb25seSB0aGUgaW50ZW5kZWQgYWN0aW9ucyBhcmUgZXhlY3V0ZWQuXHJcbiAgICAqXHJcbiAgICAqIFN1cHBvcnRlZCBTaG9ydGN1dHM6XHJcbiAgICAqIC0gQ3RybCtTaGlmdCtFbnRlcjogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgcGFyYWdyYXBoLlxyXG4gICAgKiAtIEN0cmwrU2hpZnQrMSBvciBDdHJsK1NoaWZ0K051bXBhZDEgKE51bUxvY2sgb24pOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBjaGVja2xpc3QuXHJcbiAgICAqIC0gQ3RybCtTaGlmdCsuIDogVHJhbnNmb3JtcyB0aGUgY3VycmVudCBibG9jayBpbnRvIGEgYnVsbGV0ZWQgbGlzdC5cclxuICAgICogLSBDdHJsK1NoaWZ0Ky8gOiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gYSBudW1iZXJlZCBsaXN0LlxyXG4gICAgKiAtIEN0cmwrQWx0KzEgdGhyb3VnaCBDdHJsK0FsdCs2OiBUcmFuc2Zvcm1zIHRoZSBjdXJyZW50IGJsb2NrIGludG8gaGVhZGVycyAoSDEgdGhyb3VnaCBINikuXHJcbiAgICAqIC0gQ3RybCtEOiBEdXBsaWNhdGVzIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIFNoaWZ0K0RlbGV0ZSBvciBTaGlmdCtCYWNrc3BhY2U6IERlbGV0ZXMgdGhlIGN1cnJlbnQgYmxvY2suXHJcbiAgICAqIC0gQ3RybCtcXCA6IENsZWFycyBmb3JtYXR0aW5nIG9mIHRoZSBjdXJyZW50IGJsb2NrLlxyXG4gICAgKiAtIEN0cmwrQWx0K0RpZ2l0MTogUHJldmVudHMgY2hhcmFjdGVyIGluc2VydGlvbiB3aGVuIHVzaW5nIHRoZSB0b3Agcm93ICcxJywgc3BlY2lmaWMgdG8gbGF5b3V0IGNvbmZpZ3VyYXRpb25zLlxyXG4gICAgKlxyXG4gICAgKiBFYWNoIGFjdGlvbiBkaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggZGV0YWlscyBhYm91dCB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCwgd2hpY2ggc2hvdWxkIGJlIGhhbmRsZWQgYnlcclxuICAgICogQ29tbWFuZERpc3BhdGNoZXIuXHJcbiAgICAqXHJcbiAgICAqIEBleGFtcGxlXHJcbiAgICAqIC8vIEluaXRpYWxpemUgYW5kIGFjdGl2YXRlIHRoZSBzaG9ydGN1dHMgYWNyb3NzIHRoZSBkb2N1bWVudC5cclxuICAgICogY29uc3Qgc2hvcnRjdXRMaXN0ZW5lciA9IFNob3J0Y3V0TGlzdGVuZXJzLmdldEluc3RhbmNlKCk7XHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBsaXN0ZW4oKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgS2V5OiAke2V2ZW50LmtleX0sIENvZGU6ICR7ZXZlbnQuY29kZX0sIEN0cmw6ICR7ZXZlbnQuY3RybEtleX0sIEFsdDogJHtldmVudC5hbHRLZXl9LCBBbHRHcjogJHtldmVudC5rZXkgPT09ICdBbHRHcmFwaCd9LCBOdW1Mb2NrOiAke2V2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ051bUxvY2snKX1gKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGlzTnVtUGFkID0gZXZlbnQuY29kZS5zdGFydHNXaXRoKFwiTnVtcGFkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBudW1Mb2NrT24gPSBldmVudC5nZXRNb2RpZmllclN0YXRlKFwiTnVtTG9ja1wiKTtcclxuXHJcbiAgICAgICAgICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBwYXJhZ3JhcGggd2hlbiBwcmVzc2luZyBDdHJsK1NoaWZ0K0VudGVyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgYWxlcnQoXCJjb252ZXJ0byBwYXJhIHBhcmFncmFmb1wiKTtcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEhcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5hbHRLZXkgJiYgKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQxXCIgfHwgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQxXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBjaGVja2xpc3Qgd2hlbiBwcmVzc2luZyAgQ3RybCtTaGlmdCsxXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1RcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgPT09IFwiLlwiKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBidWxsZXRlZCBsaXN0IHdoZW4gcHJlc3NpbmcgIEN0cmwrU2hpZnQrLlxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CVUxMRVRFRF9MSVNUXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmICFldmVudC5zaGlmdEtleSAmJiAoZXZlbnQua2V5ID09PSBcIi9cIikpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIG51bWJlcmVkIGxpc3Qgd2hlbiBwcmVzc2luZyBDdHJsK1NoaWZ0Ky9cclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0MVwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkMVwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoMSB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzFcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzFcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDJcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDJcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDIgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCsyXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8yXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQzXCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQzXCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGgzIHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrM1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfM1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgKChldmVudC5jb2RlID09PSBcIkRpZ2l0NFwiKSB8fCAoaXNOdW1QYWQgJiYgbnVtTG9ja09uICYmIGV2ZW50LmNvZGUgPT09IFwiTnVtcGFkNFwiKSkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyB0byBoNCB3aGVuIHByZXNzaW5nIEN0cmwrQWx0KzRcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMudHJhbnNmb3JtQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJsb2NrVHlwZTogRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5ICYmICgoZXZlbnQuY29kZSA9PT0gXCJEaWdpdDVcIikgfHwgKGlzTnVtUGFkICYmIG51bUxvY2tPbiAmJiBldmVudC5jb2RlID09PSBcIk51bXBhZDVcIikpKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydHMgdG8gaDUgd2hlbiBwcmVzc2luZyBDdHJsK0FsdCs1XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnRyYW5zZm9ybUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCbG9ja1R5cGU6IEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl81XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5jdHJsS2V5ICYmIGV2ZW50LmFsdEtleSAmJiAoKGV2ZW50LmNvZGUgPT09IFwiRGlnaXQ2XCIpIHx8IChpc051bVBhZCAmJiBudW1Mb2NrT24gJiYgZXZlbnQuY29kZSA9PT0gXCJOdW1wYWQ2XCIpKSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnRzIHRvIGg2IHdoZW4gcHJlc3NpbmcgQ3RybCtBbHQrNlxyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy50cmFuc2Zvcm1CbG9jayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QmxvY2tUeXBlOiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgoZXZlbnQua2V5ID09PSBcIkRcIiB8fCBldmVudC5rZXkgPT09IFwiZFwiKSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgYmxvY2sgd2hlbiBwcmVzc2luZyBDdHJsK0RcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuZHVwbGljYXRlQmxvY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldmVudC5rZXkgPT09IFwiRGVsZXRlXCIgfHwgZXZlbnQua2V5ID09PSBcIkJhY2tzcGFjZVwiKSAmJiBldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgLy8gRGVsZXRlIGJsb2NrIHdoZW4gcHJlc3NpbmcgU2hpZnQrRGVsZXRlXHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLmRlbGV0ZUJsb2NrLFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiXFxcXFwiICYmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBmb3JtYXR0aW5nIHdoZW4gcHJlc3NpbmcgQ3RybCtcXFxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IENvbW1hbmRzLnJlbW92ZUZvcm1hdCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQuY29kZSA9PT0gXCJEaWdpdDFcIikge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBjaGFyYWN0ZXIgaW5zZXJ0aW9uIHdoZW4gdXNpbmcgdG9wIHJvdyAnMSdcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElDb21tYW5kRXZlbnREZXRhaWwgfSBmcm9tIFwiQC9jb21tYW5kcy9JQ29tbWFuZEV2ZW50RGV0YWlsXCI7XHJcbmltcG9ydCB7IElUYWJsZUxpc3RlbmVycyB9IGZyb20gXCIuL0lUYWJsZUxpc3RlbmVyc1wiO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudHMgfSBmcm9tIFwiQC9jb21tb24vQ3VzdG9tRXZlbnRzXCI7XHJcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSBcIkAvY29tbWFuZHMvQ29tbWFuZHNcIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgVGFibGVVdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9UYWJsZVV0aWxzXCI7XHJcbmltcG9ydCB7IEZvY3VzU3RhY2sgfSBmcm9tIFwiLi4vRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBJRm9jdXNTdGFjayB9IGZyb20gXCIuLi9JRm9jdXNTdGFja1wiO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIi4uL0RlcGVuZGVuY3lDb250YWluZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUxpc3RlbmVycyBpbXBsZW1lbnRzIElUYWJsZUxpc3RlbmVycyB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRhYmxlTGlzdGVuZXJzIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XHJcblxyXG4gICAgc2hvd25FbGVtZW50cyA9IG5ldyBNYXA8SFRNTFRhYmxlQ2VsbEVsZW1lbnQsIEhUTUxFbGVtZW50PigpO1xyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcbiAgICAgICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2spIHtcclxuXHJcbiAgICAgICAgaWYgKFRhYmxlTGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUYWJsZUV2ZW50TGlzdGVuZXJzLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XHJcblxyXG4gICAgICAgIHRoaXMubGlzdGVuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRMaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJsaXN0ZW5pbmcgdGFibGUgY2xpY2tzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUYWJsZUxpc3RlbmVycyB7XHJcblxyXG4gICAgICAgIGNvbnN0IGZvY3VzU3RhY2sgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUZvY3VzU3RhY2s+KFwiSUZvY3VzU3RhY2tcIik7XHJcbiAgICAgICAgaWYgKFRhYmxlTGlzdGVuZXJzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBUYWJsZUxpc3RlbmVycy5pbnN0YW5jZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgVGFibGVMaXN0ZW5lcnMoZm9jdXNTdGFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsaXN0ZW4oKSB7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgbGV0IHBhcmVudDogRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKChldmVudC50YXJnZXQgYXMgTm9kZSkubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IChldmVudC50YXJnZXQgYXMgTm9kZSkucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudCA9IChldmVudC50YXJnZXQgYXMgRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQ/LmNsb3Nlc3QoXCIuYWRkLXRhYmxlLWNvbHVtblwiKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBDb21tYW5kcy5pbnNlcnRUYWJsZUNvbHVtblJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazogcGFyZW50LmNsb3Nlc3QoXCIuYmxvY2tcIikgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHBhcmVudD8uY2xvc2VzdChcIi5hZGQtdGFibGUtcm93XCIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IG5ldyBDdXN0b21FdmVudDxJQ29tbWFuZEV2ZW50RGV0YWlsPihDdXN0b21FdmVudHMuZW1pdHRlZENvbW1hbmQsIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogQ29tbWFuZHMuaW5zZXJ0VGFibGVSb3dCZWxvdyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6IHBhcmVudC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBFbnN1cmUgdGhlIHRhcmdldCBpcyBhIHRhYmxlIGNlbGwgKHRkKSBhbmQgYSBjaGlsZCBvZiBhbiBlbGVtZW50IHdpdGggY2xhc3MgJ2Jsb2NrJ1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjZWxsID0gdGFyZ2V0LmNsb3Nlc3QoXCJ0ZFwiKTtcclxuICAgICAgICAvLyAgICAgaWYgKCFjZWxsIHx8ICFjZWxsLmNsb3Nlc3QoXCIuYmxvY2tcIikpIHJldHVybjsgXHJcblxyXG4gICAgICAgIC8vICAgICAvLyBHZXQgdGhlIGFzc29jaWF0ZWQgdGFibGUgKGFzc3VtaW5nIGEgdGFibGUgZXhpc3RzKVxyXG4gICAgICAgIC8vICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgLy8gICAgIGlmICghdGFibGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIElmIGFuIGVsZW1lbnQgaXMgYWxyZWFkeSBzaG93biBmb3IgdGhpcyBjZWxsLCBkbyBub3RoaW5nXHJcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLnNob3duRWxlbWVudHMuaGFzKGNlbGwpKSByZXR1cm47IC8vIFByZXZlbnQgZmxpY2tlcmluZ1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gQ2hlY2sgaWYgaW4gdGhlIGxhc3QgY29sdW1uIGFuZCBlbWl0IGV2ZW50XHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdENvbHVtbih0YWJsZSwgY2VsbCkpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGJsb2NrID0gY2VsbC5jbG9zZXN0KFwiLmJsb2NrXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZGV0YWlsOiB7IGNvbW1hbmQ6IENvbW1hbmRzLnNob3dJbnNlcnRUYWJsZUNvbHVtbkVsZW1lbnQsIGJsb2NrIH0sXHJcbiAgICAgICAgLy8gICAgICAgICB9KTtcclxuICAgICAgICAvLyAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLnNldChjZWxsLCBibG9jayk7IC8vIFRyYWNrIHRoZSBzaG93biBlbGVtZW50XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIGluIHRoZSBsYXN0IHJvdyBhbmQgZW1pdCBldmVudFxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RSb3codGFibGUsIGNlbGwpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBibG9jayA9IGNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5zaG93SW5zZXJ0VGFibGVSb3dFbGVtZW50LCBibG9jayB9LFxyXG4gICAgICAgIC8vICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5zZXQoY2VsbCwgYmxvY2spOyAvLyBUcmFjayB0aGUgc2hvd24gZWxlbWVudFxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0gZXZlbnQucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gICAgIC8vIEVuc3VyZSB0aGUgdGFyZ2V0IGlzIGEgdGFibGUgY2VsbCAodGQpIGFuZCBhIGNoaWxkIG9mIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAnYmxvY2snXHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNlbGwgPSB0YXJnZXQuY2xvc2VzdChcInRkXCIpO1xyXG4gICAgICAgIC8vICAgICBpZiAoIWNlbGwgfHwgIWNlbGwuY2xvc2VzdChcIi5ibG9ja1wiKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIHRhYmxlIChhc3N1bWluZyBhIHRhYmxlIGV4aXN0cylcclxuICAgICAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICAgIC8vICAgICBpZiAoIXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgICAgIC8vICAgICAvLyBDaGVjayBpZiB0aGUgbW91c2UgaXMgbGVhdmluZyB0aGUgbGFzdCBjb2x1bW4gY2VsbCBhbmQgbm90IGVudGVyaW5nIHRoZSBhZGQgY29sdW1uIGJ1dHRvblxyXG4gICAgICAgIC8vICAgICBpZiAoVGFibGVVdGlscy5pc0xhc3RDb2x1bW4odGFibGUsIGNlbGwpICYmICFyZWxhdGVkVGFyZ2V0Py5jbGFzc0xpc3QuY29udGFpbnMoXCJhZGQtdGFibGUtY29sdW1uXCIpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBzaG93bkVsZW1lbnQgPSB0aGlzLnNob3duRWxlbWVudHMuZ2V0KGNlbGwpO1xyXG4gICAgICAgIC8vICAgICAgICAgaWYgKHNob3duRWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PElDb21tYW5kRXZlbnREZXRhaWw+KEN1c3RvbUV2ZW50cy5lbWl0dGVkQ29tbWFuZCwge1xyXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICBkZXRhaWw6IHsgY29tbWFuZDogQ29tbWFuZHMuaGlkZUluc2VydFRhYmxlQ29sdW1uRWxlbWVudCwgYmxvY2s6IHNob3duRWxlbWVudCB9LFxyXG4gICAgICAgIC8vICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2hvd25FbGVtZW50cy5kZWxldGUoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgIH1cclxuXHJcbiAgICAgICAgLy8gICAgIC8vIENoZWNrIGlmIHRoZSBtb3VzZSBpcyBsZWF2aW5nIHRoZSBsYXN0IHJvdyBjZWxsIGFuZCBub3QgZW50ZXJpbmcgdGhlIGFkZCByb3cgYnV0dG9uXHJcbiAgICAgICAgLy8gICAgIGlmIChUYWJsZVV0aWxzLmlzTGFzdFJvdyh0YWJsZSwgY2VsbCkgJiYgIXJlbGF0ZWRUYXJnZXQ/LmNsYXNzTGlzdC5jb250YWlucyhcImFkZC10YWJsZS1yb3dcIikpIHtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IHNob3duRWxlbWVudCA9IHRoaXMuc2hvd25FbGVtZW50cy5nZXQoY2VsbCk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAoc2hvd25FbGVtZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQ8SUNvbW1hbmRFdmVudERldGFpbD4oQ3VzdG9tRXZlbnRzLmVtaXR0ZWRDb21tYW5kLCB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIGRldGFpbDogeyBjb21tYW5kOiBDb21tYW5kcy5oaWRlSW5zZXJ0VGFibGVSb3dFbGVtZW50LCBibG9jazogc2hvd25FbGVtZW50IH0sXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5zaG93bkVsZW1lbnRzLmRlbGV0ZShjZWxsKTtcclxuICAgICAgICAvLyAgICAgICAgIH1cclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiLi9JRm9jdXNTdGFja1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZvY3VzU3RhY2sgaW1wbGVtZW50cyBJRm9jdXNTdGFjayB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEZvY3VzU3RhY2s7XHJcbiAgICBwcml2YXRlIHN0YWNrOiBIVE1MRWxlbWVudFtdO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXBhY2l0eTogbnVtYmVyID0gMTA7XHJcblxyXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBGb2N1c1N0YWNrIHtcclxuICAgICAgICBpZiAoIUZvY3VzU3RhY2suaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgRm9jdXNTdGFjay5pbnN0YW5jZSA9IG5ldyBGb2N1c1N0YWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBGb2N1c1N0YWNrLmluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwdXNoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoID49IHRoaXMuY2FwYWNpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFjay5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YWNrLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBlZWsoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSUJsb2NrT3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IElFbGVtZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tIFwiLi4vZWxlbWVudC1mYWN0b3J5L0lFbGVtZW50RmFjdG9yeVNlcnZpY2VcIjtcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gXCIuLi9lbGVtZW50LWZhY3RvcnkvRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb250ZW50VHlwZXMgfSBmcm9tIFwiQC9jb21tb24vQ29udGVudFR5cGVzXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0N1c3RvbUV2ZW50c1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgSUZvY3VzU3RhY2sgfSBmcm9tIFwiQC9jb3JlL0lGb2N1c1N0YWNrXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IENvbW1vbkNsYXNzZXMgfSBmcm9tIFwiQC9jb21tb24vQ29tbW9uQ2xhc3Nlc1wiO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tPcGVyYXRpb25zU2VydmljZSBpbXBsZW1lbnRzIElCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50RmFjdG9yeVNlcnZpY2U6IElFbGVtZW50RmFjdG9yeVNlcnZpY2U7XG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcbiAgICBwcml2YXRlIGZvY3VzU3RhY2s6IElGb2N1c1N0YWNrO1xuXG4gICAgLy8gc3RhdGljIEJMT0NLX09QRVJBVElPTlMgPSB7XG4gICAgLy8gICAgIFRVUk5fSU5UTzogXCJ0dXJuSW50b1wiLFxuICAgIC8vICAgICBDUkVBVEVfREVGQVVMVF9CTE9DSzogXCJDcmVhdGVEZWZhdWx0QmxvY2tcIixcbiAgICAvLyAgICAgREVMRVRFX0ZPQ1VTX09OX1BSRVZJT1VTOiBcIkRlbGV0ZUFuZEZvY3VzT25QcmV2aW91c1wiLFxuICAgIC8vICAgICBERUxFVEVfRk9DVVNfT05fTkVYVDogXCJEZWxldGVBbmRGb2N1c09uTmV4dFwiLFxuICAgIC8vICAgICBGT0NVU19PTl9GSVJTVDogXCJGb2N1c09uRmlyc3RcIixcbiAgICAvLyAgICAgRk9DVVNfT05fUFJFVklPVVM6IFwiRm9jdXNPblByZXZpb3VzXCIsXG4gICAgLy8gICAgIEZPQ1VTX09OX05FWFQ6IFwiRm9jdXNPbk5leHRcIixcbiAgICAvLyAgICAgREVMRVRFOiBcImRlbGV0ZVwiLFxuICAgIC8vICAgICBEVVBMSUNBVEU6IFwiZHVwbGljYXRlXCIsXG4gICAgLy8gICAgIENPUFk6IFwiY29weVwiLFxuICAgIC8vICAgICBQQVNURTogXCJwYXRlc1wiLFxuICAgIC8vICAgICBDVVQ6IFwiY3V0XCIsXG4gICAgLy8gICAgIFJFTU9WRV9GT1JNQVQ6IFwicmVtb3ZlRm9ybWF0XCIsXG4gICAgLy8gICAgIFRSQU5TRk9STV9CTE9DSzogXCJ0cmFuc2Zvcm1CbG9ja1wiXG4gICAgLy8gfTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgICAgIGVsZW1lbnRGYWN0b3J5U2VydmljZTogSUVsZW1lbnRGYWN0b3J5U2VydmljZSxcbiAgICAgICAgZm9jdXNTdGFjazogSUZvY3VzU3RhY2ssXG4gICAgICAgIG1lbWVudG86IElNZW1lbnRvKSB7XG5cbiAgICAgICAgaWYgKEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlID0gZWxlbWVudEZhY3RvcnlTZXJ2aWNlO1xuICAgICAgICB0aGlzLmZvY3VzU3RhY2sgPSBmb2N1c1N0YWNrO1xuICAgICAgICB0aGlzLm1lbWVudG8gPSBtZW1lbnRvO1xuXG4gICAgICAgIEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UgPSB0aGlzO1xuICAgIH1cblxuICAgIGV4ZWNDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2hvd1VJOiBib29sZWFuLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5jb3B5U2VsZWN0ZWQpIHtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldFNlbGVjdGlvbiAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRUZXh0KS50aGVuKCgpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29waWVkRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NvcGllZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjb3BpZWRFdmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hlbiBjb3B5IHRleHQnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmN1dFNlbGVjdGVkKSB7XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRTZWxlY3Rpb24gJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5kZWxldGVGcm9tRG9jdW1lbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoICdyZXF1ZXN0SGlkZUZsb2F0aW5nVG9vbGJhcicsIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzZWxlY3RlZFRleHQpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gY3V0IHRleHQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucGFzdCkge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCkge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKS50aGVuKChwYXN0ZWRUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXN0ZWRUZXh0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZXF1ZXN0VXBkYXRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoc2VsZWN0aW9uRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRleHQgc2VsZWN0ZWQgb3IgY2xpcGJvYXJkIGVtcHR5LicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoZW4gcGFzdGluZyB0ZXh0OiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy50cmFuc2Zvcm1CbG9jaykge1xuXG4gICAgICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChibG9jayAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQmxvY2sodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMucmVtb3ZlRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoQ29tbWFuZHMucmVtb3ZlRm9ybWF0LCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29tbWFuZCA9PSBDb21tYW5kcy5kZWxldGVCbG9jaykge1xuXG4gICAgICAgIC8vICAgICB0aGlzLmRlbGV0ZUFuZEZvY3VzT25OZXh0KCk7XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tEZWxldGVkLCB7XG4gICAgICAgIC8vICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmNyZWF0ZURlZmF1bHRCbG9jaykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgfHwgbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVEZWZhdWx0QmxvY2soZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmZvY3VzT25GaXJzdEJsb2NrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAoZWxlbWVudCBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgPT0gQ29tbWFuZHMuZGVsZXRlQmxvY2tBbmRGb2N1c09uUHJldmlvdXMpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlRm9jdXNPblByZXZpb3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09IENvbW1hbmRzLmRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQpIHtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3ZlIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBjb2RlXCIpO1xuICAgICAgICAgICAgdGhpcy5leGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLkZPQ1VTX09OX1BSRVZJT1VTKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25QcmV2aW91cyhlbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmIChjb21tYW5kID09IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UuQkxPQ0tfT1BFUkFUSU9OUy5GT0NVU19PTl9ORVhUKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKGNvbW1hbmQgPT0gQmxvY2tPcGVyYXRpb25zU2VydmljZS5CTE9DS19PUEVSQVRJT05TLlRVUk5fSU5UTykge1xuXG4gICAgICAgIC8vICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIC8vICAgICB9XG5cbiAgICAgICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldERyYWdnYWJsZUVsZW1lbnRGcm9tU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gICAgIHRoaXMuZm9ybWF0QmxvY2soZWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gY29uc3Qgc2VsZWN0aW9uRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlcXVlc3RIaWRlRmxvYXRpbmdUb29sYmFyJywge1xuICAgICAgICAvLyAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgLy8gICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChzZWxlY3Rpb25FdmVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcXVlcnlDb21tYW5kU3RhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBlbGVtZW50RmFjdG9yeVNlcnZpY2UgPSBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlc29sdmU8SUVsZW1lbnRGYWN0b3J5U2VydmljZT4oXCJJRWxlbWVudEZhY3RvcnlTZXJ2aWNlXCIpO1xuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlKGVsZW1lbnRGYWN0b3J5U2VydmljZSwgZm9jdXNTdGFjaywgbWVtZW50byk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0RHJhZ2dhYmxlRWxlbWVudEZyb21TZWxlY3Rpb24oKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudDogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnQgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhZ2dhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0b3JuYXIgbnVsbCBzZSBuZW5odW1hIHNlbGXDp8OjbyB2w6FsaWRhIGZvciBlbmNvbnRyYWRhIG91IG5lbmh1bSBlbGVtZW50byBjb3JyZXNwb25kZW50ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvLyBzdGF0aWMgZ2V0VGFnTmFtZUJ5Q29tbWFuZE5hbWUoY29tbWFuZE5hbWU6IHN0cmluZykge1xuICAgIC8vICAgICBzd2l0Y2ggKGNvbW1hbmROYW1lKSB7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9QYXJhZ3JhcGhcIjpcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gXCJwXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgxXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IMlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgyXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9IM1wiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImgzXCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INFwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg0XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INVwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg1XCI7XG4gICAgLy8gICAgICAgICBjYXNlIFwidHVybkludG9INlwiOlxuICAgIC8vICAgICAgICAgICAgIHJldHVybiBcImg2XCI7XG5cbiAgICAvLyAgICAgICAgIGRlZmF1bHQ6XG4gICAgLy8gICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJFcnJvclwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuXG4gICAgZXhlY01lcmdlV2l0aFByZXZpb3VzQmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNDb250ZW50RWRpdGFibGUgPSBET01VdGlscy5nZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZShjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCA9IHByZXZpb3VzQ29udGVudEVkaXRhYmxlLmlubmVySFRNTCArIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5jbG9zZXN0KFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGN1cnJlbnRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkQ2FyZXRQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhckluZGV4OiBjYXJldFBvc2l0aW9uLmNoYXJJbmRleCArIHByZXZpb3VzQ29udGVudEVkaXRhYmxlLnRleHRDb250ZW50IS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxQb3M6IGNhcmV0UG9zaXRpb24uaG9yaXpvbnRhbFBvc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKHByZXZpb3VzQ29udGVudEVkaXRhYmxlLCBhZGp1c3RlZENhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNNZXJnZVdpdGhOZXh0QmxvY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudEVkaXRhYmxlID0gRE9NVXRpbHMuZ2V0QWN0aXZlQ29udGVudEVkaXRhYmxlKCk7XG4gICAgICAgIGlmICghY3VycmVudENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dENvbnRlbnRFZGl0YWJsZSA9IERPTVV0aWxzLmdldE5leHRDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIGlmICghbmV4dENvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NVXRpbHMuc2FuaXRpemVDb250ZW50RWRpdGFibGUoY3VycmVudENvbnRlbnRFZGl0YWJsZSk7XG4gICAgICAgIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKG5leHRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdEVuZE9mRWRpdGFibGVFbGVtZW50KGN1cnJlbnRDb250ZW50RWRpdGFibGUpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXJldFBvc2l0aW9uID0gRE9NVXRpbHMuc2F2ZUNhcmV0UG9zaXRpb24yZChjdXJyZW50Q29udGVudEVkaXRhYmxlKTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50RWRpdGFibGUuaW5uZXJIVE1MID0gY3VycmVudENvbnRlbnRFZGl0YWJsZS5pbm5lckhUTUwgKyBuZXh0Q29udGVudEVkaXRhYmxlLmlubmVySFRNTDtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCJsaVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbSA9IG5leHRDb250ZW50RWRpdGFibGUuY2xvc2VzdChcImxpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBuZXh0Q29udGVudEVkaXRhYmxlLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjJkKGN1cnJlbnRDb250ZW50RWRpdGFibGUsIGNhcmV0UG9zaXRpb24pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNEdXBsaWNhdGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICAgIGJsb2NrID0gKHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG9uZSA9IGJsb2NrLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCcuZXhjbHVkZS1mcm9tLWNsb25lJykuZm9yRWFjaChlbCA9PiBlbC5yZW1vdmUoKSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBibG9jay5uZXh0U2libGluZztcbiAgICAgICAgYmxvY2sucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGNsb25lLCBuZXh0RWxlbWVudCk7XG5cbiAgICAgICAgY2xvbmUuaWQgPSBgYi0ke1V0aWxzLmdlbmVyYXRlVW5pcXVlSWQoKX1gO1xuXG4gICAgICAgIGNvbnN0IGhpZGVFdmVudCA9IG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudHMuYmxvY2tDbG9uZWQsIHtcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoaGlkZUV2ZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVCbG9jayhibG9jaz86IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG5cbiAgICAgICAgaWYgKCFibG9jaykge1xuICAgICAgICAgICAgYmxvY2sgPSAodGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRCbG9jaygpIHx8IERPTVV0aWxzLmdldEN1cnJlbnRBY3RpdmVCbG9jaygpKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNPbk5leHQoYmxvY2spO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGJsb2NrKTtcblxuICAgICAgICBjb25zdCBoaWRlRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRzLmJsb2NrRGVsZXRlZCwge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChoaWRlRXZlbnQpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIHRoaXMuZGVsZXRlQW5kRm9jdXNPblByZXZpb3VzKCk7XG4gICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgIC8vIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAvLyBhcHBseVNlbGVjdGVkQmxvY2tUeXBlKGRyYWdnYWJsZUJsb2NrOiBIVE1MRWxlbWVudCwgbmV3QmxvY2tUeXBlOiBzdHJpbmcpIHtcblxuICAgIC8vICAgICAvLyBjb25zdCBkcmFnZ2FibGVCbG9jayA9IHJlYWxGb2N1c2VkRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcbiAgICAvLyAgICAgLy8gY29uc3QgbmV3QmxvY2tUeXBlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5vcHRpb24nKSA/XG4gICAgLy8gICAgIC8vICAgICBldmVudC50YXJnZXQuY2xvc2VzdCgnLm9wdGlvbicpLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJykgOlxuICAgIC8vICAgICAvLyAgICAgY3VycmVudEZha2VGb2N1c2VkT3B0aW9uLmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XG5cbiAgICAvLyAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0Lmxhc3RJbmRleE9mKCcvJyk7XG4gICAgLy8gICAgIHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQgPSBsYXN0U2xhc2hJbmRleCAhPT0gLTEgPyByZWFsRm9jdXNlZEVsZW1lbnQuaW5uZXJUZXh0LnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KSA6IHJlYWxGb2N1c2VkRWxlbWVudC5pbm5lclRleHQ7XG5cblxuICAgIC8vICAgICB0cmFuc2Zvcm1CbG9jayhkcmFnZ2FibGVCbG9jaywgbmV3QmxvY2tUeXBlKTtcblxuICAgIC8vICAgICBoaWRlQW5kQ2xlYXJCbG9ja09wdGlvbnMoKTtcbiAgICAvLyAgICAgaGlkZUFsbERlcGVuZGVudEJveCgpO1xuICAgIC8vICAgICBoaWRlZmxvYXRpbmdUb29sYmFyKCk7XG4gICAgLy8gfVxuXG4gICAgLy8gZm9ybWF0QmxvY2soZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbnRlbnRUeXBlOiBzdHJpbmcpXG4gICAgdHJhbnNmb3JtQmxvY2sodHlwZTogc3RyaW5nLCBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG5cbiAgICAgICAgbGV0IGJsb2NrRWxlbWVudDogRWxlbWVudCB8IG51bGw7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdChcIi5ibG9ja1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2NrRWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmNsb3Nlc3QoXCIuYmxvY2tcIikgfHwgbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbGVtZW50KXtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcIi5ibG9ja1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb250ZW50RWxlbWVudCA9IGJsb2NrRWxlbWVudCEucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjay5wZWVrKCk/LmZvY3VzKCk7XG5cbiAgICAgICAgRE9NVXRpbHMucmVtb3ZlRmlsdGVyVGV4dCgpO1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50Py5pbm5lclRleHQ7XG5cbiAgICAgICAgbGV0IGZvY3VzU3RhY2tUb0FkZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuXG4gICAgICAgIGxldCBuZXdDb250ZW50QmxvY2s7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlBBUkFHUkFQSDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5QQVJBR1JBUEgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVDb250ZW50ID0gRE9NVXRpbHMucXVlcnlTZWxlY3RvckluY2x1ZGluZ1NlbGYoY29udGVudEVsZW1lbnQsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVySFRNTCA9IGVkaXRhYmxlQ29udGVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl8xKTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfMik7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzM6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzMpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80OiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkhFQURFUl80KTtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2suaW5uZXJUZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNToge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5IRUFERVJfNSk7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzY6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuSEVBREVSXzYpO1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jay5pbm5lclRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNPREU6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEU6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuUVVPVEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJVTExFVEVEX0xJU1Q6IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQlVMTEVURURfTElTVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuTlVNQkVSRURfTElTVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5OVU1CRVJFRF9MSVNULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DSEVDS19MSVNUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkNIRUNLX0xJU1QsIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNFUEFSQVRPUjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TRVBBUkFUT1IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlRBQkxFOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlRBQkxFLCBcIiwsXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLklNQUdFOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLklNQUdFLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU86IHtcbiAgICAgICAgICAgICAgICBuZXdDb250ZW50QmxvY2sgPSB0aGlzLmVsZW1lbnRGYWN0b3J5U2VydmljZS5jcmVhdGUoRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuVklERU8sIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5TUE9USUZZOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLlNQT1RJRlksIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGZvY3VzU3RhY2tUb0FkZCA9IG5ld0NvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRIVUJfR0lTVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5HSVRIVUJfR0lTVCwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgZm9jdXNTdGFja1RvQWRkID0gbmV3Q29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVExBQl9TTklQUEVUOiB7XG4gICAgICAgICAgICAgICAgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkdJVExBQl9TTklQUEVULCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ09ERVBFTjoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DT0RFUEVOLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICBmb2N1c1N0YWNrVG9BZGQgPSBuZXdDb250ZW50QmxvY2s7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgRWxlbWVudEZhY3RvcnlTZXJ2aWNlLkVMRU1FTlRfVFlQRVMuQ0FMTE9VVDoge1xuICAgICAgICAgICAgICAgIG5ld0NvbnRlbnRCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5DQUxMT1VUKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxvdXQgPSBuZXdDb250ZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0LXRleHRcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVDb250ZW50ID0gRE9NVXRpbHMucXVlcnlTZWxlY3RvckluY2x1ZGluZ1NlbGYoY29udGVudEVsZW1lbnQsICdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgICAgICAgIGlmIChjYWxsb3V0ICYmIGVkaXRhYmxlQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsb3V0LmlubmVySFRNTCA9IGVkaXRhYmxlQ29udGVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIHR5cGUnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld0NvbnRlbnRCbG9jaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2tFbGVtZW50IS5yZXBsYWNlQ2hpbGQobmV3Q29udGVudEJsb2NrLCBjb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld0NvbnRlbnRCbG9jay5jbG9zZXN0KCcuZm9jdXNhYmxlJykgfHwgYmxvY2tFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJykpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUpO1xuICAgICAgICB9XG5cblxuICAgICAgICBpZiAoZm9jdXNTdGFja1RvQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaCgoZm9jdXNTdGFja1RvQWRkIGFzIEhUTUxFbGVtZW50KSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT0gXCJpbWFnZVwiIHx8IHR5cGUgPT0gXCJ2aWRlb1wiIHx8IHR5cGUgPT0gXCJzcG90aWZ5XCIgfHwgdHlwZSA9PSBcImdpdGh1Yi1naXN0XCIgfHwgdHlwZSA9PSBcImdpdGxhYi1zbmlwcGV0XCIgfHwgdHlwZSA9PSBcImNvZGVwZW5cIikge1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9IGZvY3VzU3RhY2tUb0FkZD8ucXVlcnlTZWxlY3RvcihcIi5jb250ZW50LXBsYWNlaG9sZGVyXCIpO1xuICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvcGFhYWFhYVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzU3RhY2sucHVzaChwbGFjZWhvbGRlciBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dFbGVtZW50RXZlbnQoXCJtZWRpYUlucHV0dGVyXCIpO1xuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBibG9ja1Rvb2xiYXIgPSBibG9ja0VsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIuYmxvY2stdG9vbGJhci13cmFwcGVyXCIpO1xuICAgICAgICBpZiAoYmxvY2tUb29sYmFyKSB7XG4gICAgICAgICAgICBibG9ja1Rvb2xiYXIucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgLy8ncmVxdWVzdEhpZGVGbG9hdGluZ1Rvb2xiYXInXG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGlvbkV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEN1c3RvbUV2ZW50cy5ibG9ja1R5cGVDaGFuZ2VkLCB7XG4gICAgICAgIC8vICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAvLyAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHNlbGVjdGlvbkV2ZW50KTtcbiAgICB9XG5cbiAgICAvL05PVyBUSEUgZm9ybWF0QmxvY2sgQU5EIHRyYW5zZm9ybUJsb2NrIElTIFRIRSBTQU1FLiBmb3JtYXRCbG9jayBJUyBERVBSRUNFVEVEIFVTRSB0cmFuc2Zvcm1CbG9jayBJTlNURURcbiAgICAvLyBmb3JtYXRCbG9jayhlbGVtZW50OiBIVE1MRWxlbWVudCwgY29udGVudFR5cGU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gICAgIGxldCBjb250ZW50RWxlbWVudCA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnN3aXR0YWJsZScpIGFzIEhUTUxFbGVtZW50O1xuICAgIC8vICAgICBsZXQgY29udGVudCA9IGNvbnRlbnRFbGVtZW50LmlubmVyVGV4dDtcblxuICAgIC8vICAgICBsZXQgbmV3Q29udGVudEJsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKGNvbnRlbnRUeXBlLCBjb250ZW50KTtcblxuICAgIC8vICAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChuZXdDb250ZW50QmxvY2ssIGNvbnRlbnRFbGVtZW50KTtcblxuICAgIC8vICAgICBjb25zdCBmb2N1c2FibGUgPSBuZXdDb250ZW50QmxvY2suY2xvc2VzdCgnLmZvY3VzYWJsZScpIHx8IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgLy8gICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoZm9jdXNhYmxlKTtcbiAgICAvLyB9XG5cblxuXG4gICAgY3JlYXRlTmV3RWxlbWVudChldmVudDogRXZlbnQpIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5jbG9zZXN0KCcuam9oYW5uZXMtY29udGVudC1lbGVtZW50JykgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGNvbnRlbnRFbGVtZW50ICYmIGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUxpc3RJdGVtKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGVmYXVsdEJsb2NrKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUxpc3RJdGVtKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBuZXdDb250ZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBsZXQgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJy5qb2hhbm5lcy1jb250ZW50LWVsZW1lbnQnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveC1saXN0JykpIHtcbiAgICAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKFwiY2hlY2tib3hJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlzdCcpKSB7XG4gICAgICAgICAgICBuZXdDb250ZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShcImxpc3RJdGVtXCIsIFwiXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbmV3Q29udGVudEVsZW1lbnQgPSBjcmVhdGVOZXdEcmFnZ2FibGVQYXJhZ3JhcGhFbGVtZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsZXQgcGFyZW50QmxvY2sgPSBudWxsO1xuXG4gICAgICAgIC8vIGlmIChjb250ZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpc3QnKSkge1xuXG4gICAgICAgIC8vICAgICBwYXJlbnRCbG9jayA9IGNvbnRlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGFjdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIC8vICAgICBpZiAodGV4dENvbnRlbnQgPT09ICcnKSB7XG5cbiAgICAgICAgLy8gICAgICAgICBwYXJlbnRCbG9jayA9IGVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgLy8gICAgICAgICBlbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKS5yZW1vdmUoKTtcblxuICAgICAgICAvLyAgICAgICAgIG5ld0NvbnRlbnRFbGVtZW50ID0gY3JlYXRlTmV3RHJhZ2dhYmxlUGFyYWdyYXBoRWxlbWVudCgpO1xuICAgICAgICAvLyAgICAgICAgIHBhcmVudEJsb2NrLmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCBuZXdDb250ZW50RWxlbWVudCk7XG5cbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLmxpc3QtaXRlbScpO1xuICAgICAgICAvLyAgICAgICAgIGFjdGl2ZUVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgIH1cblxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgcGFyZW50QmxvY2sgPSBlbGVtZW50LmNsb3Nlc3QoJy5ibG9jaycpO1xuXG4gICAgICAgIC8vICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50QmxvY2submV4dFNpYmxpbmcpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgcGFyZW50QmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Q29udGVudEVsZW1lbnQsIHBhcmVudEJsb2NrLm5leHRTaWJsaW5nKTtcbiAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgICAgICBwYXJlbnRCbG9jay5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KG5ld0NvbnRlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBlbGVtZW50IChwYXJhZ3JhcGggb3IgbGlzdCBpdGVtKSBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGFjY29yZGluZ2x5LlxuICAgICogVGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgYnkgcHJlc3NpbmcgJ0VudGVyJyBpbiBhbiBlZGl0YWJsZSBjb250ZW50IGFyZWEsIGZhY2lsaXRhdGluZyBkeW5hbWljIGNvbnRlbnQgY3JlYXRpb24gYW5kIG9yZ2FuaXphdGlvblxuICAgICogd2l0aGluIHRoZSBkb2N1bWVudC4gSXQgc3VwcG9ydHMgZGlmZmVyZW50IGNvbnRlbnQgdHlwZXMgaW5jbHVkaW5nIGNoZWNrbGlzdHMsIGJ1bGxldGVkIGxpc3RzLCBudW1iZXJlZCBsaXN0cywgYW5kIGdlbmVyYWwgdGV4dCBibG9ja3MuXG4gICAgKlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgc3VjY2Vzc2Z1bCBleGVjdXRpb24sIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhdGggdGFrZW4uXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFR5cGljYWxseSBjYWxsZWQgd2l0aGluIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGtleXByZXNzIGV2ZW50c1xuICAgICogZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAqICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgKiAgICAgICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTtcbiAgICAqICAgICB9XG4gICAgKiB9KTtcbiAgICAqXG4gICAgKiBAZGVzY3JpcHRpb25cbiAgICAqIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyB1bmRlciBzZXZlcmFsIGNvbmRpdGlvbnMgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZTpcbiAgICAqIC0gRm9yIGxpc3QgaXRlbXMgKGNoZWNrbGlzdCwgYnVsbGV0ZWQsIGFuZCBudW1iZXJlZCk6XG4gICAgKiAgIDEuIEZpbmRzIHRoZSBjbG9zZXN0IGxpc3QgaXRlbSBhbmNlc3RvciBvZiB0aGUgYWN0aXZlIGVsZW1lbnQuXG4gICAgKiAgIDIuIElmIHRoZSBsaXN0IGl0ZW0gY29udGFpbnMgdGV4dCwgaXQgY2xvbmVzIHRoaXMgaXRlbSBhbmQgc3BsaXRzIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgY2xvbmUuXG4gICAgKiAgIDMuIElmIHRoZSBsaXN0IGl0ZW0gaXMgZW1wdHkgYW5kIGlzIHRoZSBvbmx5IGl0ZW0sIGl0IHJlbW92ZXMgdGhlIGVudGlyZSBibG9jayBhZnRlciBjcmVhdGluZyBhIG5ldyBwYXJhZ3JhcGguXG4gICAgKiAtIEZvciBvdGhlciBibG9ja3MgKGxpa2UgcGFyYWdyYXBocyk6XG4gICAgKiAgIDEuIENsb25lcyB0aGUgY3VycmVudCBibG9jayBhbmQgcmVhcnJhbmdlcyBjb250ZW50IGJldHdlZW4gdGhlIG9yaWdpbmFsIGFuZCB0aGUgbmV3IGNsb25lLlxuICAgICogICAyLiBTZXRzIHRoZSBmb2N1cyB0byB0aGUgc3RhcnQgb2YgdGhlIG5ldyBlbGVtZW50IHRvIGNvbnRpbnVlIGVkaXRpbmcuXG4gICAgKlxuICAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IHRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgcmVtYWlucyBjb2hlcmVudCB3aGlsZSBwcm92aWRpbmcgYSBzZWFtbGVzcyB1c2VyIGV4cGVyaWVuY2UgaW4gdGV4dCBlZGl0aW5nIGVudmlyb25tZW50cy5cbiAgICAqL1xuICAgIGNyZWF0ZU5ld0VsZW1lbnRBbmRTcGxpdENvbnRlbnQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gRE9NVXRpbHMuZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCgpO1xuXG4gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDb250ZW50VHlwZXMuVGFibGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gSnVtcCB0byB0aGUgbmV4dCBsaW5lIGlmIGV4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkNoZWNrTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLkJ1bGxldGVkTGlzdCB8fFxuICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ29udGVudFR5cGVzLk51bWJlcmVkTGlzdCkge1xuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IERPTVV0aWxzLmZpbmRDbG9zZXN0QW5jZXN0b3JPZkFjdGl2ZUVsZW1lbnRCeUNsYXNzKFwibGlzdC1pdGVtXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEl0ZW0gJiYgRE9NVXRpbHMuaGFzVGV4dENvbnRlbnQoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRJdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50SXRlbS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50Q2xvbmUgPSBjbG9uZS5xdWVyeVNlbGVjdG9yKFwiLmZvY3VzYWJsZVwiKSBhcyBOb2RlO1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5yZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdChjb250ZW50Q3VycmVudCwgY29udGVudENsb25lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJdGVtKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCbG9jayA9IGN1cnJlbnRJdGVtLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY291bnRlciA9IHBhcmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubGlzdC1pdGVtXCIpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyYWdyYXBoID0gRWxlbWVudEZhY3RvcnlTZXJ2aWNlLmJsb2NrUGFyYWdyYXBoKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuaW5zZXJ0QWZ0ZXIobmV3UGFyYWdyYXBoLCBwYXJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudGVyID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJsb2NrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gKG5ld1BhcmFncmFwaCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcInBcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzYWJsZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmxvY2sgPSBET01VdGlscy5maW5kQ2xvc2VzdEFuY2VzdG9yT2ZBY3RpdmVFbGVtZW50QnlDbGFzcyhcImJsb2NrXCIpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvbmVkQmxvY2sgPSBET01VdGlscy5jbG9uZUFuZEluc2VydEFmdGVyKGN1cnJlbnRCbG9jayk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEN1cnJlbnQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENsb25lID0gY2xvbmVkQmxvY2sucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQoY29udGVudEN1cnJlbnQsIGNvbnRlbnRDbG9uZSk7XG5cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUJsb2NrKENvbnRlbnRUeXBlcy5QYXJhZ3JhcGgsIGNsb25lZEJsb2NrKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IChjbG9uZWRCbG9jayBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcIi5mb2N1c2FibGVcIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNhYmxlIGFzIEhUTUxFbGVtZW50KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG5cbiAgICBjcmVhdGVBTmV3UGFyYWdyYXBoRnJvbVRpdGxlKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLnRpdGxlIGgxXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IGNsb25lZFRpdGxlID0gRE9NVXRpbHMuY2xvbmVBbmRJbnNlcnRBZnRlcih0aXRsZSk7XG4gICAgICAgIGlmIChjbG9uZWRUaXRsZSkge1xuICAgICAgICAgICAgRE9NVXRpbHMucmVhcnJhbmdlQ29udGVudEFmdGVyU3BsaXQodGl0bGUgYXMgTm9kZSwgY2xvbmVkVGl0bGUgYXMgTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdCbG9jayA9IHRoaXMuZWxlbWVudEZhY3RvcnlTZXJ2aWNlLmNyZWF0ZShFbGVtZW50RmFjdG9yeVNlcnZpY2UuRUxFTUVOVF9UWVBFUy5CTE9DS19QQVJBR1JBUEgsIFwiXCIpO1xuICAgICAgICBjb25zdCBwID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcihgLiR7Q29tbW9uQ2xhc3Nlcy5Db250ZW50RWxlbWVudH1gKTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gY2xvbmVkVGl0bGU/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjam9oYW5uZXNFZGl0b3IgLmNvbnRlbnRcIik7XG5cbiAgICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQucHJlcGVuZChuZXdCbG9jayk7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2FibGUgPSAobmV3QmxvY2sgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoXCIuZm9jdXNhYmxlXCIpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2FibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xvbmVkVGl0bGU/LnJlbW92ZSgpO1xuICAgIH1cblxuXG5cblxuXG4gICAgLy8gc3BsaXRDb250ZW50QXRDdXJzb3IoKTogdm9pZCB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcblxuICAgIC8vICAgICAvLyBDcmlhbmRvIHJhbmdlIHBhcmEgbyBjb250ZcO6ZG8gYW50ZXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQmVmb3JlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgcmFuZ2VCZWZvcmUuc2VsZWN0Tm9kZUNvbnRlbnRzKGNvbnRhaW5lcik7XG4gICAgLy8gICAgIHJhbmdlQmVmb3JlLnNldEVuZChyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQpO1xuXG4gICAgLy8gICAgIC8vIENyaWFuZG8gcmFuZ2UgcGFyYSBvIGNvbnRlw7pkbyBkZXBvaXMgZG8gY3Vyc29yXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlQWZ0ZXIgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNlbGVjdE5vZGVDb250ZW50cyhjb250YWluZXIpO1xuICAgIC8vICAgICByYW5nZUFmdGVyLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTtcblxuICAgIC8vICAgICAvLyBFeGVtcGxvOiBJc29sYW5kbyBvIHRleHRvIGRlIGNhZGEgcGFydGVcbiAgICAvLyAgICAgY29uc3QgdGV4dEJlZm9yZSA9IHJhbmdlQmVmb3JlLnRvU3RyaW5nKCk7XG4gICAgLy8gICAgIGNvbnN0IHRleHRBZnRlciA9IHJhbmdlQWZ0ZXIudG9TdHJpbmcoKTtcblxuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gYW50ZXMgZG8gY3Vyc29yOicsIHRleHRCZWZvcmUpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZygnVGV4dG8gZGVwb2lzIGRvIGN1cnNvcjonLCB0ZXh0QWZ0ZXIpO1xuXG4gICAgLy8gICAgIC8vIEFxdWkgdm9jw6ogcG9kZSBtYW5pcHVsYXIgbyBET00gY29tbyBuZWNlc3PDoXJpbywgcG9yIGV4ZW1wbG86XG4gICAgLy8gICAgIC8vIGluc2VyaXIgbm92b3MgZWxlbWVudG9zLCBtb2RpZmljYXIgbyB0ZXh0bywgZXRjLlxuICAgIC8vIH1cblxuXG4gICAgY3JlYXRlRGVmYXVsdEJsb2NrKGV2ZW50UGFyYWdyYXBoOiBFbGVtZW50IHwgbnVsbCk6IEhUTUxFbGVtZW50IHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0Jsb2NrID0gdGhpcy5lbGVtZW50RmFjdG9yeVNlcnZpY2UuY3JlYXRlKEVsZW1lbnRGYWN0b3J5U2VydmljZS5FTEVNRU5UX1RZUEVTLkJMT0NLX1BBUkFHUkFQSCwgXCJcIik7XG5cbiAgICAgICAgaWYgKGV2ZW50UGFyYWdyYXBoICYmIGV2ZW50UGFyYWdyYXBoLmNsb3Nlc3QoJy5ibG9jaycpKSB7XG4gICAgICAgICAgICBjb25zdCBzaWJsaW5nID0gZXZlbnRQYXJhZ3JhcGguY2xvc2VzdCgnLmJsb2NrJykhO1xuICAgICAgICAgICAgc2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgbmV3QmxvY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudFwiKSEuYXBwZW5kQ2hpbGQobmV3QmxvY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gbmV3QmxvY2sucXVlcnlTZWxlY3RvcignLmpvaGFubmVzLWNvbnRlbnQtZWxlbWVudCcpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c1N0YWNrLnB1c2gobmV3QmxvY2spO1xuXG4gICAgICAgIHJldHVybiBuZXdCbG9jaztcblxuICAgICAgICAvLyBmb2N1c09uVGhlRW5kT2ZUaGVUZXh0KGZvY3VzYWJsZSk7XG4gICAgfVxuXG4gICAgZXhlY0ZvY3VzT25OZXh0KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgY3VycmVudEFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWxlY3RlZEJsb2NrKCkgfHwgRE9NVXRpbHMuZ2V0Q3VycmVudEFjdGl2ZUJsb2NrKCk7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50QWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mb2N1c09uTmV4dChjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9XG5cblxuICAgIGV4ZWNEZWxldGVGb2N1c09uUHJldmlvdXMoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE7XG5cbiAgICAgICAgdGhpcy5mb2N1c09uUHJldmlvdXMoY3VycmVudEFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmRlbGV0ZVRoZUN1cnJlbnRFbGVtZW50QW5kVGhlRHJhZ2dhYmxlQmxvY2tJZkVtcHR5KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBleGVjRGVsZXRlQW5kRm9jdXNPbk5leHQoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50QWN0aXZlRWxlbWVudCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKSB8fCBET01VdGlscy5nZXRDdXJyZW50QWN0aXZlQmxvY2soKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRBY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzT25OZXh0KGN1cnJlbnRBY3RpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5kZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50QWN0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uUHJldmlvdXMoYWN0dWFsRWxlbWVudDogRWxlbWVudCwgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG5cbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0VsZW1lbnQgPSBhY3R1YWxFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGlmICghcHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhY3R1YWxFbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0xJJyAvKiBmb2N1c2FibGUgU1BBTiBpbnNpZGUgTEkqLykge1xuXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCdsaScpPy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgJiYgcHJldmlvdXNFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IHByZXZpb3VzRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhFbmRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudChmb2N1c2VkRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzW2ZvY3VzYWJsZUNhbmRpZGF0ZXMubGVuZ3RoIC0gMV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYRW5kUG9zaXRpb24oZm9jdXNlZEVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmV2aW91c0ZvY3VzYWJsZUVsZW1lbnQoYWN0dWFsRWxlbWVudDogRWxlbWVudCk6IEVsZW1lbnQgfCBudWxsIHtcblxuICAgICAgICBsZXQgdGFnID0gYWN0dWFsRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGxldCBmb2N1c2VkRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRhZyA9PT0gJ0xJJykge1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKCFwcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzRWxlbWVudCAmJiBwcmV2aW91c0VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gcHJldmlvdXNFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcblxuICAgICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ucHJldmlvdXNFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNFbGVtZW50ICYmIHByZXZpb3VzRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBwcmV2aW91c0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpYmxpbmcgPSBwYXJlbnQucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggLSAxXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c09uTmV4dChhY3R1YWxFbGVtZW50OiBFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgbGV0IHRhZyA9IGFjdHVhbEVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBsZXQgZm9jdXNlZEVsZW1lbnQgPSBudWxsO1xuXG4gICAgICAgIGlmICh0YWcgPT09ICdMSScpIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGZvY3VzZWRFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMucGxhY2VDdXJzb3JBdFN0YXJ0T2ZFZGl0YWJsZUVsZW1lbnQoZm9jdXNlZEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFjdHVhbEVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknIC8qIGZvY3VzYWJsZSBTUEFOIGluc2lkZSBMSSovKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50LmNsb3Nlc3QoJ2xpJyk/Lm5leHRFbGVtZW50U2libGluZz8ucXVlcnlTZWxlY3RvcignLmZvY3VzYWJsZScpO1xuXG4gICAgICAgICAgICBpZiAobmV4dEVsZW1lbnQgJiYgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb2N1c2FibGUnKSkge1xuICAgICAgICAgICAgICAgIGZvY3VzZWRFbGVtZW50ID0gbmV4dEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcmVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaWJsaW5nID0gcGFyZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICB3aGlsZSAoc2libGluZykge1xuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZUNhbmRpZGF0ZXMgPSBzaWJsaW5nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mb2N1c2FibGUnKTtcbiAgICAgICAgICAgIGlmIChmb2N1c2FibGVDYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IGZvY3VzYWJsZUNhbmRpZGF0ZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbihmb2N1c2VkRWxlbWVudCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERPTVV0aWxzLnBsYWNlQ3Vyc29yQXRTdGFydE9mRWRpdGFibGVFbGVtZW50KGZvY3VzZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGdldE5leHRGb2N1c2FibGVFbGVtZW50KGFjdHVhbEVsZW1lbnQ6IEVsZW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGxldCB0YWcgPSBhY3R1YWxFbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgbGV0IGZvY3VzZWRFbGVtZW50ID0gbnVsbDtcblxuICAgICAgICBpZiAodGFnID09PSAnTEknKSB7XG4gICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSBhY3R1YWxFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICAgICAgaWYgKG5leHRFbGVtZW50ICYmIG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXNhYmxlJykpIHtcbiAgICAgICAgICAgICAgICBmb2N1c2VkRWxlbWVudCA9IG5leHRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYWN0dWFsRWxlbWVudC5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdMSScgLyogZm9jdXNhYmxlIFNQQU4gaW5zaWRlIExJKi8pIHtcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IGFjdHVhbEVsZW1lbnQuY2xvc2VzdCgnbGknKT8ubmV4dEVsZW1lbnRTaWJsaW5nPy5xdWVyeVNlbGVjdG9yKCcuZm9jdXNhYmxlJyk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0RWxlbWVudCAmJiBuZXh0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvY3VzYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBuZXh0RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9jdXNlZEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gYWN0dWFsRWxlbWVudC5jbG9zZXN0KCcuYmxvY2snKTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2libGluZyA9IHBhcmVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBmb2N1c2FibGVDYW5kaWRhdGVzID0gc2libGluZy5xdWVyeVNlbGVjdG9yQWxsKCcuZm9jdXNhYmxlJyk7XG4gICAgICAgICAgICBpZiAoZm9jdXNhYmxlQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNlZEVsZW1lbnQgPSBmb2N1c2FibGVDYW5kaWRhdGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBmb2N1c2VkRWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzZWRFbGVtZW50O1xuICAgIH1cblxuXG5cbiAgICBkZWxldGVUaGVDdXJyZW50RWxlbWVudEFuZFRoZURyYWdnYWJsZUJsb2NrSWZFbXB0eShjdXJyZW50RWxlbWVudDogRWxlbWVudCkge1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEJsb2NrID0gY3VycmVudEVsZW1lbnQuY2xvc2VzdCgnLmJsb2NrJyk7XG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IGN1cnJlbnRFbGVtZW50LmNsb3Nlc3QoJy5kZWxldGFibGUnKTtcblxuICAgICAgICBhY3R1YWw/LnJlbW92ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnRCbG9jayAmJiBwYXJlbnRCbG9jay5xdWVyeVNlbGVjdG9yQWxsKCcuZWRpdGFibGUnKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcGFyZW50QmxvY2sucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG5cbiAgICBhcHBseUN1cnNvclhFbmRQb3NpdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCwgeFBvc2l0aW9uOiBudW1iZXIpIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRqdXN0Q3Vyc29yT2Zmc2V0KGN1cnJlbnROb2RlLCB4UG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQlInKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LmNsb3Nlc3ROb2RlKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChyZXN1bHQuY2xvc2VzdE5vZGUsIHJlc3VsdC5jbG9zZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseUN1cnNvclhTdGFydFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB4UG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gZWxlbWVudC5maXJzdENoaWxkO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmFkanVzdEN1cnNvck9mZnNldChjdXJyZW50Tm9kZSwgeFBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5jbG9zZXN0Tm9kZSkge1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQocmVzdWx0LmNsb3Nlc3ROb2RlLCByZXN1bHQuY2xvc2VzdE9mZnNldCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XG4gICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGp1c3RDdXJzb3JPZmZzZXQobm9kZTogTm9kZSwgeFBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGNsb3Nlc3ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IGNsb3Nlc3RPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2xvc2VzdERpZmYgPSBJbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudGV4dENvbnRlbnQhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBpKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IE1hdGguYWJzKHJlY3QubGVmdCAtIHhQb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByaWdodERpZmYgPSBNYXRoLmFicyhyZWN0LnJpZ2h0IC0geFBvc2l0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGxlZnREaWZmIDwgY2xvc2VzdERpZmYgfHwgcmlnaHREaWZmIDwgY2xvc2VzdERpZmYpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlmZiA9IE1hdGgubWluKGxlZnREaWZmLCByaWdodERpZmYpO1xuICAgICAgICAgICAgICAgIGNsb3Nlc3RPZmZzZXQgPSBpICsgKHJpZ2h0RGlmZiA8IGxlZnREaWZmID8gMSA6IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhQb3NpdGlvbiA+IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSB7XG4gICAgICAgICAgICBjbG9zZXN0T2Zmc2V0ID0gbm9kZS50ZXh0Q29udGVudCEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2xvc2VzdE5vZGUsIGNsb3Nlc3RPZmZzZXQgfTtcbiAgICB9XG5cblxuICAgIC8vIGZvY3VzT25UaGVFbmRPZlRoZVRleHQoY29udGVudEJsb2NrOiBIVE1MRWxlbWVudCkge1xuXG4gICAgLy8gICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cbiAgICAvLyAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAvLyAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhjb250ZW50QmxvY2spO1xuXG4gICAgLy8gICAgICAgICBsZXQgbGFzdENoaWxkID0gY29udGVudEJsb2NrO1xuXG4gICAgLy8gICAgICAgICB3aGlsZSAobGFzdENoaWxkLmxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQubGFzdENoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBpZiAobGFzdENoaWxkLmxhc3RDaGlsZCkge1xuICAgIC8vICAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5sYXN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gICAgICAgICB9XG5cbiAgICAvLyAgICAgICAgIHJhbmdlLnNldEVuZChsYXN0Q2hpbGQsIGxhc3RDaGlsZC50ZXh0Q29udGVudCEubGVuZ3RoKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcblxuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIC8vIGZvY3VzT25UaGVTdGFydE9mVGhlVGV4dChjb250ZW50QmxvY2s6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgLy8gICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xuXG4gICAgLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoY29udGVudEJsb2NrKTtcbiAgICAvLyAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIC8vICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblxuICAgIC8vICAgICAgICAgY29udGVudEJsb2NrLmZvY3VzKCk7XG4gICAgLy8gICAgIH0sIDEwKTtcbiAgICAvLyB9XG5cblxuXG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRGb2N1c2FibGUoKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuZm9jdXNhYmxlXCIpO1xuXG4gICAgICAgIHJldHVybiBmb2N1c2FibGVQYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkQmxvY2soKTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBsZXQgY29udGFpbmVyOiBOb2RlIHwgbnVsbCA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvY3VzYWJsZVBhcmVudCA9IChjb250YWluZXIgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuYmxvY2tcIik7XG5cbiAgICAgICAgcmV0dXJuIGZvY3VzYWJsZVBhcmVudDtcbiAgICB9XG5cblxuICAgIGp1c3RpZnlMZWZ0KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICB0aGlzLnJlbW92ZUp1c3RpZnkoYmxvY2spO1xuICAgICAgICBibG9jay5jbGFzc0xpc3QuYWRkKFwianVzdGlmeS1sZWZ0XCIpO1xuICAgIH1cblxuICAgIGp1c3RpZnlDZW50ZXIoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LWNlbnRlclwiKTtcbiAgICB9XG5cbiAgICBqdXN0aWZ5UmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlSnVzdGlmeShibG9jayk7XG4gICAgICAgIGJsb2NrLmNsYXNzTGlzdC5hZGQoXCJqdXN0aWZ5LXJpZ2h0XCIpO1xuICAgIH1cblxuICAgIGNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlKGJsb2NrOiBIVE1MRWxlbWVudCwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjb2RlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcImNvZGVcIik7XG5cbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIERPTVV0aWxzLnJlbW92ZUNsYXNzZXNXaXRoUHJlZml4KGNvZGUgYXMgRWxlbWVudCwgXCJsYW5ndWFnZS1cIik7XG4gICAgICAgICAgICBjb2RlLmNsYXNzTGlzdC5hZGQoYGxhbmd1YWdlLSR7dmFsdWV9YCk7XG4gICAgICAgICAgICBjb2RlLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtaGlnaGxpZ2h0ZWRcIik7XG5cbiAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDb2RlQmxvY2tMYW5ndWFnZUNoYW5nZWRFdmVudChcImNvZGUtYmxvY2stbGFuZ3VhZ2UtbWVudVwiLCBibG9jay5pZCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVKdXN0aWZ5KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG5cbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGNsYXNzTGlzdFtpXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChcImp1c3RpZnktXCIpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIGV4ZWNDaGFuZ2VDYWxsb3V0QmFja2dyb3VuZChibG9jazogSFRNTEVsZW1lbnQsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICBjb25zdCBjYWxsb3V0RGl2ID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5jYWxsb3V0ID4gZGl2XCIpO1xuXG4gICAgICAgIGlmKGNhbGxvdXREaXYpe1xuICAgICAgICAgICAgRE9NVXRpbHMucmVtb3ZlQ2xhc3Nlc1dpdGhQcmVmaXgoY2FsbG91dERpdiBhcyBFbGVtZW50LCBcImNhbGxvdXQtYmFja2dyb3VuZC1cIik7XG4gICAgICAgICAgICBjYWxsb3V0RGl2LmNsYXNzTGlzdC5hZGQoY29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQ29tbWFuZHMgfSBmcm9tIFwiQC9jb21tYW5kcy9Db21tYW5kc1wiO1xuaW1wb3J0IHsgSVRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gXCIuL0lUZXh0T3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1V0aWxzXCI7XG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XG5pbXBvcnQgeyBJTWVtZW50byB9IGZyb20gXCJAL2NvcmUvSU1lbWVudG9cIjtcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tIFwiQC9jb3JlL0RlcGVuZGVuY3lDb250YWluZXJcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJAL2NvbW1hbmRzL0V2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgQnV0dG9uSURzIH0gZnJvbSBcIkAvY29yZS9CdXR0b25JRHNcIjtcbmltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5cbnR5cGUgVGFyZ2V0Tm9kZSA9IHtcbiAgICBub2RlVHlwZTogc3RyaW5nO1xuICAgIGNsYXNzZXM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBUZXh0T3BlcmF0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBJVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUZXh0T3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgICBwcml2YXRlIG1lbWVudG86IElNZW1lbnRvO1xuXG4gICAgdGV4dE9wZXJhdGlvblNlcnZpY2U6IGFueTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IobWVtZW50bzogSU1lbWVudG8pIHtcbiAgICAgICAgaWYgKFRleHRPcGVyYXRpb25zU2VydmljZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXNlIFRleHRPcGVyYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCk6IFRleHRPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICAgICAgY29uc3QgbWVtZW50byA9IERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVzb2x2ZTxJTWVtZW50bz4oXCJJTWVtZW50b1wiKTtcblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVGV4dE9wZXJhdGlvbnNTZXJ2aWNlKG1lbWVudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgZXhlY0luc2VydExpbmsodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiY3JlYXRlTGlua1wiLCBmYWxzZSwgdXJsKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuTGluaywgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplQW5jaG9ycygpO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVBbmNob3JzKCkge1xuICAgICAgICBjb25zdCBhbmNob3JzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIiNqb2hhbm5lc0VkaXRvciAuY29udGVudCBhXCIpO1xuXG4gICAgICAgIGFuY2hvcnMuZm9yRWFjaChhbmNob3IgPT4ge1xuICAgICAgICAgICAgaWYgKCFhbmNob3IuaGFzQXR0cmlidXRlKCd0aXRsZScpKSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAoYW5jaG9yIGFzIEhUTUxBbmNob3JFbGVtZW50KS5ocmVmKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYW5jaG9yLm5vcm1hbGl6ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGV4ZWNUb2dnbGVMaW5rKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucXVlcnlBbmNob3JDb21tYW5kU3RhdGUoKSkge1xuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93RWxlbWVudEV2ZW50KFwibGlua0JveFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCd1bmxpbmsnLCBmYWxzZSk7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoXCJsaW5rQnV0dG9uXCIsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNCb2xkKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJib2xkXCIpKSB7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJib2xkXCIpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5Cb2xkLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLkJvbGQsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4ZWNJbmxpbmVDb2RlKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAodGhpcy50b2dnbGVJbmxpbmVDb2RlKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5SW5saW5lQ29kZUNvbW1hbmRTdGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5JbmxpbmVDb2RlLCBDb2xvcnMuSWNvbkFjdGl2ZUJsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQoQnV0dG9uSURzLklubGluZUNvZGUsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRvZ2dsZUlubGluZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAvLyAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcblxuICAgIC8vICAgICBpZiAoc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ/LnRhZ05hbWUgPT09IFwiQ09ERVwiKSB7XG4gICAgLy8gICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlbGVjdGVkQ29udGVudC50ZXh0Q29udGVudCB8fCAnJyk7XG4gICAgLy8gICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAgIGNvbnN0IGNvZGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNvZGVcIik7XG4gICAgLy8gICAgICAgICBjb2RlRWxlbWVudC5hcHBlbmRDaGlsZChzZWxlY3RlZENvbnRlbnQpO1xuICAgIC8vICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjb2RlRWxlbWVudCk7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgLy8gICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG5cbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gfVxuXG4gICAgdG9nZ2xlSW5saW5lQ29kZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICAgIGxldCBzZWxlY3RlZENvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBIVE1MU3BhbkVsZW1lbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcblxuICAgICAgICBsZXQgaXNDb2RlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5zQ29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgY29udGFpbnNDb2RlLmFwcGVuZENoaWxkKHNlbGVjdGVkQ29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIGlmIChjb250YWluc0NvZGUucXVlcnlTZWxlY3RvcignY29kZScpKSB7XG4gICAgICAgICAgICBpc0NvZGUgPSB0cnVlO1xuICAgICAgICAgICAgY29udGFpbnNDb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvZGUnKS5mb3JFYWNoKGNvZGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29kZS50ZXh0Q29udGVudCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgY29kZS5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQodGV4dE5vZGUsIGNvZGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZWxlY3RlZENvbnRlbnQgPSBjb250YWluc0NvZGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50Q29kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICB3aGlsZSAocGFyZW50Q29kZSAmJiBwYXJlbnRDb2RlLm5vZGVOYW1lICE9PSBcIkNPREVcIiAmJiBwYXJlbnRDb2RlLm5vZGVOYW1lICE9PSBcIkJPRFlcIikge1xuICAgICAgICAgICAgcGFyZW50Q29kZSA9IHBhcmVudENvZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnRDb2RlICYmIHBhcmVudENvZGUubm9kZU5hbWUgPT09IFwiQ09ERVwiKSB7XG4gICAgICAgICAgICBpc0NvZGUgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJlbnRDb2RlLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgICAgICAgIHBhcmVudENvZGUucGFyZW50Tm9kZT8ucmVwbGFjZUNoaWxkKHRleHROb2RlLCBwYXJlbnRDb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIpO1xuICAgICAgICAgICAgY29kZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VsZWN0ZWRDb250ZW50KTtcbiAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoY29kZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShjb250YWluc0NvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuXG5cbiAgICAgICAgY29uc3QgY29udGVudCA9IERPTVV0aWxzLmdldEFjdGl2ZUNvbnRlbnRFZGl0YWJsZSgpO1xuICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgICAgY29udGVudC5ub3JtYWxpemUoKTtcblxuICAgICAgICAgICAgRE9NVXRpbHMubWVyZ2VJbmxpbmVFbGVtZW50cyhjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGV4ZWNJdGFsaWMoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcIml0YWxpY1wiKSkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKFwiaXRhbGljXCIpKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5JdGFsaWMsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuSXRhbGljLCBDb2xvcnMuSWNvbkRlZmF1bHRCbGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjU3RyaWtlVGhyb3VnaCgpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwic3RyaWtlVGhyb3VnaFwiKSkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKFwic3RyaWtlVGhyb3VnaFwiKSkge1xuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2hhbmdlQ29tcG9uZW50Q29sb3JFdmVudChCdXR0b25JRHMuU3RyaWtldGhyb3VnaCwgQ29sb3JzLkljb25BY3RpdmVCbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5TdHJpa2V0aHJvdWdoLCBDb2xvcnMuSWNvbkRlZmF1bHRCbGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjVW5kZXJsaW5lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LmV4ZWNDb21tYW5kKFwidW5kZXJsaW5lXCIpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoXCJ1bmRlcmxpbmVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5VbmRlcmxpbmUsIENvbG9ycy5JY29uQWN0aXZlQmx1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDaGFuZ2VDb21wb25lbnRDb2xvckV2ZW50KEJ1dHRvbklEcy5VbmRlcmxpbmUsIENvbG9ycy5JY29uRGVmYXVsdEJsYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjSGlsaXRlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFJlc2V0QWN0aXZlQnV0dG9uc0VsZW1lbnRFdmVudChcImhpbGl0ZUNvbG9yXCIpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImhpbGl0ZUNvbG9yXCIsIGZhbHNlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQoXCJoaWxpdGVDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY0ZvcmVDb2xvcih2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy5tZW1lbnRvLnNhdmVTdGF0ZSgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0UmVzZXRBY3RpdmVCdXR0b25zRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIpO1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5leGVjQ29tbWFuZChcImZvcmVDb2xvclwiLCBmYWxzZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiZm9yZUNvbG9yXCIsIHZhbHVlLCBcInNob3dcIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlBbmNob3JDb21tYW5kU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVVbmRlcmxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5VW5kZXJsaW5lQ29tbWFuZFN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlSGlsaXRlQ29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5SGlsaXRlQ29sb3IodmFsdWUhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kID09PSBDb21tYW5kcy50b2dnbGVGb3JlQ29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5Rm9yZUNvbG9yKHZhbHVlISk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZCA9PT0gQ29tbWFuZHMudG9nZ2xlSW5saW5lQ29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZCk7XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBxdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIC8vICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgIC8vICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcblxuICAgIC8vICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAvLyAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICAvLyBWZXJpZmljYSBzZSBhbGd1bSBuw7MgcGFpIMOpIHVtYSDDom5jb3JhXG4gICAgLy8gICAgIHdoaWxlIChub2RlKSB7XG4gICAgLy8gICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAvLyAgICAgICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnQScpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIHNlbGXDp8OjbyBlc3TDoSBkZW50cm8gZGUgdW1hIMOibmNvcmFcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xvc2VzdCgnYScpKSB7XG4gICAgLy8gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gQSBzZWxlw6fDo28gZXN0w6EgZGVudHJvIGRlIGFsZ28gcXVlIGVzdMOhIGRlbnRybyBkZSB1bWEgw6JuY29yYVxuICAgIC8vICAgICAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICAvLyBWZXJpZmljYSBzZSBhIHNlbGXDp8OjbyBjb250w6ltIHVtYSDDom5jb3JhIGNvbXBsZXRhXG4gICAgLy8gICAgIGlmIChyYW5nZS5zdGFydENvbnRhaW5lciA9PT0gcmFuZ2UuZW5kQ29udGFpbmVyKSB7XG4gICAgLy8gICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20ocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIuY2hpbGROb2Rlcyk7XG4gICAgLy8gICAgICAgICBsZXQgc2VsZWN0ZWRBbmNob3I6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgLy8gICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIC8vICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKGNoaWxkIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lID09PSAnQScpIHtcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLmludGVyc2VjdHNOb2RlKGNoaWxkKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBbmNob3IgPSBjaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgIC8vICAgICAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgfVxuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgaWYgKHNlbGVjdGVkQW5jaG9yICYmIHJhbmdlLnRvU3RyaW5nKCkgPT09IHNlbGVjdGVkQW5jaG9yLnRleHRDb250ZW50KSB7XG4gICAgLy8gICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBBIHNlbGXDp8OjbyDDqSBleGF0YW1lbnRlIG8gdGV4dG8gZGUgdW1hIMOibmNvcmFcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG5cblxuICAgIC8vT1JJR0lOQUxcbiAgICAvLyBwcml2YXRlIHF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgLy8gICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIC8vICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IG51bGwpIHtcbiAgICAvLyAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCdhJykpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gfVxuXG4gICAgLy8gbXVsdGlwbGVzIGVsZW1lbnRzXG4gICAgcHJpdmF0ZSBxdWVyeUFuY2hvckNvbW1hbmRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbiB8fCAhc2VsZWN0aW9uLnJhbmdlQ291bnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICBjb25zdCBzdGFydENvbnRhaW5lciA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xuICAgICAgICBjb25zdCBlbmRDb250YWluZXIgPSByYW5nZS5lbmRDb250YWluZXI7XG5cbiAgICAgICAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBub2RlIG9yIGl0cyBwYXJlbnRzIGFyZSBhbiA8YT4gZWxlbWVudFxuICAgICAgICBjb25zdCBpc05vZGVJbnNpZGVBbmNob3IgPSAobm9kZTogTm9kZSB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2EnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpcyB3aXRoaW4gYW4gPGE+IGVsZW1lbnRcbiAgICAgICAgaWYgKGlzTm9kZUluc2lkZUFuY2hvcihzdGFydENvbnRhaW5lcikgfHwgaXNOb2RlSW5zaWRlQW5jaG9yKGVuZENvbnRhaW5lcikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgYWxsIGVsZW1lbnRzIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBpZiBuZWNlc3NhcnlcbiAgICAgICAgY29uc3Qgbm9kZXNJblJhbmdlID0gcmFuZ2UuY2xvbmVDb250ZW50cygpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcbiAgICAgICAgcmV0dXJuIG5vZGVzSW5SYW5nZS5sZW5ndGggPiAwO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBxdWVyeUlubGluZUNvZGVDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ2NvZGUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgcXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ3UnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBxdWVyeUZvcmVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBlbGVtZW50OiBOb2RlIHwgbnVsbCA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xuXG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvbnRDb2xvciA9IChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiZm9udFtjb2xvcl1cIik7XG4gICAgICAgIGlmICghZm9udENvbG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmb250Q29sb3IpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmNvbG9yO1xuXG4gICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpO1xuXG4gICAgICAgIHJldHVybiBoZXhDb2xvci50b1VwcGVyQ2FzZSgpID09PSBleHBlY3RlZENvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcXVlcnlIaWxpdGVDb2xvcihleHBlY3RlZENvbG9yOiBzdHJpbmcpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BhbldpdGhCYWNrZ3JvdW5kID1cbiAgICAgICAgICAgIChlbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwic3BhbltzdHlsZSo9J2JhY2tncm91bmQtY29sb3InXVwiKSB8fFxuICAgICAgICAgICAgKGVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJmb250W3N0eWxlKj0nYmFja2dyb3VuZC1jb2xvciddXCIpO1xuXG4gICAgICAgIGlmICghc3BhbldpdGhCYWNrZ3JvdW5kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuV2l0aEJhY2tncm91bmQpO1xuICAgICAgICBjb25zdCByZ2JDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICBjb25zdCBoZXhDb2xvciA9IFV0aWxzLnJnYlRvSGV4KHJnYkNvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4Q29sb3IudG9VcHBlckNhc2UoKSA9PT0gZXhwZWN0ZWRDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGdldFRhcmdldEVsZW1lbnRNYXAoY29tbWFuZDogc3RyaW5nKToga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG5cbiAgICAgICAgICAgIGNhc2UgXCJzdHJvbmdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJib2xkXCI6XG4gICAgICAgICAgICBjYXNlIFwiYlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAnc3Ryb25nJztcblxuICAgICAgICAgICAgY2FzZSBcIml0YWxpY1wiOlxuICAgICAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJlbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcImVtXCI7XG5cbiAgICAgICAgICAgIGNhc2UgXCJ1bmRlcmxpbmVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidVwiO1xuXG4gICAgICAgICAgICBjYXNlIFwic3RyaWtldGhyb3VnaFwiOlxuICAgICAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3MnO1xuXG4gICAgICAgICAgICBjYXNlIFwiYmFja2dyb3VuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBcInNwYW5cIjtcblxuICAgICAgICAgICAgY2FzZSBcImNvbG9yXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3BhblwiO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFNlbGVjdGVkSFRNTEVsZW1lbnQoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IE5vZGUgfCBudWxsID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cbiAgICBnZXRTZWxlY3RlZFRleHROb2RlcygpOiBOb2RlW10ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0Tm9kZXM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uLnJhbmdlQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdChpKTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJdGVyYXRvciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihcbiAgICAgICAgICAgICAgICByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdE5vZGUobm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLmludGVyc2VjdHNOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9SRUpFQ1Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgICAgIHdoaWxlICgobm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICBub2RlUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5FTkRfVE9fU1RBUlQsIG5vZGVSYW5nZSkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBub2RlUmFuZ2UpID09PSAxXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dE5vZGVzO1xuICAgIH1cblxuICAgIGZpbmRDbG9zZXN0TWF0Y2hpbmdQYXJlbnQoZWxlbWVudDogTm9kZSB8IG51bGwsIHRhcmdldDogVGFyZ2V0Tm9kZSk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbWVudCBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFyZ2V0Lm5vZGVUeXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuY2xhc3NlcyB8fCB0YXJnZXQuY2xhc3Nlcy5ldmVyeShjbHMgPT4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBleHRyYWN0U2VsZWN0ZWRUZXh0KHRleHROb2RlOiBOb2RlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cbiAgICAgICAgaWYgKHRleHROb2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRleHROb2RlLnRleHRDb250ZW50IHx8IFwiXCI7XG5cbiAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgbGV0IGVuZCA9IHRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgICBpZiAoIXJhbmdlLmludGVyc2VjdHNOb2RlKHRleHROb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2Uuc3RhcnRDb250YWluZXIgPT09IHRleHROb2RlKSB7XG4gICAgICAgICAgICBzdGFydCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyLmNvbnRhaW5zKHRleHROb2RlKSkge1xuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhbmdlLmVuZENvbnRhaW5lciA9PT0gdGV4dE5vZGUpIHtcbiAgICAgICAgICAgIGVuZCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5lbmRDb250YWluZXIuY29udGFpbnModGV4dE5vZGUpKSB7XG4gICAgICAgICAgICBlbmQgPSB0ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBUYWJsZVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL1RhYmxlVXRpbHNcIjtcbmltcG9ydCB7IElUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSBcIi4vSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIjtcbmltcG9ydCB7IElGb2N1c1N0YWNrIH0gZnJvbSBcIkAvY29yZS9JRm9jdXNTdGFja1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeUNvbnRhaW5lciB9IGZyb20gXCJAL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuaW1wb3J0IHsgSU1lbWVudG8gfSBmcm9tIFwiQC9jb3JlL0lNZW1lbnRvXCI7XG5pbXBvcnQgeyBDb2xvcnMgfSBmcm9tIFwiQC9jb21tb24vQ29sb3JzXCI7XG5pbXBvcnQgeyBUYWJsZVNjb3BlcyB9IGZyb20gXCIuL1RhYmxlU2NvcGVzXCI7XG5pbXBvcnQgeyBET01FbGVtZW50cyB9IGZyb20gXCJAL2NvbW1vbi9ET01FbGVtZW50c1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcIkAvY29tbWFuZHMvRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgeyBET01VdGlscyB9IGZyb20gXCJAL3V0aWxpdGllcy9ET01VdGlsc1wiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVXRpbHNcIjtcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gXCJAL2NvbXBvbmVudHMvZmxvYXRpbmctdG9vbGJhci9UYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIjtcbmltcG9ydCB7IFRvb2xiYXJJRHMgfSBmcm9tIFwiQC9jb3JlL1Rvb2xiYXJJRHNcIjtcblxuZXhwb3J0IGNsYXNzIFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgaW1wbGVtZW50cyBJVGFibGVPcGVyYXRpb25zU2VydmljZSB7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogVGFibGVPcGVyYXRpb25zU2VydmljZTtcblxuICAgIHByaXZhdGUgZm9jdXNTdGFjazogSUZvY3VzU3RhY2s7XG4gICAgcHJpdmF0ZSBtZW1lbnRvOiBJTWVtZW50bztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBmb2N1c1N0YWNrOiBJRm9jdXNTdGFjayxcbiAgICAgICAgbWVtZW50bzogSU1lbWVudG8pIHtcbiAgICAgICAgaWYgKFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVzZSBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkgdG8gZ2V0IGluc3RhbmNlLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNTdGFjayA9IGZvY3VzU3RhY2s7XG4gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87XG4gICAgfVxuXG4gICAgaXNBY3RpdmVDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ29sdW1uKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcblxuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgVGFibGVVdGlscy5yZW1vdmVDb2x1bW5CeUNlbGwoY2VsbCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICB9XG5cbiAgICByZW1vdmVSb3coKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTtcblxuICAgICAgICBpZiAoY2VsbCkge1xuICAgICAgICAgICAgVGFibGVVdGlscy5yZW1vdmVSb3dCeUNlbGwoY2VsbCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICB9XG5cblxuICAgIGV4ZWNDZWxsQmFja2dyb3VuZENvbG9yKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XG5cbiAgICAgICAgY29uc3QgYWN0aXZlQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYWN0aXZlQ2VsbC5jbG9zZXN0KCd0YWJsZScpITtcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnNlbGVjdGVkJyk7XG5cbiAgICAgICAgICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiY2VsbCBub3QgZm91bmRcIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgc3RhdGljIGlzQ2VsbEJhY2tncm91bmRDb2xvcihjZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCwgdGFyZ2V0SGV4Q29sb3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWNlbGwgfHwgY2VsbC50YWdOYW1lICE9PSAnVEQnIHx8ICFjZWxsLmhhc0F0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2JhY2tncm91bmQtY29sb3InKTtcblxuICAgICAgICBjb25zdCBoZXhCYWNrZ3JvdW5kQ29sb3IgPSBVdGlscy5yZ2JUb0hleChjdXJyZW50QmFja2dyb3VuZENvbG9yKTtcblxuICAgICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHRhcmdldEhleENvbG9yLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGNvbnN0IGNlbGwgPSBUYWJsZVV0aWxzLmdldEFjdGl2ZVRhYmxlQ2VsbCgpO1xuXG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmFja2dyb3VuZENvbG9yID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGhleEJhY2tncm91bmRDb2xvciA9IFV0aWxzLnJnYlRvSGV4KGN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IpO1xuXG4gICAgICAgICAgICByZXR1cm4gaGV4QmFja2dyb3VuZENvbG9yLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gY29uc3QgYSA9IERPTVV0aWxzLlxuXG4gICAgICAgIC8vICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgLy8gRXZlbnRFbWl0dGVyLmVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQoXCJiYWNrZ3JvdW5kQ29sb3JcIik7XG5cbiAgICAgICAgLy8gY29uc3QgYWN0aXZlQ2VsbCA9IFRhYmxlVXRpbHMuZ2V0QWN0aXZlVGFibGVDZWxsKCk7XG5cbiAgICAgICAgLy8gaWYgKGFjdGl2ZUNlbGwpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHRhYmxlID0gYWN0aXZlQ2VsbC5jbG9zZXN0KCd0YWJsZScpITtcblxuICAgICAgICAvLyAgICAgY29uc3Qgc2VsZWN0ZWRDZWxscyA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkLnNlbGVjdGVkJyk7XG5cbiAgICAgICAgLy8gICAgIHNlbGVjdGVkQ2VsbHMuZm9yRWFjaChjZWxsID0+IHtcbiAgICAgICAgLy8gICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgICAgIC8vICAgICB9KTtcblxuICAgICAgICAvLyAgICAgRXZlbnRFbWl0dGVyLmVtaXRTaG93SGlkZUFjdGl2ZUVsZW1lbnRFdmVudChcImJhY2tncm91bmRDb2xvclwiLCB2YWx1ZSwgXCJzaG93XCIpO1xuXG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmVycm9yKFwiY2VsbCBub3QgZm91bmRcIik7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBxdWVyeUFsbFN0YXRlQ2VsbEJhY2tncm91bmRDb2xvcihlbGVtZW50czogSFRNTFRhYmxlQ2VsbEVsZW1lbnRbXSwgY29sb3I6IENvbG9ycyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIGxldCBpczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAgICAgaWYgKGNvbG9yID09IENvbG9ycy5CYWNrZ3JvdW5kQ29sb3JOb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGNlbGwgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpO1xuICAgICAgICAgICAgY29uc3QgcmdiQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgICAgICAgIGNvbnN0IGhleENvbG9yID0gVXRpbHMucmdiVG9IZXgocmdiQ29sb3IpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoaGV4Q29sb3IgIT09IGNvbG9yLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBpcyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXM7XG4gICAgfVxuXG5cbiAgICAvLyBleGVjSGlsaXRlQ29sb3IodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgIC8vICAgICBpZiAoZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJoaWxpdGVDb2xvclwiLCBmYWxzZSwgdmFsdWUpKSB7XG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgdmFsdWUsIFwic2hvd1wiKTtcbiAgICAvLyAgICAgfWVsc2V7XG4gICAgLy8gICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdFNob3dIaWRlQWN0aXZlRWxlbWVudEV2ZW50KFwiaGlsaXRlQ29sb3JcIiwgdmFsdWUsIFwiaGlkZVwiKTtcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlIHtcblxuICAgICAgICBjb25zdCBmb2N1c1N0YWNrID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElGb2N1c1N0YWNrPihcIklGb2N1c1N0YWNrXCIpO1xuICAgICAgICBjb25zdCBtZW1lbnRvID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElNZW1lbnRvPihcIklNZW1lbnRvXCIpO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBUYWJsZU9wZXJhdGlvbnNTZXJ2aWNlKGZvY3VzU3RhY2ssIG1lbWVudG8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zZXJ0Um93QWJvdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKTsgLy8gQWdvcmEsIGBjZWxsYCDDqSBhIGB0ZGAgZGlyZXRhbWVudGVcbiAgICAgICAgaWYgKCFjZWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gY2VsbC5wYXJlbnRFbGVtZW50OyAvLyBPYnRlbSBhIGxpbmhhIChgdHJgKSBwYWkgZGEgY8OpbHVsYVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIHJvdyBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGUgPSByb3cuY2xvc2VzdChcInRhYmxlXCIpOyAvLyBFbmNvbnRyYSBhIHRhYmVsYSBxdWUgY29udMOpbSBhIGxpbmhhXG4gICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKSB8fCB0YWJsZTsgLy8gQXNzdW1lIHRhYmxlIHNlIHRib2R5IG7Do28gZXhpc3RpclxuICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGJvZHkuY2hpbGRyZW4pLmluZGV4T2Yocm93KTsgLy8gRW5jb250cmEgbyDDrW5kaWNlIGRhIGxpbmhhIGRlbnRybyBkbyB0Ym9keSBvdSBkYSB0YWJlbGFcblxuICAgICAgICBpZiAocm93SW5kZXggPCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUm93IGluZGV4IG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIFRhYmxlVXRpbHMuYWRkUm93KHRhYmxlLCByb3dJbmRleCk7IC8vIEluc2VyZSB1bWEgbm92YSBsaW5oYSBubyDDrW5kaWNlIGVuY29udHJhZG9cbiAgICAgICAgRXZlbnRFbWl0dGVyLmVtaXRDbG9zZUVsZW1lbnRFdmVudChUb29sYmFySURzLlRhYmxlVG9vbGJhcik7XG4gICAgfVxuXG4gICAgaW5zZXJ0Um93QmVsb3coYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTtcblxuICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gYmxvY2sucXVlcnlTZWxlY3RvcihcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGUucXVlcnlTZWxlY3RvcihcInRyOmxhc3QtY2hpbGRcIik7XG4gICAgICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGFibGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmluZGV4T2Yocm93KSArIDE7XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkUm93KHRhYmxlLCByb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIHJvd3MgaW4gdGhlIHRhYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gZm9jdXNlZCBlbGVtZW50IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBlbGVtZW50LmNsb3Nlc3QoXCJ0ZFwiKTtcbiAgICAgICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjZWxsIGlzIGZvY3VzZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3cgPSBjZWxsLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNlbGwuY2xvc2VzdChcInRhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKCF0YWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IEFycmF5LmZyb20odGFibGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4pLmluZGV4T2Yocm93KSArIDE7XG4gICAgICAgICAgICAgICAgVGFibGVVdGlscy5hZGRSb3codGFibGUsIHJvd0luZGV4KTtcblxuICAgICAgICAgICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpbnNlcnRDb2x1bW4oZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnKTogdm9pZCB7XG4gICAgLy8gICAgIHRoaXMubWVtZW50by5zYXZlU3RhdGUoKTsgIC8vIFNhbHZhIG8gZXN0YWRvIGF0dWFsIHBhcmEgcG9zc8OtdmVsIGRlc2ZhemltZW50b1xuXG4gICAgLy8gICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpOyAgLy8gUGVnYSBvIGVsZW1lbnRvIGF0dWFsbWVudGUgZm9jYWRvXG4gICAgLy8gICAgIGlmICghZWxlbWVudCkge1xuICAgIC8vICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGZvY3VzZWQgZWxlbWVudCBhdmFpbGFibGVcIik7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7ICAvLyBFbmNvbnRyYSBhIGPDqWx1bGEgZm9jYWRhIGRlbnRybyBkYSB0YWJlbGFcbiAgICAvLyAgICAgaWYgKCFjZWxsKSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgIC8vICAgICAgICAgcmV0dXJuO1xuICAgIC8vICAgICB9XG5cbiAgICAvLyAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTsgIC8vIEVuY29udHJhIGEgdGFiZWxhIGNvbnRlbmRvIGEgY8OpbHVsYVxuICAgIC8vICAgICBpZiAoIXRhYmxlKSB7XG4gICAgLy8gICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgLy8gICAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpOyAgLy8gRGV0ZXJtaW5hIG8gw61uZGljZSBkYSBjb2x1bmEgYXR1YWxcbiAgICAvLyAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgLy8gICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXgpOyAgLy8gQWRpY2lvbmEgY29sdW5hIMOgIGVzcXVlcmRhXG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXggKyAxKTsgIC8vIEFkaWNpb25hIGNvbHVuYSDDoCBkaXJlaXRhXG4gICAgLy8gICAgIH1cbiAgICAvLyB9XG5cbiAgICBpbnNlcnRDb2x1bW5MZWZ0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZm9jdXNTdGFjay5wZWVrKCk7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGZvY3VzZWQgZWxlbWVudCBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7XG4gICAgICAgIGlmICghY2VsbCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGNlbGwgaXMgZm9jdXNlZFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhYmxlID0gY2VsbC5jbG9zZXN0KFwidGFibGVcIik7XG4gICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUYWJsZSBkb2VzIG5vdCBleGlzdFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gQXJyYXkuZnJvbShjZWxsLnBhcmVudEVsZW1lbnQhLmNoaWxkcmVuKS5pbmRleE9mKGNlbGwpO1xuICAgICAgICBUYWJsZVV0aWxzLmFkZENvbHVtbih0YWJsZSwgY29sdW1uSW5kZXgpO1xuXG4gICAgICAgIEV2ZW50RW1pdHRlci5lbWl0Q2xvc2VFbGVtZW50RXZlbnQoVG9vbGJhcklEcy5UYWJsZVRvb2xiYXIpO1xuXG4gICAgfVxuXG4gICAgaW5zZXJ0Q29sdW1uUmlnaHQoYmxvY2s6IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbWVudG8uc2F2ZVN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICh0YWJsZSkge1xuICAgICAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZvY3VzU3RhY2sucGVlaygpO1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vIGZvY3VzZWQgZWxlbWVudCBhdmFpbGFibGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjZWxsID0gZWxlbWVudC5jbG9zZXN0KFwidGRcIik7XG4gICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gY2VsbCBpcyBmb2N1c2VkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjZWxsLmNsb3Nlc3QoXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGFibGUgZG9lcyBub3QgZXhpc3RcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5JbmRleCA9IEFycmF5LmZyb20oY2VsbC5wYXJlbnRFbGVtZW50IS5jaGlsZHJlbikuaW5kZXhPZihjZWxsKTtcbiAgICAgICAgICAgIFRhYmxlVXRpbHMuYWRkQ29sdW1uKHRhYmxlLCBjb2x1bW5JbmRleCArIDEpO1xuXG4gICAgICAgICAgICBFdmVudEVtaXR0ZXIuZW1pdENsb3NlRWxlbWVudEV2ZW50KFRvb2xiYXJJRHMuVGFibGVUb29sYmFyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNob3dJbnNlcnRMaW5lRWxlbWVudChibG9jazogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluZSA9IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoXCIuYWRkLXRhYmxlLXJvd1wiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaW5zZXJ0TGluZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgfVxuXG4gICAgc2hvd0luc2VydENvbHVtbkVsZW1lbnQoYmxvY2s6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydExpbmUgPSBibG9jay5xdWVyeVNlbGVjdG9yKFwiLmFkZC10YWJsZS1jb2x1bW5cIikgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGluc2VydExpbmUuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuICAgIH1cblxuICAgIGhpZGVJbnNlcnRSb3dFbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtcm93XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIH1cblxuICAgIGhpZGVJbnNlcnRDb2x1bW5FbGVtZW50KGJsb2NrOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5lID0gYmxvY2sucXVlcnlTZWxlY3RvcihcIi5hZGQtdGFibGUtY29sdW1uXCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpbnNlcnRMaW5lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICAgIH1cblxuICAgIC8vIGlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIHJldHVybiBUYWJsZVV0aWxzLmlzQWN0aXZlQ2VsbEJhY2tncm91bmRDb2xvcih2YWx1ZSk7XG4gICAgLy8gfVxuXG4gICAgLy8gZW1pdENoYW5nZVRhYmxlQm9yZGVyQ29sb3JFdmVudCA9IChzY29wZTogVGFibGVTY29wZXMsIGNvbG9yOiBDb2xvcnMpOiB2b2lkID0+IHtcbiAgICAvLyAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoQ29tbWFuZHMuLCB7XG4gICAgLy8gICAgICAgICBkZXRhaWw6IHsgc2NvcGU6IHNjb3BlIH1cbiAgICAvLyAgICAgfSk7XG5cbiAgICAvLyAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XG4gICAgLy8gfVxuXG5cbiAgICBjaGFuZ2VUYWJsZUJvcmRlckNvbG9yKHNjb3BlOiBUYWJsZVNjb3BlcywgY29sb3I6IENvbG9ycyk6IHZvaWQge1xuXG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5mb2N1c1N0YWNrLnBlZWsoKT8uY2xvc2VzdChET01FbGVtZW50cy5UQUJMRSk7XG5cbiAgICAgICAgaWYgKHRhYmxlKSB7XG4gICAgICAgICAgICBUYWJsZVV0aWxzLmNoYW5nZUNlbGxCb3JkZXJDb2xvcih0YWJsZSwgc2NvcGUsIGNvbG9yKVxuICAgICAgICB9XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgQ29tbW9uQ2xhc3NlcyB9IGZyb20gXCJAL2NvbW1vbi9Db21tb25DbGFzc2VzXCI7XHJcbmltcG9ydCB7IElNZW1lbnRvIH0gZnJvbSBcIi4vSU1lbWVudG9cIjtcclxuaW1wb3J0IHsgRE9NVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvRE9NVXRpbHNcIjtcclxuaW1wb3J0IHsgRGVmYXVsdEpTRXZlbnRzIH0gZnJvbSBcIkAvY29tbW9uL0RlZmF1bHRKU0V2ZW50c1wiO1xyXG5pbXBvcnQgeyBLZXlib2FyZEtleXMgfSBmcm9tIFwiQC9jb21tb24vS2V5Ym9hcmRLZXlzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWVtZW50byBpbXBsZW1lbnRzIElNZW1lbnRvIHtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlcnk6IHN0cmluZyA9IFwiI2pvaGFubmVzRWRpdG9yIC5jb250ZW50LXdyYXBwZXJcIjtcclxuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogTWVtZW50bztcclxuXHJcbiAgcHJpdmF0ZSB1bmRvU3RhY2s6IHsgaHRtbDogc3RyaW5nLCBjYXJldFBvc2l0aW9uOiB7IGNoYXJJbmRleDogbnVtYmVyLCBob3Jpem9udGFsUG9zOiBudW1iZXIsIHZlcnRpY2FsUG9zOiBudW1iZXIgfSB9W10gPSBbXTtcclxuICBwcml2YXRlIHJlZG9TdGFjazogeyBodG1sOiBzdHJpbmcsIGNhcmV0UG9zaXRpb246IHsgY2hhckluZGV4OiBudW1iZXIsIGhvcml6b250YWxQb3M6IG51bWJlciwgdmVydGljYWxQb3M6IG51bWJlciB9IH1bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGdldCBjb250ZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1lbWVudG8ucXVlcnkpITtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICBpZiAoTWVtZW50by5pbnN0YW5jZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVc2UgTWVtZW50by5nZXRJbnN0YW5jZSgpIHRvIGdldCBpbnN0YW5jZS5cIik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmF0dGFjaEV2ZW50cygpO1xyXG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHNhdmVTdGF0ZSgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2FyZXRQb3NpdGlvbiA9IERPTVV0aWxzLnNhdmVDYXJldFBvc2l0aW9uM2QodGhpcy5jb250ZW50KTtcclxuXHJcbiAgICAgICAgY2xvbmUucXVlcnlTZWxlY3RvckFsbChgLiR7Q29tbW9uQ2xhc3Nlcy5FZGl0b3JPbmx5fWApLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlKCkpO1xyXG5cclxuICAgICAgICB0aGlzLnVuZG9TdGFjay5wdXNoKHsgaHRtbDogY2xvbmUuaW5uZXJIVE1MLCBjYXJldFBvc2l0aW9uIH0pO1xyXG4gICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XHJcbiAgICAgIH0sIDEwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5kbygpIHtcclxuICAgIGlmICh0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2goeyBodG1sOiB0aGlzLmNvbnRlbnQuaW5uZXJIVE1MLCBjYXJldFBvc2l0aW9uOiBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCkgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVRvUmVzdG9yZSA9IHRoaXMudW5kb1N0YWNrLnBvcCgpO1xyXG4gICAgICBpZiAoc3RhdGVUb1Jlc3RvcmUpIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnQuaW5uZXJIVE1MID0gc3RhdGVUb1Jlc3RvcmUuaHRtbDtcclxuICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCwgc3RhdGVUb1Jlc3RvcmUuY2FyZXRQb3NpdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVkbygpIHtcclxuICAgIGlmICh0aGlzLnJlZG9TdGFjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudW5kb1N0YWNrLnB1c2goeyBodG1sOiB0aGlzLmNvbnRlbnQuaW5uZXJIVE1MLCBjYXJldFBvc2l0aW9uOiBET01VdGlscy5zYXZlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCkgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdGF0ZVRvQXBwbHkgPSB0aGlzLnJlZG9TdGFjay5wb3AoKTtcclxuICAgICAgaWYgKHN0YXRlVG9BcHBseSkge1xyXG4gICAgICAgIHRoaXMuY29udGVudC5pbm5lckhUTUwgPSBzdGF0ZVRvQXBwbHkuaHRtbDtcclxuICAgICAgICBET01VdGlscy5yZXN0b3JlQ2FyZXRQb3NpdGlvbjNkKHRoaXMuY29udGVudCwgc3RhdGVUb0FwcGx5LmNhcmV0UG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdHRhY2hFdmVudHMoKSB7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAneicpIHtcclxuICAgICAgICB0aGlzLnVuZG8oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQua2V5ID09PSAneScpIHtcclxuICAgICAgICB0aGlzLnJlZG8oKTtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgLy8gICBjb25zdCBpbnB1dEV2ZW50ID0gZXZlbnQgYXMgSW5wdXRFdmVudDtcclxuICAgIC8vICAgaWYgKCFpbnB1dEV2ZW50LmlzQ29tcG9zaW5nICYmICFpbnB1dEV2ZW50LmlucHV0VHlwZS5zdGFydHNXaXRoKFwiZGVsZXRlXCIpKSB7XHJcbiAgICAvLyAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZXIpO1xyXG4gICAgLy8gICAgIHRoaXMuZGVib3VuY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7XHJcbiAgICAvLyAgICAgfSwgdGhpcy5kZWJvdW5jZURlbGF5KTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcblxyXG5cclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRGVmYXVsdEpTRXZlbnRzLktleXVwLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PSBLZXlib2FyZEtleXMuU3BhY2UpIHtcclxuICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTWVtZW50byB7XHJcbiAgICBpZiAoIU1lbWVudG8uaW5zdGFuY2UpIHtcclxuICAgICAgTWVtZW50by5pbnN0YW5jZSA9IG5ldyBNZW1lbnRvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE1lbWVudG8uaW5zdGFuY2U7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERPTVV0aWxzIH0gZnJvbSBcIkAvdXRpbGl0aWVzL0RPTVV0aWxzXCI7XG5pbXBvcnQgeyBJRWRpdGFibGVOYXZpZ2F0aW9uIH0gZnJvbSBcIi4vSUVkaXRhYmxlTmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgRGlyZWN0aW9ucyB9IGZyb20gXCJAL2NvbW1vbi9EaXJlY3Rpb25zXCI7XG5pbXBvcnQgeyBCb3VuZGFyaWVzIH0gZnJvbSBcIkAvY29tbW9uL0JvdW5kYXJpZXNcIjtcbmltcG9ydCB7IFRhYmxlVXRpbHMgfSBmcm9tIFwiQC91dGlsaXRpZXMvVGFibGVVdGlsc1wiO1xuaW1wb3J0IHsgSVF1aWNrTWVudSB9IGZyb20gXCJAL2NvbXBvbmVudHMvcXVpY2stbWVudS9JUXVpY2tNZW51XCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5Q29udGFpbmVyIH0gZnJvbSBcIi4vRGVwZW5kZW5jeUNvbnRhaW5lclwiO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyBrZXlib2FyZCBldmVudHMgdG8gbmF2aWdhdGUgYmV0d2VlbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMgdXNpbmcgYXJyb3cga2V5cyxcbiAqIGFuZCBlbnN1cmVzIGZvY3VzIG1hbmFnZW1lbnQgYW5kIGNhcmV0IHBsYWNlbWVudCB3aXRoaW4gdGhlc2UgZWxlbWVudHMuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBgSUVkaXRhYmxlTmF2aWdhdGlvbmAgaW50ZXJmYWNlIGFuZCB1c2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gdG8gbWFuYWdlIGl0cyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRhYmxlTmF2aWdhdGlvbiBpbXBsZW1lbnRzIElFZGl0YWJsZU5hdmlnYXRpb24ge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVkaXRhYmxlTmF2aWdhdGlvbjtcblxuICAgIHF1aWNrTWVudTogSVF1aWNrTWVudTtcblxuICAgIC8qKlxuICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBleHRlcm5hbCBpbnN0YW50aWF0aW9uLlxuICAgICAqIEl0IGJpbmRzIHRoZSBgaGFuZGxlQXJyb3dLZXlzYCBtZXRob2QgdG8ga2V5Ym9hcmQgZXZlbnRzIG9uIHRoZSBkb2N1bWVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHF1aWNrTWVudTogSVF1aWNrTWVudSkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVBcnJvd0tleXMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5xdWlja01lbnUgPSBxdWlja01lbnU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWN0cyBhcyBhIHRyaWdnZXIgd2l0aGluIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbiBjb250YWluZXIgdG8gZW5zdXJlIGluc3RhbnRpYXRpb24gb2YgdGhpcyBzaW5nbGV0b24gY2xhc3MuXG4gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBhbnkgb3BlcmF0aW9ucyBpdHNlbGYgYnV0IGVuc3VyZXMgdGhhdCBhbiBpbnN0YW5jZSBvZiBFZGl0YWJsZU5hdmlnYXRpb25cbiAgICAgKiBpcyBjcmVhdGVkIGFuZCByZWFkeSB0byBsaXN0ZW4gdG8ga2V5Ym9hcmQgZXZlbnRzLiBUaGlzIGlzIGNydWNpYWwgZm9yIHNldHRpbmcgdXAgdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIHRoYXQgbWFuYWdlIG5hdmlnYXRpb24gd2l0aGluIGVkaXRhYmxlIGNvbnRlbnQgYXJlYXMsIGFzIGl0IHRyaWdnZXJzIHRoZSBuZWNlc3NhcnkgYmluZGluZ3MgdXBvbiBpbnN0YW50aWF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJFZGl0YWJsZU5hdmlnYXRpb24gaXMgbm93IGxpc3RlbmluZyBmb3Iga2V5IGV2ZW50cy5cIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVkaXRhYmxlTmF2aWdhdGlvbiBjbGFzcy5cbiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLlxuICAgICAqIEByZXR1cm5zIHtFZGl0YWJsZU5hdmlnYXRpb259IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVkaXRhYmxlTmF2aWdhdGlvbiBjbGFzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEVkaXRhYmxlTmF2aWdhdGlvbiB7XG5cbiAgICAgICAgaWYgKCFFZGl0YWJsZU5hdmlnYXRpb24uaW5zdGFuY2UpIHtcblxuICAgICAgICAgICAgY29uc3QgcXVpY2tNZW51ID0gRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZXNvbHZlPElRdWlja01lbnU+KFwiSVF1aWNrTWVudVwiKTtcblxuICAgICAgICAgICAgRWRpdGFibGVOYXZpZ2F0aW9uLmluc3RhbmNlID0gbmV3IEVkaXRhYmxlTmF2aWdhdGlvbihxdWlja01lbnUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZGl0YWJsZU5hdmlnYXRpb24uaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBcnJvd0tleXMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcblxuICAgICAgICBpZiAoIXRoaXMucXVpY2tNZW51LmlzVmlzaWJsZSAmJiBldmVudC5rZXkuc3RhcnRzV2l0aCgnQXJyb3cnKSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5tZXRhS2V5KSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFZGl0YWJsZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50RWRpdGFibGUgJiYgY3VycmVudEVkaXRhYmxlLmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkU3dpdGNoRWRpdGFibGUoY3VycmVudEVkaXRhYmxlLCBldmVudC5rZXkgYXMgRGlyZWN0aW9ucykpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0RWRpdGFibGUgPSB0aGlzLmZpbmROZXh0RWRpdGFibGUoY3VycmVudEVkaXRhYmxlLCBldmVudC5rZXkgYXMgRGlyZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RWRpdGFibGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09IERpcmVjdGlvbnMuQXJyb3dVcCB8fCBldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbihjdXJyZW50RWRpdGFibGUsIG5leHRFZGl0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT0gRGlyZWN0aW9ucy5BcnJvd0xlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0RW5kT2ZFZGl0YWJsZUVsZW1lbnQobmV4dEVkaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PSBEaXJlY3Rpb25zLkFycm93UmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01VdGlscy5wbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudChuZXh0RWRpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogRGV0ZXJtaW5lcyBpZiBuYXZpZ2F0aW9uIHNob3VsZCBzd2l0Y2ggZnJvbSB0aGUgY3VycmVudCBlZGl0YWJsZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBhcnJvdyBkaXJlY3Rpb24gYW5kIGNhcmV0IHBvc2l0aW9uLlxuICAgICogSXQgY2hlY2tzIGlmIHRoZSBjYXJldCBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBjb250ZW50IGFuZCBldmFsdWF0ZXMgYm91bmRhcnkgY29uZGl0aW9ucyBmb3IgdmVydGljYWwgbmF2aWdhdGlvbi5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBjdXJyZW50IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IGJlaW5nIGV2YWx1YXRlZC5cbiAgICAqIEBwYXJhbSB7RGlyZWN0aW9uc30gZGlyZWN0aW9uIC0gVGhlIG5hdmlnYXRpb24gZGlyZWN0aW9uIGluZGljYXRlZCBieSB0aGUgYXJyb3cga2V5IHByZXNzLlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgbmF2aWdhdGlvbiBzaG91bGQgbW92ZSB0byBhbm90aGVyIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIHByaXZhdGUgc2hvdWxkU3dpdGNoRWRpdGFibGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGRpcmVjdGlvbjogRGlyZWN0aW9ucyk6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIERPTVV0aWxzLnNhbml0aXplQ29udGVudEVkaXRhYmxlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgLy8gSWYgaGFzIHNlbGVjdGlvbiBpZ25vcmUgbmF2aWdhdGlvbiBcbiAgICAgICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApO1xuICAgICAgICAgICAgaWYgKHJhbmdlLmVuZE9mZnNldCAhPSByYW5nZS5zdGFydE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB7IGF0U3RhcnQsIGF0RW5kIH0gPSBET01VdGlscy5nZXRTZWxlY3Rpb25UZXh0SW5mbyhlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGlzQXRGaXJzdExpbmUgPSB0aGlzLmlzQXRMaW5lQm91bmRhcnkoZWxlbWVudCwgQm91bmRhcmllcy5GaXJzdCk7XG4gICAgICAgICAgICBjb25zdCBpc0F0TGFzdExpbmUgPSB0aGlzLmlzQXRMaW5lQm91bmRhcnkoZWxlbWVudCwgQm91bmRhcmllcy5MYXN0KTtcblxuICAgICAgICAgICAgaWYgKChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dMZWZ0ICYmIGF0U3RhcnQpIHx8IChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dSaWdodCAmJiBhdEVuZCkgfHxcbiAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93VXAgJiYgKGF0U3RhcnQgfHwgaXNBdEZpcnN0TGluZSkpIHx8XG4gICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gRGlyZWN0aW9ucy5BcnJvd0Rvd24gJiYgKGF0RW5kIHx8IGlzQXRMYXN0TGluZSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQXRMaW5lQm91bmRhcnkoZWxlbWVudDogSFRNTEVsZW1lbnQsIGJvdW5kYXJ5OiBCb3VuZGFyaWVzKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3QgaGFzVGV4dENvbnRlbnQgPSBlbGVtZW50LnRleHRDb250ZW50Py50cmltKCkgIT09IFwiXCI7XG5cbiAgICAgICAgaWYgKCFoYXNUZXh0Q29udGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldENsaWVudFJlY3RzKClbMF07XG5cbiAgICAgICAgaWYgKCFyZWN0KSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IDExO1xuXG4gICAgICAgIGlmIChib3VuZGFyeSA9PT0gQm91bmRhcmllcy5GaXJzdCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHJlY3QudG9wIC0gZWxlbWVudFJlY3QudG9wKSA8IHRvbGVyYW5jZTtcbiAgICAgICAgfSBlbHNlIGlmIChib3VuZGFyeSA9PT0gQm91bmRhcmllcy5MYXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocmVjdC5ib3R0b20gLSBlbGVtZW50UmVjdC5ib3R0b20pIDwgdG9sZXJhbmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogTG9jYXRlcyB0aGUgbmV4dCBjb250ZW50ZWRpdGFibGUgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIG5hdmlnYXRpb24gZGlyZWN0aW9uLlxuICAgICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgYm90aCBob3Jpem9udGFsIChsZWZ0L3JpZ2h0KSBhbmQgdmVydGljYWwgKHVwL2Rvd24pIGRpcmVjdGlvbnMgYW5kIGhhbmRsZXMgdGFibGUgY2VsbCBib3VuZGFyaWVzLlxuICAgICogXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjdXJyZW50IC0gVGhlIGN1cnJlbnQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgdGhlIGFycm93IGtleSBuYXZpZ2F0aW9uLlxuICAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0gVGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgaW4gdGhlIGRlc2lyZWQgZGlyZWN0aW9uIG9yIG51bGwgaWYgbm8gc3VpdGFibGUgZWxlbWVudCBpcyBmb3VuZC5cbiAgICAqL1xuICAgIHByaXZhdGUgZmluZE5leHRFZGl0YWJsZShjdXJyZW50OiBIVE1MRWxlbWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgYWxsRWRpdGFibGVzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXScpKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBhbGxFZGl0YWJsZXMuaW5kZXhPZihjdXJyZW50KTtcblxuICAgICAgICAvLyBUaGUgdGFibGUgbmF2aWdhdGlvbiBiZWhhdmlvciBpcyBhIGxpdHRsZSBkaWZmZXJlbnRcbiAgICAgICAgaWYgKGN1cnJlbnQuY2xvc2VzdChcInRkXCIpKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IGN1cnJlbnQuY2xvc2VzdChcInRhYmxlXCIpO1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IGN1cnJlbnQuY2xvc2VzdChcInRkXCIpO1xuICAgICAgICAgICAgaWYgKHRhYmxlICYmIGNlbGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWlnaGJvckNlbGwgPSBUYWJsZVV0aWxzLmdldE5laWdoYm9yQ2VsbCh0YWJsZSwgY2VsbCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBpZiAobmVpZ2hib3JDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZWlnaGJvckNlbGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5leHRJbmRleCA9IC0xO1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93TGVmdCB8fCBkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dSaWdodCkge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93TGVmdCA/IGN1cnJlbnRJbmRleCAtIDEgOiBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gdGhpcy5maW5kVmVydGljYWxFZGl0YWJsZUluZGV4KGN1cnJlbnQsIGFsbEVkaXRhYmxlcywgZGlyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0SW5kZXggPCAwIHx8IG5leHRJbmRleCA+PSBhbGxFZGl0YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbGxFZGl0YWJsZXNbbmV4dEluZGV4XSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogRmluZHMgdGhlIG5leHQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQgaW4gYSB2ZXJ0aWNhbCBkaXJlY3Rpb24gKHVwIG9yIGRvd24pIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgKiBJdCBjYWxjdWxhdGVzIHRoZSBjbG9zZXN0IGVkaXRhYmxlIGVsZW1lbnQgYmFzZWQgb24gdmVydGljYWwgZGlzdGFuY2UgYW5kIG1pbmltYWwgaG9yaXpvbnRhbCBzaGlmdCwgZmF2b3JpbmcgZWxlbWVudHMgZGlyZWN0bHkgYWJvdmUgb3IgYmVsb3cuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGN1cnJlbnQgLSBUaGUgY3VycmVudGx5IGZvY3VzZWQgY29udGVudGVkaXRhYmxlIGVsZW1lbnQuXG4gICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGFsbEVkaXRhYmxlcyAtIEFuIGFycmF5IG9mIGFsbCBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMuXG4gICAgKiBAcGFyYW0ge0RpcmVjdGlvbnN9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gb2YgbmF2aWdhdGlvbiwgZWl0aGVyIHVwIG9yIGRvd24uXG4gICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgdmVydGljYWwgZWRpdGFibGUgZWxlbWVudCBvciB0aGUgY3VycmVudCBpbmRleCBpZiBub25lIGFyZSBjbG9zZXIuXG4gICAgKi9cbiAgICAvLyBwcml2YXRlIGZpbmRWZXJ0aWNhbEVkaXRhYmxlKGN1cnJlbnQ6IEhUTUxFbGVtZW50LCBhbGxFZGl0YWJsZXM6IEhUTUxFbGVtZW50W10sIGRpcmVjdGlvbjogRGlyZWN0aW9ucyk6IG51bWJlciB7XG4gICAgLy8gICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbEVkaXRhYmxlcy5pbmRleE9mKGN1cnJlbnQpO1xuICAgIC8vICAgICBjb25zdCBjdXJyZW50UmVjdCA9IGN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGxldCBjbG9zZXN0SW5kZXggPSAtMTtcbiAgICAvLyAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuXG4gICAgLy8gICAgIGFsbEVkaXRhYmxlcy5mb3JFYWNoKChlZGl0YWJsZSwgaW5kZXgpID0+IHtcbiAgICAvLyAgICAgICAgIGlmIChlZGl0YWJsZSAhPT0gY3VycmVudCkge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlZGl0YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbERpc3RhbmNlID0gZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93VXAgPyBjdXJyZW50UmVjdC50b3AgLSByZWN0LmJvdHRvbSA6IHJlY3QudG9wIC0gY3VycmVudFJlY3QuYm90dG9tO1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxEaXN0YW5jZSA9IE1hdGguYWJzKGN1cnJlbnRSZWN0LmxlZnQgLSByZWN0LmxlZnQpO1xuXG4gICAgLy8gICAgICAgICAgICAgaWYgKHZlcnRpY2FsRGlzdGFuY2UgPiAwICYmICh2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlIDwgY2xvc2VzdERpc3RhbmNlKSkge1xuICAgIC8vICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlICsgaG9yaXpvbnRhbERpc3RhbmNlO1xuICAgIC8vICAgICAgICAgICAgICAgICBjbG9zZXN0SW5kZXggPSBpbmRleDtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgIH0pO1xuXG4gICAgLy8gICAgIHJldHVybiBjbG9zZXN0SW5kZXggPT09IC0xID8gY3VycmVudEluZGV4IDogY2xvc2VzdEluZGV4O1xuICAgIC8vIH1cbiAgICBwcml2YXRlIGZpbmRWZXJ0aWNhbEVkaXRhYmxlSW5kZXgoY3VycmVudDogSFRNTEVsZW1lbnQsIGFsbEVkaXRhYmxlczogSFRNTEVsZW1lbnRbXSwgZGlyZWN0aW9uOiBEaXJlY3Rpb25zKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gYWxsRWRpdGFibGVzLmluZGV4T2YoY3VycmVudCk7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgXG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IERpcmVjdGlvbnMuQXJyb3dVcCkge1xuICAgICAgICAgICAgbmV4dEluZGV4LS07XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBEaXJlY3Rpb25zLkFycm93RG93bikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgaWYgKG5leHRJbmRleCA+PSAwICYmIG5leHRJbmRleCA8IGFsbEVkaXRhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUGxhY2VzIHRoZSBjYXJldCBpbiBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgbmV4dCBlbGVtZW50IHRoYXQgY2xvc2VseSBtYXRjaGVzIGl0cyBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBlbGVtZW50LlxuICAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBtb3ZpbmcgZm9jdXMgYmV0d2VlbiBjb250ZW50ZWRpdGFibGUgZWxlbWVudHMgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZS5cbiAgICAqIFxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY3VycmVudCAtIFRoZSBjdXJyZW50IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHdoZXJlIHRoZSBjYXJldCBpcyBsb2NhdGVkLlxuICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbmV4dCAtIFRoZSBuZXh0IGNvbnRlbnRlZGl0YWJsZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBjYXJldCB3aWxsIG1vdmUuXG4gICAgKi9cbiAgICBwcml2YXRlIHBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbihjdXJyZW50OiBIVE1MRWxlbWVudCwgbmV4dDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gY3VycmVudFJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobmV4dCwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgIGxldCBiZXN0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICBsZXQgYmVzdE9mZnNldCA9IDA7XG4gICAgICAgICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgIGlmIChiZXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlIHx8ICFub2RlLm5vZGVWYWx1ZSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsRGlzdGFuY2UgPSBNYXRoLmFicyh0ZXN0UmVjdC5sZWZ0IC0gcmVjdC5sZWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RPZmZzZXQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKTtcblxuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGJlc3ROb2RlLCBiZXN0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobmV4dCk7XG4gICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSIsImltcG9ydCAnLi9hc3NldHMvY3NzL21haW4uY3NzJztcclxuaW1wb3J0IHsgVUlCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVycy9VSUJ1aWxkZXInO1xyXG5pbXBvcnQgeyBDb21tYW5kRGlzcGF0Y2hlciB9IGZyb20gJy4vY29tbWFuZHMvQ29tbWFuZERpc3BhdGNoZXInO1xyXG5pbXBvcnQgeyBTaG9ydGN1dExpc3RlbmVycyB9IGZyb20gJy4vY29yZS9TaG9ydGN1dExpc3RlbmVycyc7XHJcbmltcG9ydCB7IFRhYmxlTGlzdGVuZXJzIH0gZnJvbSAnLi9jb3JlL2xpc3RlbmVycy9UYWJsZUxpc3RlbmVycyc7XHJcbmltcG9ydCB7IFF1aWNrTWVudSB9IGZyb20gJy4vY29tcG9uZW50cy9xdWljay1tZW51L1F1aWNrTWVudSc7XHJcbmltcG9ydCB7IERlcGVuZGVuY3lDb250YWluZXIgfSBmcm9tICcuL2NvcmUvRGVwZW5kZW5jeUNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEZvY3VzU3RhY2sgfSBmcm9tICcuL2NvcmUvRm9jdXNTdGFjayc7XHJcbmltcG9ydCB7IEJsb2NrT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Jsb2NrLW9wZXJhdGlvbnMvQmxvY2tPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IEVsZW1lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZWxlbWVudC1mYWN0b3J5L0VsZW1lbnRGYWN0b3J5U2VydmljZSc7XHJcbmltcG9ydCB7IFRleHRPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1vcGVyYXRpb25zL1RleHRPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RhYmxlLW9wZXJhdGlvbnMvVGFibGVPcGVyYXRpb25zU2VydmljZSc7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhciB9IGZyb20gJy4vY29tcG9uZW50cy9mbG9hdGluZy10b29sYmFyL1RhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhcic7XHJcbmltcG9ydCB7IE1lbWVudG8gfSBmcm9tICcuL2NvcmUvTWVtZW50byc7XHJcbmltcG9ydCB7IEVkaXRhYmxlTmF2aWdhdGlvbiB9IGZyb20gJy4vY29yZS9FZGl0YWJsZU5hdmlnYXRpb24nO1xyXG5pbXBvcnQgeyBCbG9ja1Rvb2xib3ggfSBmcm9tICcuL2NvbXBvbmVudHMvYmxvY2stdG9vbGJveC9CbG9ja1Rvb2xib3gnO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgc2NyaXB0IGluaXRpYWxpemVzIHRoZSBlZGl0b3IgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIG9uY2UgdGhlIERPTSBjb250ZW50IGhhcyBmdWxseSBsb2FkZWQuXHJcbiAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBidWlsZGluZyB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIHN0YXJ0aW5nIHRoZSBldmVudCBsaXN0ZW5pbmcgcHJvY2VzcyB0byBoYW5kbGUgY29tbWFuZHMuXHJcbiAqXHJcbiAqIFRoZSBgRE9NQ29udGVudExvYWRlZGAgZXZlbnQgZW5zdXJlcyB0aGF0IGFsbCB0aGUgRE9NIGNvbnRlbnQgaGFzIGJlZW4gZnVsbHkgcGFyc2VkIGFuZCBsb2FkZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBiZWdpbnMuXHJcbiAqIGBVSUJ1aWxkZXIuYnVpbGQoKS5zdGFydCgpO2AgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYW5kIGFjdGl2YXRlIHRoZSB1c2VyIGludGVyZmFjZS5cclxuICogYENvbW1hbmREaXNwYXRjaGVyLmdldEluc3RhbmNlKCkubGlzdGVuKCk7YCByZXRyaWV2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIENvbW1hbmREaXNwYXRjaGVyIGFuZCBzdGFydHMgbGlzdGVuaW5nIGZvciBldmVudHMuXHJcbiAqL1xyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJTWVtZW50b1wiLCAoKSA9PiBNZW1lbnRvLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklTaG9ydGN1dExpc3RlbmVyc1wiLCAoKSA9PiBTaG9ydGN1dExpc3RlbmVycy5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJVGFibGVMaXN0ZW5lcnNcIiwgKCkgPT4gVGFibGVMaXN0ZW5lcnMuZ2V0SW5zdGFuY2UoKSk7XHJcblxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklGb2N1c1N0YWNrXCIsICgpID0+IEZvY3VzU3RhY2suZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSUVsZW1lbnRGYWN0b3J5U2VydmljZVwiLCAoKSA9PiBFbGVtZW50RmFjdG9yeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRleHRPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBUZXh0T3BlcmF0aW9uc1NlcnZpY2UuZ2V0SW5zdGFuY2UoKSk7XHJcbiAgICBEZXBlbmRlbmN5Q29udGFpbmVyLkluc3RhbmNlLnJlZ2lzdGVyKFwiSVRhYmxlT3BlcmF0aW9uc1NlcnZpY2VcIiwgKCkgPT4gVGFibGVPcGVyYXRpb25zU2VydmljZS5nZXRJbnN0YW5jZSgpKTtcclxuICAgIERlcGVuZGVuY3lDb250YWluZXIuSW5zdGFuY2UucmVnaXN0ZXIoXCJJQmxvY2tPcGVyYXRpb25zU2VydmljZVwiLCAoKSA9PiBCbG9ja09wZXJhdGlvbnNTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIC8vVXNlckludGVyZmFjZVxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklRdWlja01lbnVcIiwgKCkgPT4gUXVpY2tNZW51LmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklUYWJsZUNvbnRleHRGbG9hdGluZ1Rvb2xiYXJcIiwgKCkgPT4gVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyLmdldEluc3RhbmNlKCkpO1xyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lci5JbnN0YW5jZS5yZWdpc3RlcihcIklFZGl0YWJsZU5hdmlnYXRpb25cIiwgKCkgPT4gRWRpdGFibGVOYXZpZ2F0aW9uLmdldEluc3RhbmNlKCkpO1xyXG5cclxuICAgIFVJQnVpbGRlci5idWlsZCgpLnN0YXJ0KCk7XHJcblxyXG4gICAgQ29tbWFuZERpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5saXN0ZW4oKTtcclxuICAgIEVkaXRhYmxlTmF2aWdhdGlvbi5nZXRJbnN0YW5jZSgpLmxpc3RlbigpO1xyXG4gICAgQmxvY2tUb29sYm94LmdldEluc3RhbmNlKCkubGlzdGVuKCk7XHJcblxyXG59KTsiXSwibmFtZXMiOlsiX19fQ1NTX0xPQURFUl9FWFBPUlRfX18iLCJwdXNoIiwibW9kdWxlIiwiaWQiLCJleHBvcnRzIiwiY3NzV2l0aE1hcHBpbmdUb1N0cmluZyIsImxpc3QiLCJ0b1N0cmluZyIsInRoaXMiLCJtYXAiLCJpdGVtIiwiY29udGVudCIsIm5lZWRMYXllciIsImNvbmNhdCIsImxlbmd0aCIsImpvaW4iLCJpIiwibW9kdWxlcyIsIm1lZGlhIiwiZGVkdXBlIiwic3VwcG9ydHMiLCJsYXllciIsInVuZGVmaW5lZCIsImFscmVhZHlJbXBvcnRlZE1vZHVsZXMiLCJrIiwiX2siLCJjc3NNYXBwaW5nIiwiYnRvYSIsImJhc2U2NCIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsImRhdGEiLCJzb3VyY2VNYXBwaW5nIiwic3R5bGVzSW5ET00iLCJnZXRJbmRleEJ5SWRlbnRpZmllciIsImlkZW50aWZpZXIiLCJyZXN1bHQiLCJtb2R1bGVzVG9Eb20iLCJvcHRpb25zIiwiaWRDb3VudE1hcCIsImlkZW50aWZpZXJzIiwiYmFzZSIsImNvdW50IiwiaW5kZXhCeUlkZW50aWZpZXIiLCJvYmoiLCJjc3MiLCJzb3VyY2VNYXAiLCJyZWZlcmVuY2VzIiwidXBkYXRlciIsImFkZEVsZW1lbnRTdHlsZSIsImJ5SW5kZXgiLCJzcGxpY2UiLCJhcGkiLCJkb21BUEkiLCJ1cGRhdGUiLCJuZXdPYmoiLCJyZW1vdmUiLCJsYXN0SWRlbnRpZmllcnMiLCJuZXdMaXN0IiwiaW5kZXgiLCJuZXdMYXN0SWRlbnRpZmllcnMiLCJfaSIsIl9pbmRleCIsIm1lbW8iLCJpbnNlcnQiLCJzdHlsZSIsInRhcmdldCIsInN0eWxlVGFyZ2V0IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwid2luZG93IiwiSFRNTElGcmFtZUVsZW1lbnQiLCJjb250ZW50RG9jdW1lbnQiLCJoZWFkIiwiZSIsImdldFRhcmdldCIsIkVycm9yIiwiYXBwZW5kQ2hpbGQiLCJlbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzIiwic3R5bGVFbGVtZW50Iiwibm9uY2UiLCJzZXRBdHRyaWJ1dGUiLCJpbnNlcnRTdHlsZUVsZW1lbnQiLCJzdHlsZVRhZ1RyYW5zZm9ybSIsImFwcGx5IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVtb3ZlU3R5bGVFbGVtZW50Iiwic3R5bGVTaGVldCIsImNzc1RleHQiLCJmaXJzdENoaWxkIiwiY3JlYXRlVGV4dE5vZGUiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkIiwiYSIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIm5jIiwiQ29udGVudFR5cGVzIiwiSWNvbnMiLCJUb29sYm94T3B0aW9ucyIsIkNvbW1vbkNsYXNzZXMiLCJDdXN0b21VSUV2ZW50cyIsIkRlZmF1bHRKU0V2ZW50cyIsIkN1c3RvbUV2ZW50cyIsIlpJbmRleCIsIkNvbG9ycyIsIkNvbG9yc05hbWVzIiwiQ29tbWFuZHMiLCJCdXR0b25JRHMiLCJLZXlib2FyZEtleXMiLCJEcm9wZG93bkl0ZW1JRHMiLCJET01FbGVtZW50cyIsIkRyb3Bkb3duTGlzdElEcyIsIkRyb3Bkb3duTWVudUlEcyIsImxvY2FscyIsIlV0aWxzIiwiZ2VuZXJhdGVVbmlxdWVJZCIsInRpbWVQYXJ0IiwiRGF0ZSIsIm5vdyIsInJhbmRvbUFycmF5IiwiVWludDMyQXJyYXkiLCJjcnlwdG8iLCJnZXRSYW5kb21WYWx1ZXMiLCJyZ2JUb0hleCIsInJnYiIsIm1hdGNoIiwiTnVtYmVyIiwieCIsImhleCIsImlzVmFsaWRVcmwiLCJ1cmwiLCJwYXR0ZXJuIiwiUmVnRXhwIiwiaW5jbHVkZXMiLCJ0b0xvd2VyQ2FzZSIsInRlc3QiLCJFbGVtZW50RmFjdG9yeVNlcnZpY2UiLCJjcmVhdG9ycyIsInN0YXRpYyIsIkJMT0NLX1BBUkFHUkFQSCIsIlBBUkFHUkFQSCIsIkNIRUNLQk9YX0lURU0iLCJMSVNUX0lURU0iLCJDT0RFIiwiUVVPVEUiLCJCVUxMRVRFRF9MSVNUIiwiTlVNQkVSRURfTElTVCIsIkNIRUNLX0xJU1QiLCJIRUFERVJfMSIsIkhFQURFUl8yIiwiSEVBREVSXzMiLCJIRUFERVJfNCIsIkhFQURFUl81IiwiSEVBREVSXzYiLCJEUkFHX0hBTkRMRV9CVVRUT04iLCJUQUJMRSIsIklNQUdFIiwiVklERU8iLCJTUE9USUZZIiwiR0lUSFVCX0dJU1QiLCJHSVRMQUJfU05JUFBFVCIsIkNPREVQRU4iLCJDQUxMT1VUIiwiU0VQQVJBVE9SIiwiX2luc3RhbmNlIiwicmVnaXN0ZXIiLCJFTEVNRU5UX1RZUEVTIiwiYmxvY2tQYXJhZ3JhcGhDcmVhdG9yIiwicGFyYWdyYXBoQ3JlYXRvciIsImNoZWNrYm94SXRlbUNyZWF0b3IiLCJsaXN0SXRlbUNyZWF0b3IiLCJjb2RlQ3JlYXRvciIsInF1b3RlQ3JlYXRvciIsImNoZWNrTGlzdENyZWF0b3IiLCJidWxsZXRlZExpc3RDcmVhdG9yIiwibnVtYmVyZWRMaXN0Q3JlYXRvciIsImhlYWRpbmdDcmVhdG9yIiwiZHJhZ0hhbmRsZUJ1dHRvbkNyZWF0b3IiLCJ0YWJsZUNyZWF0b3IiLCJwbGFjZWhvbGRlckNyZWF0b3IiLCJJbWFnZSIsIkltYWdlMiIsIlNob3dNZWRpYUlucHV0VXBsb2FkIiwiU2hvd01lZGlhSW5wdXRFbWJlZCIsIklmcmFtZSIsIllvdVR1YmUiLCJTcG90aWZ5IiwiR2l0SHViIiwiQ29kZVBlbiIsImNhbGxvdXRDcmVhdG9yIiwic2VwYXJhdG9yQ3JlYXRvciIsImdldEluc3RhbmNlIiwidHlwZSIsImNyZWF0b3IiLCJjcmVhdGUiLCJUeXBlRXJyb3IiLCJibG9ja1BhcmFncmFwaCIsInBhcmFncmFwaCIsImxldmVsIiwiaGVhZGluZyIsImNoZWNrYm94SXRlbSIsImxpc3RJdGVtXzIiLCJkcmFnSGFuZGxlQnV0dG9uIiwiY29udGFpbmVyIiwiY2xhc3NMaXN0IiwiYWRkIiwiY29kZUJsb2NrIiwicHJlIiwiSW5jbHVkZUJsb2NrVG9vbGJhckNsYXNzIiwiTGFuZ3VhZ2VTZWxlY3Rpb25Ub29sQ2xhc3MiLCJFeHRyYU9wdGlvbnNDbGFzcyIsImNvZGUiLCJjb250ZW50RWRpdGFibGUiLCJ0ZXh0Q29udGVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBdHRyaWJ1dGUiLCJobGpzIiwiaGlnaGxpZ2h0RWxlbWVudCIsImNvbnRlbnRFbGVtZW50IiwiYmxvY2txdW90ZSIsImdldFJhbmRvbVF1b3RlIiwicXVvdGF0aW9ucyIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsInVsIiwiQ2hlY2tMaXN0IiwiaW5pdGlhbEl0ZW0iLCJCdWxsZXRlZExpc3QiLCJOdW1iZXJlZExpc3QiLCJ0YWJsZVNoZWxsIiwidGFibGVDb250cm9sbGVyIiwidGFibGVXcmFwcGVyIiwidGFibGUiLCJBbGlnblRvb2xDbGFzcyIsIlRhYmxlIiwidGJvZHkiLCJyb3dEYXRhIiwic3BsaXQiLCJyb3ciLCJmb3JFYWNoIiwiY2VsbENvbnRlbnQiLCJjZWxsIiwiYWRkUm93IiwiaW5uZXJIVE1MIiwiYWRkQ29sdW1uIiwiY29udGVudFR5cGUiLCJpY29uIiwidGV4dCIsImNsYXNzZXMiLCJDb250ZW50RWxlbWVudCIsInBsYWNlaG9sZGVyIiwiU2hvd01lZGlhSW5wdXRPbkNsaWNrIiwicGxhY2Vob2xkZXJJY29uIiwiY3JlYXRlSWNvbiIsInBsYWNlaG9sZGVyVGV4dCIsImlubmVyVGV4dCIsImpvaGFubmVzQ2FsbG91dCIsIkNvbG9yVG9vbENsYXNzIiwiY2FsbG91dFdyYXBwZXIiLCJ0ZXh0QXJlYSIsIndyYXBwZXIiLCJzZXBhcmF0b3IiLCJwIiwiUGFyYWdyYXBoIiwiaCIsImNoZWNrYm94Iiwic3BhbiIsImRpdiIsIm5ld0RpdiIsIm5ld0VsZW1lbnQiLCJkcmFnSGFuZGxlcldyYXBwZXIiLCJFZGl0b3JPbmx5IiwiYnV0dG9uIiwiZHJhZ2dhYmxlIiwiaWNvbklkIiwiQmFzZVVJQ29tcG9uZW50IiwiX2NhbkhpZGUiLCJwcm9wcyIsImh0bWxFbGVtZW50IiwicGFyZW50IiwiY29uc3RydWN0b3IiLCJpbml0IiwiZGlzcGxheSIsInNldElkIiwiYWRkQ3NzQ2xhc3MiLCJ0b2tlbnMiLCJhcHBlbmRUbyIsImlzVmlzaWJsZSIsInZpc2liaWxpdHkiLCJjb250YWlucyIsImdldENvbXB1dGVkU3R5bGUiLCJwYXJlbnRFbGVtZW50Iiwic2hvdyIsImhpZGUiLCJsb2NrSGlkZSIsInVubG9ja0hpZGUiLCJjYW5IaWRlIiwidmFsdWUiLCJmb2N1cyIsImNoYW5nZUNvbG9yIiwiY29sb3IiLCJyZW1vdmVDb2xvciIsImNoYW5nZVZpc2liaWxpdHlUb1Zpc2libGUiLCJjaGFuZ2VWaXNpYmlsaXR5VG9IaWRkZW4iLCJkb2VzRWxlbWVudE92ZXJmbG93U2NyZWVuIiwib3JpZ2luYWxEaXNwbGF5Iiwib3JpZ2luYWxWaXNpYmlsaXR5Iiwib3JpZ2luYWxQb3NpdGlvbiIsInBvc2l0aW9uIiwiZWxlbWVudFJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJzY3JlZW5XaWR0aCIsImlubmVyV2lkdGgiLCJyaWdodCIsImxlZnQiLCJlbnN1cmVWaXNpYmxlIiwiY2xvc2VzdCIsInNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJibG9jayIsImlubGluZSIsImNvbnNvbGUiLCJ3YXJuIiwiaGFuZGxlQ2xvc2VFbGVtZW50RXZlbnQiLCJldmVudCIsImRldGFpbHMiLCJkZXRhaWwiLCJ0YXJnZXRJZCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImhhbmRsZVNob3dFbGVtZW50RXZlbnQiLCJhdHRhY2hVSUV2ZW50IiwiQ2xvc2VFbGVtZW50IiwiYmluZCIsIlNob3dFbGVtZW50IiwiRGVwZW5kZW5jeUNvbnRhaW5lciIsImRlcGVuZGVuY2llcyIsIkluc3RhbmNlIiwiaW5zdGFuY2UiLCJyZXNvbHZlIiwiRE9NVXRpbHMiLCJpc1NlbGVjdGlvbkluVGFibGVDZWxsIiwic2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uIiwicmFuZ2VDb3VudCIsIm5vZGUiLCJhbmNob3JOb2RlIiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwidGFnTmFtZSIsImdldFNlbGVjdGlvblRleHRJbmZvIiwiZWwiLCJzZWxSYW5nZSIsInRlc3RSYW5nZSIsImF0U3RhcnQiLCJhdEVuZCIsInNlbCIsImdldFJhbmdlQXQiLCJjcmVhdGVSYW5nZSIsInNlbGVjdE5vZGVDb250ZW50cyIsInNldEVuZCIsInN0YXJ0Q29udGFpbmVyIiwic3RhcnRPZmZzZXQiLCJzZXRTdGFydCIsImVuZENvbnRhaW5lciIsImVuZE9mZnNldCIsImluc2VydEFmdGVyIiwibmV3Tm9kZSIsInJlZmVyZW5jZU5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsImhhc1RleHRDb250ZW50IiwidHJpbSIsImhhc0NoaWxkTm9kZXMiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwic29tZSIsImNoaWxkTm9kZSIsImNsb25lQW5kSW5zZXJ0QWZ0ZXIiLCJjbG9uZWRFbGVtZW50IiwiY2xvbmVOb2RlIiwicHJlZml4IiwiZmluZENsb3Nlc3RBbmNlc3Rvck9mQWN0aXZlRWxlbWVudEJ5Q2xhc3MiLCJjbGFzc05hbWUiLCJhY3RpdmVFbGVtZW50IiwiY3VycmVudEVsZW1lbnQiLCJmaW5kQ2xvc2VzdEFuY2VzdG9yT2ZTZWxlY3Rpb25CeUNsYXNzIiwiY29tbW9uQW5jZXN0b3JDb250YWluZXIiLCJURVhUX05PREUiLCJyZWFycmFuZ2VDb250ZW50QWZ0ZXJTcGxpdCIsImN1cnJlbnROb2RlIiwiY3Vyc29yUG9zaXRpb24iLCJnZXRDdXJzb3JQb3NpdGlvbiIsInJhbmdlczEiLCJzcGxpdENvbnRlbnRBdEN1cnNvclNlbGVjdGlvbiIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwiZGVsZXRlRnJvbURvY3VtZW50Iiwic2V0Q3Vyc29yUG9zaXRpb24iLCJyYW5nZXMyIiwicmFuZ2UiLCJpbnRlcnNlY3RzTm9kZSIsInRyZWVXYWxrZXIiLCJjcmVhdGVUcmVlV2Fsa2VyIiwiTm9kZUZpbHRlciIsIlNIT1dfVEVYVCIsImFjY2VwdE5vZGUiLCJGSUxURVJfQUNDRVBUIiwiY2hhckNvdW50IiwibmV4dE5vZGUiLCJjdXJyZW50UG9zIiwidGV4dExlbmd0aCIsImNvbGxhcHNlIiwiZ2V0Q29udGVudFR5cGVGcm9tQWN0aXZlRWxlbWVudCIsImdldEN1cnJlbnRBY3RpdmVCbG9jayIsImdldEF0dHJpYnV0ZSIsInJvb3ROb2RlIiwicmFuZ2VzIiwicmFuZ2VCZWZvcmUiLCJyYW5nZUFmdGVyIiwibGFzdENoaWxkIiwic2V0RW5kQWZ0ZXIiLCJwbGFjZUN1cnNvckF0U3RhcnRPZkVkaXRhYmxlRWxlbWVudCIsImVkaXRhYmxlRWxlbWVudCIsInNldFRpbWVvdXQiLCJpc0NvbnRlbnRFZGl0YWJsZSIsInBsYWNlQ3Vyc29yQXRFbmRPZkVkaXRhYmxlRWxlbWVudCIsImNvbnRlbnRCbG9jayIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImxhc3ROb2RlIiwiaXNTZWxlY3RlZFRleHREZXNjZW5kYW50T2YiLCJwYXJlbnRTZWxlY3RvciIsInJlbW92ZUZpbHRlclRleHQiLCJsYXN0U2xhc2hQb3NpdGlvbiIsIm9mZnNldCIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiZGVsZXRlQ29udGVudHMiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlEYXRhQ29udGVudFR5cGUiLCJkYXRhQ29udGVudFR5cGUiLCJjbGlja2VkRWxlbWVudCIsImRhdGFzZXQiLCJmaW5kQ2xpY2tlZEVsZW1lbnRPckFuY2VzdG9yQnlJZCIsImZpbmRDbGlja2VkRWxlbWVudE9yQW5jZXN0b3JCeUNsYXNzIiwiY2xhc3NLZXkiLCJpc0V2ZW50VGFyZ2V0RGVzY2VuZGFudE9mIiwic2VsZWN0b3IiLCJFbGVtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwibWF0Y2hlcyIsImdldFBhcmVudFRhcmdldEJ5U2VsZWN0b3IiLCJnZXRQYXJlbnRGcm9tU2VsZWN0aW9uIiwicmVtb3ZlQ2xhc3Nlc1dpdGhQcmVmaXgiLCJmaWx0ZXIiLCJjbHMiLCJzdGFydHNXaXRoIiwiaXNUYXJnZXREZXNjZW5kYW50T2ZTZWxlY3RvciIsIkhUTUxFbGVtZW50IiwiVGV4dCIsInF1ZXJ5U2VsZWN0b3JJbmNsdWRpbmdTZWxmIiwic2FuaXRpemVDb250ZW50RWRpdGFibGUiLCJzaG91bGRSZXN0b3JlQ2FyZXQiLCJjYXJldFBvcyIsImVuZHNXaXRoIiwibm9kZU5hbWUiLCJSYW5nZSIsInRleHROb2RlcyIsImdldFRleHROb2Rlc0luIiwidGV4dE5vZGUiLCJub2RlTGVuZ3RoIiwiY2hpbGRyZW4iLCJnZXRQcmV2aW91c0NvbnRlbnRFZGl0YWJsZSIsImFsbENvbnRlbnRFZGl0YWJsZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaW5kZXhPZiIsImdldE5leHRDb250ZW50RWRpdGFibGUiLCJnZXRBY3RpdmVDb250ZW50RWRpdGFibGUiLCJmaW5kQ29udGVudEVkaXRhYmxlSW5EZXNjZW5kYW50cyIsImNoaWxkIiwic2F2ZUNhcmV0UG9zaXRpb24yZCIsInJlY3QiLCJjaGFySW5kZXgiLCJzbGljZSIsImFuY2hvck9mZnNldCIsImhvcml6b250YWxQb3MiLCJyZXN0b3JlQ2FyZXRQb3NpdGlvbjJkIiwid2Fsa2VyIiwiYmVzdE5vZGUiLCJiZXN0T2Zmc2V0IiwiYmVzdERpc3RhbmNlIiwiSW5maW5pdHkiLCJub2RlVmFsdWUiLCJ0ZXN0UmVjdCIsImhvcml6b250YWxEaXN0YW5jZSIsImFicyIsInNhdmVDYXJldFBvc2l0aW9uM2QiLCJ2ZXJ0aWNhbFBvcyIsInRvcCIsInJlc3RvcmVDYXJldFBvc2l0aW9uM2QiLCJ2ZXJ0aWNhbERpc3RhbmNlIiwidG90YWxEaXN0YW5jZSIsInNxcnQiLCJtZXJnZUlubGluZUVsZW1lbnRzIiwibm9ybWFsaXplIiwiY2hpbGRFbGVtZW50IiwiRmxvYXRpbmdUb29sYmFyIiwiZHJvcGRvd25zIiwic2VwYXJhdG9ycyIsImN1cnJlbnRTZWxlY3Rpb25SYW5nZSIsImh0bWxGb2N1c2VkRWxlbWVudEJlZm9yZU9wZW5RdWlja01lbnUiLCJzdXBlciIsInpJbmRleCIsIlNsaWdodGx5SW1wb3J0YW50Iiwic2VsZWN0V3JhcHBlciIsImFueURyb3Bkb3duVmlzaWJsZSIsImhpZGVBbGxEcm9wZG93blZpc2libGUiLCJhcHBlbmREcm9wZG93biIsImRyb3Bkb3duIiwiYXBwZW5kQnV0dG9uR3JvdXAiLCJidXR0b25Hcm91cCIsImFwcGVuZFNlcGFyYXRvciIsImFwcGVuZFRleHRUb29sYmFyIiwiZHJvcGRvd25MaXN0IiwiYXR0YWNoRXZlbnRzIiwiQ2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsIk1vdXNlZG93biIsInJlc3RvcmVSYW5nZVNlbGVjdGlvbiIsImJsb2NrRGVsZXRlZCIsImJsb2NrVHlwZUNoYW5nZWQiLCJpc1NlbGVjdGlvbkVtcHR5IiwiQ2hhbmdlQ29sb3IiLCJTaG93SGlkZUFjdGl2ZUJ1dHRvbiIsImludGVudGlvbiIsIlJlc2V0QWN0aXZlQnV0dG9ucyIsIkNoYW5nZUJsb2NrVG9vbGJhckxhbmd1YWdlIiwibGFuZ3VhZ2UiLCJibG9ja0lkIiwiRXZlbnRFbWl0dGVyIiwiZW1pdENvZGVCbG9ja0xhbmd1YWdlQ2hhbmdlZEV2ZW50IiwidGFyZ2V0Q2xhc3MiLCJjdXN0b21FdmVudCIsIkN1c3RvbUV2ZW50IiwiYWN0aW9uIiwiZGlzcGF0Y2hFdmVudCIsImVtaXRTaG93RWxlbWVudEV2ZW50IiwiZW1pdENsb3NlRWxlbWVudEV2ZW50IiwiZW1pdENoYW5nZUNvbXBvbmVudENvbG9yRXZlbnQiLCJDb2xvckNoYW5nZVJlcXVlc3QiLCJlbWl0U2hvd0hpZGVBY3RpdmVFbGVtZW50RXZlbnQiLCJpbnRlbnNpb24iLCJIaWxpdGVDb2xvck5vbmUiLCJGb3JlQ29sb3JJbml0aWFsIiwiQmFja2dyb3VuZENvbG9yTm9uZSIsImVtaXRSZXNldEFjdGl2ZUJ1dHRvbnNFbGVtZW50RXZlbnQiLCJlbWl0Q2hhbmdlVGFibGVCb3JkZXJDb2xvckV2ZW50Iiwic2NvcGUiLCJlbWl0dGVkQ29tbWFuZCIsImNvbW1hbmQiLCJjaGFuZ2VUYWJsZUJvcmRlckNvbG9yIiwiVGV4dENvbnRleHRGbG9hdGluZ1Rvb2xiYXIiLCJ0ZXh0T3BlcmF0aW9uc1NlcnZpY2UiLCJpbml0aWFsUmVjdCIsImxvY2tlZEhpZGUiLCJkZWJvdW5jZVRpbWVyIiwiVmVyeUltcG9ydGFudCIsInByb2Nlc3NTZWxlY3Rpb25DaGFuZ2VFZmZlY3RzIiwiaXNMaW5rIiwicXVlcnlDb21tYW5kU3RhdGUiLCJpc0JvbGQiLCJpc0l0YWxpYyIsImlzVW5kZXJsaW5lIiwiaXNJbmxpbmVDb2RlIiwiaXNTdHJpa2VUaHJvdWdoIiwiaGlsaXRlQ29sb3JzIiwiSGlsaXRlQ29sb3JSZWQiLCJxdWVyeUhpbGl0ZUNvbG9yIiwiSGlsaXRlQ29sb3JHcmVlbiIsIkhpbGl0ZUNvbG9yQmx1ZSIsIkhpbGl0ZUNvbG9yWWVsbG93IiwiSGlsaXRlQ29sb3JHcmV5IiwiZm9yZUNvbG9ycyIsIkZvcmVDb2xvclJlZCIsInF1ZXJ5Rm9yZUNvbG9yIiwiRm9yZUNvbG9yR3JlZW4iLCJGb3JlQ29sb3JCbHVlIiwiRm9yZUNvbG9yWWVsbG93IiwiRm9yZUNvbG9yR3JleSIsImVudHJpZXMiLCJhY3RpdmUiLCJMaW5rIiwiQm9sZCIsIkl0YWxpYyIsIklubGluZUNvZGUiLCJVbmRlcmxpbmUiLCJTdHJpa2V0aHJvdWdoIiwiSWNvbkFjdGl2ZUJsdWUiLCJJY29uRGVmYXVsdEJsYWNrIiwibG9nU2VsZWN0aW9uQ2hhbmdlIiwiaXNDb2xsYXBzZWQiLCJsb2ciLCJpc1NlbGVjdGluZyIsIk1vdXNldXAiLCJCYmxDbGljayIsIlNlbGVjdGlvbkNoYW5nZSIsIktleWRvd24iLCJzaGlmdEtleSIsIktleXVwIiwiU2hpZnQiLCJzaG93SGlkZSIsImNsZWFyVGltZW91dCIsIkVzY2FwZSIsInNob3VsZFVwZGF0ZVBvc2l0aW9uIiwiY3VycmVudFJlY3QiLCJoYXNDb250ZW50IiwiaGFzU2VsZWN0aW9uIiwiY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvU2VsZWN0aW9uIiwiZXJyb3IiLCJyZWN0cyIsImdldENsaWVudFJlY3RzIiwiZmlyc3RSZWN0IiwiY19maXJzdFJlY3RMZWZ0IiwiY19maXJzdFJlY3RUb3AiLCJjX2ZpcnN0UmVjdEJvdHRvbSIsImJvdHRvbSIsImVsZW1lbnRXaWR0aCIsIm9mZnNldFdpZHRoIiwibGVmdFBvc2l0aW9uIiwic2Nyb2xsWCIsImVsZW1lbnRIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ0b3BQb3NpdGlvbiIsInNjcm9sbFkiLCJoaWRlVHVybkludG9Ecm9wZG93bklmSW5DZWxsIiwiaXNDZWxsIiwidXBkYXRlUG9zaXRpb24iLCJzZXRQb3NpdGlvbiIsIklucHV0TGlua0JveCIsInBhcmVudFdyYXBwZXIiLCJzZXRQYXJlbnRXcmFwcGVyIiwiSW5wdXRMaW5rQm94V3JhcHBlciIsImlucHV0TGlua0JveCIsImhpZ2hsaWdodHMiLCJ0ZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhciIsImF0dGFjaEV2ZW50IiwiaGVhZGVyIiwic2hlbGwiLCJDb250cm9sIiwiYm9keSIsIkVudGVyIiwiaW5zZXJ0TGluayIsImN0cmxLZXkiLCJocmVmIiwib3BlbiIsInVybFdpdGhQcm90b2NvbCIsImxpbmtSZWFkeVRvSW5zZXJ0IiwiaW5wdXQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwb3NpdGlvbkxpbmtDb21wb25lbnRCZWxvd1NlbGVjdGlvbiIsImhpZ2hsaWdodFNlbGVjdGVkVGV4dCIsInJlbW92ZUhpZ2hsaWdodHMiLCJoaWdobGlnaHQiLCJ3aWR0aCIsImhlaWdodCIsIm9wYWNpdHkiLCJwb2ludGVyRXZlbnRzIiwiRWRpdG9yIiwiZWxlbWVudEZhY3RvcnlTZXJ2aWNlIiwibWVtZW50byIsInRpdGxlIiwiYWRkQmxvY2siLCJ0ZXh0RmxvYXRpbmdUb29sYmFyIiwicXVpY2tNZW51IiwidGFibGVDb250ZXh0VG9vbGJhciIsIm1lZGlhSW5wdXR0ZXIiLCJpbnB1dExpbmtCb3hXcmFwcGVyIiwiYmxvY2tPcGVyYXRpb25zU2VydmljZSIsImZsb2F0aW5nVG9vbGJhciIsInRhYmxlVG9vbGJhciIsInNhdmVTdGF0ZSIsImdldEVsZW1lbnRCeUlkIiwiZWRpdG9ySWQiLCJjb250ZW50V3JhcHBlciIsImVkaXRvckNvbmZpZyIsInRhYmxlRmxvYXRpbmdUb29sYmFyIiwiYmxvY2tFbGVtZW50IiwiYXBwZW5kRHJhZ0hhbmRsZXIiLCJyZWFkeVN0YXRlIiwiZmlyc3RQYXJhZ3JhcGgiLCJjbGlwYm9hcmREYXRhIiwiZ2V0RGF0YSIsImluc2VydFRleHRBdEN1cnNvciIsImF0dGFjaERyYWdIYW5kbGVyIiwiaW5zZXJ0Tm9kZSIsInNldFN0YXJ0QWZ0ZXIiLCJkcmFnSGFuZGxlciIsInByZXBlbmQiLCJyZW1vdmVEcmFnSGFuZGxlciIsImV4dHJhY3RDb250ZW50IiwiZHJhZ2dlZEl0ZW0iLCJkcm9wTGluZSIsImJvdW5kaW5nIiwieSIsImNsaWVudFkiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiQWRkQmxvY2tCdXR0b24iLCJleGVjQ29tbWFuZCIsImNyZWF0ZURlZmF1bHRCbG9jayIsIkFkZEJsb2NrV3JhcHBlciIsIlNpemVzIiwiU1ZHSWNvbiIsInVzZUVsZW1lbnQiLCJzaXplIiwiY3JlYXRlRWxlbWVudE5TIiwidXNlIiwic2V0QXR0cmlidXRlTlMiLCJjbG9uZSIsInNpemVzIiwic2V0VXNlVG8iLCJBZGRCbG9ja0J1aWxkZXIiLCJidWlsZCIsIlBsdXMiLCJtZWRpdW0iLCJEcm9wZG93bk1lbnUiLCJkcm9wZG93bkJ1dHRvbiIsInByZWZpeElkIiwiY2xhc3Nlc0tleSIsIkJhc2VEb3VibHlMaW5rZWRMaXN0IiwidGFpbCIsImdldEZpcnN0IiwiZ2V0TGFzdCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiY3VycmVudCIsImNhbGxiYWNrIiwiYW55IiwicHJlZGljYXRlIiwiZmluZEZpcnN0IiwiZmluZExhc3QiLCJwcmV2aW91c05vZGUiLCJmaW5kIiwiSk5vZGUiLCJwYXJlbnRMaXN0Iiwic2V0TmV4dCIsInNldFByZXZpb3VzIiwiZ2V0TmV4dFNhdGlzZnlpbmciLCJzdGFydE5vZGUiLCJnZXRQcmV2aW91c1NhdGlzZnlpbmciLCJDaXJjdWxhckRvdWJseUxpbmtlZExpc3QiLCJhcHBlbmQiLCJEcm9wZG93bk1lbnVMaXN0SXRlbSIsImFjdGl2ZUljb24iLCJsZWZ0SWNvbiIsIm9uRm9jdXNGdW5jdGlvbkxpc3QiLCJvbkxvc2VGb2N1c0Z1bmN0aW9uTGlzdCIsInBhcmVudERyb3Bkb3duTWVudUxpc3QiLCJzaG9ydGN1dCIsImFkZENsYXNzIiwiYXR0YWNoT25Gb2N1cyIsImZ1bmMiLCJhcmdzIiwiYXR0YWNoT25Mb3NlRm9jdXMiLCJyZW1vdmVGb2N1cyIsInRhYkluZGV4IiwidGV4dE9wdGlvbiIsInNob3J0Q3V0IiwiZW1pdENvbW1hbmRFdmVudCIsIk1vdXNlbW92ZSIsImFzeW5jIiwiZHJvcGRvd25JdGVtcyIsInN3aXRjaFZpc3VhbEZvY3VzIiwiaGFuZGxlQ2hhbmdlQmxvY2tUb29sYmFyTGFuZ3VhZ2VFdmVudCIsImV2ZW50VmFsdWVzIiwiaGFuZGxlU2hvd0hpZGVBY3RpdmVCdXR0b25FdmVudCIsImhhbmRsZVJlc2V0QWN0aXZlQnV0dG9uc0V2ZW50IiwiZXZlbnRDb2xvciIsIkRyb3Bkb3duTWVudUxpc3QiLCJwYXJlbnREcm9wZG93blBhcmVudEJ1dHRvbiIsImN1cnJlbnRGb2N1c2VkTWVudUl0ZW0iLCJtYXhIZWlnaHQiLCJvdmVyZmxvd1kiLCJFeHRyZW1lbHlJbXBvcnRhbnQiLCJkcm9wZG93bkl0ZW0iLCJzZXRQYXJlbnREcm9wZG93bk1lbnVCdXR0b24iLCJkcm9wZG93blBhcmVudEJ1dHRvbiIsImNsaWNrZWRPdXRzaWRlVGhlRHJvcGRvd25XaGlsZURyb3Bkb3duSXNWaXNpYmxlIiwia2V5UHJlc3NlZE91dHNpZGVUaGVEcm9wZG93bldoaWxlRHJvcGRvd25Jc1Zpc2libGUiLCJmb2N1c05leHRWaXNpYmxlSXRlbSIsImZvY3VzUHJldmlvdXNWaXNpYmxlSXRlbSIsImhhbmRsZXJLZXlEb3duRXZlbnQiLCJibG9ja0Nsb25lZCIsImFwcGx5RmlsdGVyIiwiQmFja3NwYWNlIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJzdmdJY29uIiwibmV4dFZpc2libGVJdGVtIiwicHJldmlvdXNWaXNpYmxlSXRlbSIsIkZsb2F0aW5nVG9vbGJhclNlcGFyYXRvciIsImJvcmRlclJpZ2h0IiwibWFyZ2luIiwiQnV0dG9uR3JvdXAiLCJCdXR0b25Hcm91cEl0ZW0iLCJzaG93VUkiLCJ0b2dnbGVMaW5rIiwiQ29sb3JJY29uIiwiYm9yZGVyUmFkaXVzIiwiYm9yZGVyIiwiYm94U2l6aW5nIiwiRHJvcGRvd25NZW51TGlzdEl0ZW1UaXRsZSIsImNoYW5nZUFjdGl2ZUljb25Ub1Zpc2libGUiLCJnZXRMZWZ0SWNvbkJhY2tncm91bmRDb2xvciIsInJlc2V0QWN0aXZlSWNvbiIsIkJsb2NrVG9vbGJveEJ1aWxkZXIiLCJhbGlnblRvb2wiLCJncm91cEJ1dHRvbiIsIkp1c3RpZnlMZWZ0IiwiSnVzdGlmeVN0YXJ0IiwibGFyZ2UiLCJKdXN0aWZ5Q2VudGVyIiwiSnVzdGlmeVJpZ2h0IiwiSnVzdGlmeUVuZCIsImNvbG9yVG9vbCIsImNvbG9yRHJvcGRvd25MaXN0IiwiY29sb3JCdXR0b24iLCJEcm9wZG93bk1lbnVCdXR0b24iLCJjb2xvckRyb3Bkb3duIiwiaGlsaXRlQ29sb3JSZWQiLCJCYWNrZ3JvdW5kT3B0aW9uUmVkIiwiY2hhbmdlQ2FsbG91dEJhY2tncm91bmRDb2xvciIsIkNhbGxvdXRCYWNrZ3JvdW5kUmVkIiwiQmFja2dyb3VuZE9wdGlvbkdyZWVuIiwiQ2FsbG91dEJhY2tncm91bmRHcmVlbiIsImhpbGl0ZUNvbG9yQmx1ZSIsIkJhY2tncm91bmRPcHRpb25CbHVlIiwiQ2FsbG91dEJhY2tncm91bmRCbHVlIiwiaGlsaXRlQ29sb3JZZWxsb3ciLCJCYWNrZ3JvdW5kT3B0aW9uWWVsbG93IiwiQ2FsbG91dEJhY2tncm91bmRZZWxsb3ciLCJoaWxpdGVDb2xvckdyZXkiLCJCYWNrZ3JvdW5kT3B0aW9uR3JleSIsIkNhbGxvdXRCYWNrZ3JvdW5kR3JleSIsImhpbGl0ZUNvbG9yTm9uZSIsIkJhY2tncm91bmRPcHRpb25Ob25lIiwiQ2FsbG91dEJhY2tncm91bmROb25lIiwibGFuZ3VhZ2VTZWxlY3Rpb25Ub29sIiwic2VsZWN0IiwibWVudSIsIkJsb2NrVG9vbGJveCIsImxhbmd1YWdlTWFwIiwic29ydCIsImIiLCJsb2NhbGVDb21wYXJlIiwibmFtZSIsImNoYW5nZUNvZGVCbG9ja0xhbmd1YWdlIiwiZXh0cmFPcHRpb25zIiwiZHVwbGljYXRlQmxvY2siLCJEdXBsaWNhdGUiLCJkZWxldGVJdGVtIiwiZGVsZXRlQmxvY2siLCJUcmFzaCIsImxpc3RlbiIsIk1vdXNlb3ZlciIsImluc2VydFRvb2xib3hJbnRvQmxvY2tPbmNlIiwiRm9jdXNpbiIsImhhbmRsZVRhYmxlQmVoYXZpb3JGb2N1c0luIiwiRm9jdXNvdXQiLCJoYW5kbGVUYWJsZUJlaGF2aW9yRm9jdXNPdXQiLCJoYW5kbGVDbGlja0V2ZW50IiwidGFyZ2V0RWxlbWVudCIsInRvb2xib3hWaXNpYmlsaXR5Q29udHJvbGxlciIsImZvcmNlSGlkZUVsZW1lbnQiLCJvcHRpb25zV3JhcHBlciIsImluY2x1ZGVMYW5ndWFnZVNlbGVjdGlvblRvb2wiLCJpbmNsdWRlQWxpZ25Ub29sIiwiaW5jbHVkZUNvbG9yVG9vbCIsImluY2x1ZGVFeHRyYU9wdGlvbnMiLCJ0b29sYm94V3JhcHBlciIsImNyZWF0ZVRvb2xib3giLCJNb3VzZWVudGVyIiwicmVzZXRUb29sYm94IiwiYmxvY2tUb29sYmFySWQiLCJ0b29sYmFyIiwiaGlkZUJsb2NrVG9vbGJveCIsIk1vdXNlbGVhdmUiLCJpZnJhbWUiLCJjaGFuZ2VUb29sYmFyQ29sb3IiLCJjb2xvckludGVyYWN0aXZlQnV0dG9uIiwiYm9yZGVyQ29sb3IiLCJpc0FueURlcGVuZGVudEJveFZpc2libGUiLCJkZXBlbmRlbnRCb3hlcyIsImJveCIsImJsb2NrVG9vbGJhciIsIm1vcmUiLCJodG1sRWxlbWVudFdyYXBwZXIiLCJpbmNsdWRlQ2hldnJvbkljb24iLCJyb2xlIiwiY2hhbmdlVGl0bGUiLCJUZXh0Q29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJmbG9hdGluZ0JhciIsInR1cm5JbnRvRHJvcGRvd24iLCJtb3JlT3B0aW9uc0Ryb3Bkb3duIiwidHVybkludG9CYXJMaXN0IiwidHVybkludG9CYXJCdXR0b24iLCJ0cmFuc2Zvcm1CbG9jayIsIlNWR0ljb25zIiwidG9kb19saXN0IiwiYl9saXN0Iiwibl9saXN0IiwicXVvdGUiLCJoZWFkMiIsImhlYWQzIiwiaGVhZDQiLCJsaW5rIiwiYm9sZCIsInRvZ2dsZUJvbGQiLCJpdGFsaWMiLCJ0b2dnbGVJdGFsaWMiLCJ1bmRlcmxpbmUiLCJ0b2dnbGVVbmRlcmxpbmUiLCJpbmxpbmVDb2RlIiwidG9nZ2xlSW5saW5lQ29kZSIsInN0cmlrZXRocm91Z2giLCJ0b2dnbGVTdHJpa2VUaHJvdWdoIiwiU3RyaWtlVGhyb3VnaCIsIkNvbG9yVGV4dE9wdGlvblNlbGVjdCIsIkNvbG9yVGV4dE9wdGlvbnNNZW51IiwidG9nZ2xlSGlsaXRlQ29sb3IiLCJoaWxpdGVDb2xvckdyZWVuIiwiZm9yZUNvbG9yUmVkIiwidG9nZ2xlRm9yZUNvbG9yIiwiZm9yZUNvbG9yR3JlZW4iLCJmb3JlQ29sb3JCbHVlIiwiZm9yZUNvbG9yWWVsbG93IiwiZm9yZUNvbG9yR3JleSIsImZvcmVDb2xvck5vbmUiLCJtb3JlT3B0aW9uc0xpc3QiLCJtb3JlT3B0aW9uc0J1dHRvbiIsImNvcHlTZWxlY3RlZCIsImNvcHkiLCJjdXRTZWxlY3RlZCIsImN1dCIsInBhc3QiLCJwYXN0ZSIsImR1cGxpY2F0ZSIsInJlbW92ZUZvcm1hdCIsImVyYXNlciIsImRlbGV0ZSIsImhlYWQxIiwiaGVhZDUiLCJoZWFkNiIsIlF1aWNrTWVudUVtcHR5IiwiaHRtbEVtcHR5SW5kaWNhdG9yIiwicGFkZGluZyIsIlF1aWNrTWVudSIsIm1lbnVTZWN0aW9ucyIsInF1aWNrTWVudUVtcHR5IiwiZmlsdGVySW5wdXQiLCJmb2N1c1N0YWNrIiwiYmxvY2tPcHRpb25zIiwibWVudUl0ZW0iLCJibG9ja09wZXJhdGlvblNlcnZpY2UiLCJwZWVrIiwiZm9jdXNPblRoZUZpcnN0VmlzaWJsZUl0ZW0iLCJmaXJzdFNlY3Rpb25Ob2RlIiwiY3VycmVudFNlY3Rpb25Ob2RlIiwiaXRlbU5vZGUiLCJtZW51SXRlbXMiLCJwcmV2aW91c1Zpc2libGVTZWN0aW9uTm9kZSIsImltbWVkaWF0ZVBhcmVudCIsInNlY3Rpb24iLCJsYXN0VmlzaWJsZVNlY3Rpb25Ob2RlIiwibmV4dFZpc2libGVTZWN0aW9uTm9kZSIsImZpcnN0VmlzaWJsZVNlY3Rpb25Ob2RlIiwiZmlsdGVySXRlbXMiLCJmaWx0ZXJTZWN0aW9uIiwicmVzdG9yZSIsImFsdEtleSIsInJlbW92ZUxhc3RGaWx0ZXJJbnB1dENoYXJhY3RlciIsImNvbmNhdEZpbHRlcklucHV0Iiwic3RvcFByb3BhZ2F0aW9uIiwiYmxvY2tUeXBlIiwidHJhbnNmb3JtSHRtbEZvY3VzZWRFbGVtZW50QmVmb3JlT3BlblF1aWNrTWVudSIsInN0ZyIsIkRvdWJseUxpbmtlZExpc3QiLCJRdWlja01lbnVTZWN0aW9uIiwicXVpY2tNZW51SW5zdGFuY2UiLCJhcHBlbmRRdWlja01lbnVJdGVtcyIsImFwcGVuZFF1aWNrTWVudUl0ZW0iLCJmaWx0ZXJWYWx1ZSIsIlF1aWNrTWVudUl0ZW0iLCJfYmxvY2tUeXBlIiwiX2ZpbHRlclZhbHVlIiwiX2ltbWVkaWF0ZVBhcmVudCIsImRlc2NyaXB0aW9uIiwib3B0aW9uSW1hZ2UiLCJzdmciLCJvcHRpb25UZXh0IiwiYmxvY2tUaXRsZSIsImJsb2NrRGVzY3JpcHRpb24iLCJRdWlja01lbnVCdWlsZGVyIiwiYmFzaWNCbG9ja3NTZWN0aW9uIiwiQ2FsbG91dCIsIm1lZGlhQmxvY2tzU2VjdGlvbiIsImhlYWRpbmdCbG9ja3NTZWN0aW9uIiwibGlzdEJsb2Nrc1NlY3Rpb24iLCJlbWJlZFNlY3Rpb24iLCJUaXRsZSIsImgxIiwiVGl0bGVCdWlsZGVyIiwiRGlyZWN0aW9ucyIsIlRhYmxlU2NvcGVzIiwiU2VsZWN0aW9uTW9kZXMiLCJFbWJlZFR5cGVzIiwiVG9vbGJhcklEcyIsIkJvdW5kYXJpZXMiLCJUYWJsZVV0aWxzIiwiaW5zZXJ0UG9zaXRpb24iLCJyb3dzIiwibmV3Um93IiwiaW5zZXJ0Um93IiwibnVtQ29sdW1ucyIsInJlZHVjZSIsIm1heCIsImNlbGxzIiwiYWZmZWN0ZWRDZWxscyIsImluc2VydENlbGwiLCJpc0xhc3RDb2x1bW4iLCJjZWxsUm93IiwiaXNMYXN0Um93IiwicmVtb3ZlQ29sdW1uQnlDZWxsIiwiY29sdW1uSW5kZXgiLCJjZWxsSW5kZXgiLCJkZWxldGVDZWxsIiwicmVtb3ZlUm93QnlDZWxsIiwiZGVsZXRlUm93Iiwicm93SW5kZXgiLCJnZXRBY3RpdmVUYWJsZUNlbGwiLCJnZXRMYXN0VGFibGVDZWxsIiwiaiIsImdldEZpcnN0VGFibGVDZWxsIiwiZ2V0TmVpZ2hib3JDZWxsIiwiZGlyZWN0aW9uIiwiQXJyb3dSaWdodCIsIkFycm93TGVmdCIsIkFycm93VXAiLCJBcnJvd0Rvd24iLCJjaGFuZ2VDZWxsQm9yZGVyQ29sb3IiLCJjZWxsc1RvQ2hhbmdlIiwiQ29sdW1uIiwiUm93Iiwic2VsZWN0ZWRDZWxsIiwiQ2VsbCIsIlNlbGVjdGVkQ2VsbHMiLCJtb3ZlRm9jdXNUb0JlbG93Q2VsbCIsIm5leHRSb3ciLCJiZWxvd0NlbGwiLCJDb250ZW50IiwiY2xlYXJTZWxlY3Rpb25PbkRyYWciLCJyZVJlbmRlclBsYWNlaG9sZGVyIiwic2VsZWN0ZWQiLCJwYXJlbnRCbG9jayIsIkJsdXIiLCJjb3B5RWxlbWVudEl0ZW0iLCJET01Db250ZW50TG9hZGVkIiwiZWRpdG9yIiwiYmxvY2tzIiwicHJlc3NlZEVudGVyT25UaXRsZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPblByZXZpb3VzIiwic2VsZWN0ZWRDb250ZW50IiwibWVyZ2VXaXRoUHJldmlvdXNCbG9jayIsIkRlbGV0ZSIsImRlbGV0ZUJsb2NrQW5kRm9jdXNPbk5leHQiLCJtZXJnZVdpdGhOZXh0QmxvY2siLCJpc0N1cnNvckF0RW5kIiwiaXNDdXJzb3JBdFN0YXJ0IiwiaXNDdXJzb3JPbkxhc3RMaW5lIiwiaXNDdXJzb3JPbkZpcnN0TGluZSIsInRhYkNoYXJhY3RlciIsImFjdGl2ZUNlbGwiLCJmb2N1c09uTmV4dEJsb2NrIiwiaW5zZXJ0TmV3Iiwic2FuaXRpemVFbGVtZW50RXZlbnRIYW5kbGVyIiwiSW5wdXQiLCJoYXNBdHRyaWJ1dGUiLCJjdXN0b21QbGFjZWhvbGRlciIsImZvY3VzYWJsZVBhcmVudCIsImVuZE5vZGUiLCJjb2xsYXBzZWQiLCJpc0F0Rmlyc3RWaXNpYmxlTGluZSIsImNsb25lUmFuZ2UiLCJpc0F0TGFzdFZpc2libGVMaW5lIiwiZGlkQ3Vyc29yTW92ZSIsIlByb21pc2UiLCJvcmlnaW5hbFJlY3QiLCJuZXdSZWN0IiwiZGlkTW92ZSIsIkNvbnRlbnRCdWlsZGVyIiwiVGFibGVDb250ZXh0RmxvYXRpbmdUb29sYmFyIiwic2VsZWN0ZWRDZWxscyIsImFjdHVhbEZvY3VzZWRDZWxsIiwidGFibGVPcGVyYXRpb25zU2VydmljZSIsImNvbnRyb2xsZXIiLCJzZWxlY3Rpb25Nb2RlIiwic2VsZWN0aW9uRmxhZyIsInNlbGVjdGVkVGV4dCIsImNsZWFyQW5kSGlkZSIsIk1vZGVyYXRlbHlJbXBvcnRhbnQiLCJBYm9ydENvbnRyb2xsZXIiLCJoYW5kbGVNb3VzZURvd24iLCJoYW5kbGVNb3VzZU1vdmUiLCJoYW5kbGVNb3VzZVVwIiwiaGFuZGxlU3RhcnRTZWxlY3Rpb25JbkNlbGxLZXlEb3duIiwiaGFuZGxlQ2VsbFNlbGVjdGlvbkNvbnRpbnVhdGlvbk9uS2V5RG93biIsImhhbmRsZUtleURvd24iLCJoYW5kbGVLZXlVcCIsIlREIiwiYWJvcnQiLCJjbGVhckFsbCIsImFkZFNlbGVjdGVkQ2VsbCIsInVwZGF0ZVNlbGVjdGlvbk1vZGVCeU1vdXNlRXZlbnQiLCJyZXNldFNlbGVjdGlvblN0YXRlIiwiY3VycmVudENlbGwiLCJtZXRhS2V5IiwicmVwZWF0IiwibmV4dENlbGwiLCJub3JtYWxpemVUZXh0IiwicmVwbGFjZSIsInVwZGF0ZVRoZVNlbGVjdGlvbk1vZGVCeUN1cnJlbnRTZWxlY3Rpb25TdGF0ZSIsImFjdHVhbFNlbGVjdGlvbiIsImN1cnJlbnRDZWxsVGV4dCIsImNlbGxSZWN0IiwibW91c2VYIiwiY2xpZW50WCIsIm1vdXNlWSIsInJlc2V0QWJvcnRDb250cm9sbGVyIiwiY2hhbmdlVG9vbGJhclBvc2l0aW9uVG9CZUNsb3NlZFRvIiwic2lnbmFsIiwiYmFja2dyb3VuZENvbG9ycyIsIkJhY2tncm91bmRDb2xvclJlZCIsInF1ZXJ5QWxsU3RhdGVDZWxsQmFja2dyb3VuZENvbG9yIiwiQmFja2dyb3VuZENvbG9yR3JlZW4iLCJCYWNrZ3JvdW5kQ29sb3JCbHVlIiwiQmFja2dyb3VuZENvbG9yWWVsbG93IiwiQmFja2dyb3VuZENvbG9yR3JleSIsIlRhYmxlQ29udGV4dEZsb2F0aW5nVG9vbGJhckJ1aWxkZXIiLCJ0YWJsZU9wZXJhdGlvblNlcnZpY2UiLCJ0YWJsZU9wdGlvbnMiLCJ0YWJsZUNvbG9yRHJvcGRvd24iLCJpbnNlcnRUYWJsZUNvbHVtbkxlZnQiLCJDb2x1bW5MZWZ0IiwiaW5zZXJ0VGFibGVDb2x1bW5SaWdodCIsIkNvbHVtblJpZ2h0IiwiaW5zZXJ0VGFibGVSb3dBYm92ZSIsIlJvd0Fib3ZlIiwiaW5zZXJ0VGFibGVSb3dCZWxvdyIsIlJvd0JlbG93IiwiZGVsZXRlQ29sdW1uSXRlbSIsInJlbW92ZUNvbHVtbiIsImRlbGV0ZVN3ZWVwIiwiZGVsZXRlUm93SXRlbSIsInJlbW92ZVJvdyIsImNlbGxCYWNrZ3JvdW5kQ29sb3JSZWQiLCJ0b2dnbGVDZWxsSGlsaXRlQ29sb3IiLCJjZWxsQmFja2dyb3VuZENvbG9yR3JlZW4iLCJjZWxsQmFja2dyb3VuZENvbG9yQmx1ZSIsImNlbGxCYWNrZ3JvdW5kQ29sb3JZZWxsb3ciLCJjZWxsQmFja2dyb3VuZENvbG9yR3JleSIsImNlbGxCYWNrZ3JvdW5kQ29sb3JOb25lIiwiRW1iZWRUb29sIiwiZW1iZWRJbWFnZSIsInVybE9iaiIsImxhc3RGb2N1c2VkRWxlbWVudCIsIlVSTCIsInZhbGlkYXRlSW1hZ2UiLCJjcmVhdGVFbWJlZENvbnRhaW5lciIsImltYWdlIiwic3JjIiwiYWx0IiwibWF4V2lkdGgiLCJmaW5hbGl6ZUVtYmVkIiwidXJsVG9DaGVjayIsInJlamVjdCIsIm9ubG9hZCIsIm9uZXJyb3IiLCJlbWJlZEdvb2dsZVNoZWV0Iiwic2hlZXRJZCIsInBhdGhuYW1lIiwic2FmZVNoZWV0SWQiLCJmcmFtZUJvcmRlciIsImFsbG93RnVsbHNjcmVlbiIsImVtYmVkWW91VHViZVZpZGVvQXNJZnJhbWUiLCJ2aWRlb0lkIiwic2VhcmNoUGFyYW1zIiwic2FmZVZpZGVvSWQiLCJhbGxvdyIsImVtYmVkWW91VHViZVNob3J0QXNJZnJhbWUiLCJwYXRoU2VnbWVudHMiLCJzaG9ydElkIiwic2FmZVNob3J0SWRJZCIsImVtYmVkWW91VHViZVBsYXlsaXN0QXNJZnJhbWUiLCJsaXN0SWQiLCJzYWZlTGlzdElkIiwiZW1iZWRTcG90aWZ5Q29udGVudCIsImNvbnRlbnRJZCIsInBvcCIsInNhZmVDb250ZW50SWQiLCJTcG90aWZ5VHJhY2siLCJTcG90aWZ5UGxheWxpc3QiLCJTcG90aWZ5U2hvdyIsIlNwb3RpZnlFcGlzb2RlIiwiU3BvdGlmeUFydGlzdCIsImVtYmVkR2lzdEFzU2NyaXB0IiwiZ2lzdElkIiwic2hhZG93RWxlbWVudCIsIm1pbkhlaWdodCIsInNoYWRvd1Jvb3QiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwic2NyaXB0U3JjIiwic2NyaXB0Iiwib3JpZ2luYWxXcml0ZSIsIndyaXRlIiwic2NyaXB0T3V0cHV0IiwidGVtcERpdiIsImVtYmVkQ29kZXBlbkFzSWZyYW1lIiwicGFydHMiLCJ1c2VyIiwicGVuIiwic2FmZVVzZXIiLCJzYWZlUGVuIiwib3ZlcmZsb3ciLCJyZXNpemVPYnNlcnZlciIsIlJlc2l6ZU9ic2VydmVyIiwiZW50cnkiLCJjb250ZW50UmVjdCIsIm9ic2VydmUiLCJmaWd1cmUiLCJjb250ZW50RWxlbWVudENsYXNzZXMiLCJ0b29sYmFyV3JhcHBlciIsImRldGVybWluZUVtYmVkVHlwZSIsImRvbWFpbiIsImhvc3RuYW1lIiwicGF0aCIsImhhcyIsIllvdVR1YmVQbGF5bGlzdCIsIllvdVR1YmVWaWRlbyIsIllvdVR1YmVTaG9ydCIsIlZpbWVvVmlkZW8iLCJHb29nbGVTaGVldCIsIlR3ZWV0IiwiR29vZ2xlTWFwIiwiR2l0SHViR2lzdCIsIkdpdExhYlNuaXBwZXQiLCJNZWRpYUlucHV0dGVyIiwidXBsb2FkVGFiIiwiY3JlYXRlTmF2SXRlbSIsImVtYmVkVGFiIiwidXBsb2FkQ29udGVudCIsImNyZWF0ZVVwbG9hZENvbnRlbnQiLCJlbWJlZENvbnRlbnQiLCJjcmVhdGVFbWJlZENvbnRlbnQiLCJsaSIsImxhYmVsIiwidGV4dEluZm8iLCJlbWJlZEdlbmVyaWMiLCJyZXNldElucHV0QmdDb2xvciIsInN0cmluZ1VSTCIsImZvY3VzZWRFbGVtZW50IiwiZW1iZWRUeXBlIiwiaW5wdXRWYWx1ZSIsImlucHV0VGV4dCIsInNldEFjdGl2ZVRhYiIsImhhbmRsZXJLZXlkb3duRXZlbnRzIiwiaGFuZGxlckNsaWNrRXZlbnRzIiwiaGlkZU1lZGlhSW5wdXR0ZXJPbkV4dGVybmFsQ2xpY2siLCJzaG93TWVkaWFJbnB1dHRlck9uTWVkaWFJbnB1dHRlckVsZW1lbnRDbGljayIsImNsaWNrZWRPbkVsZW1lbnRXaXRoU2hvd01lZGlhSW5wdXRDbGFzcyIsImZpbmRDbGFzc1dpdGhTdWZmaXgiLCJzdWZmaXgiLCJyZWdleCIsImdldFRhYiIsInRhYklkIiwiZ2V0Q29udGVudCIsImxhc3RGb2N1c2VkIiwic2hvd0lucHV0TWVkaWEiLCJ0ZXh0UGxhY2Vob2xkZXIiLCJzZXRJbnB1dFBsYWNlaG9sZGVyIiwiYWN0aXZhdGVNZWRpYVVwbG9hZCIsImlzRWxlbWVudFZpc2libGUiLCJlbWJlZCIsIm9mZnNldFBhcmVudCIsIk1lZGlhSW5wdXR0ZXJCdWlsZGVyIiwiRWRpdG9yQnVpbGRlciIsIlVJQnVpbGRlciIsInN0YXJ0IiwiaW5zZXJ0SWNvbnMiLCJzdmdDb250YWluZXIiLCJDb21tYW5kRGlzcGF0Y2hlciIsInRleHRPcGVyYXRpb25TZXJ2aWNlIiwiaGFuZGxlQ29tbWFuZEV2ZW50IiwiY3JlYXRlQU5ld1BhcmFncmFwaEZyb21UaXRsZSIsInRhcmdldEJsb2NrVHlwZSIsImV4ZWNJbnNlcnRMaW5rIiwiZXhlY1RvZ2dsZUxpbmsiLCJleGVjQm9sZCIsImV4ZWNJbmxpbmVDb2RlIiwiZXhlY0l0YWxpYyIsImV4ZWNVbmRlcmxpbmUiLCJleGVjU3RyaWtlVGhyb3VnaCIsImV4ZWNIaWxpdGVDb2xvciIsImV4ZWNGb3JlQ29sb3IiLCJleGVjRHVwbGljYXRlQmxvY2siLCJleGVjRGVsZXRlQmxvY2siLCJleGVjRGVsZXRlRm9jdXNPblByZXZpb3VzIiwiZXhlY0RlbGV0ZUFuZEZvY3VzT25OZXh0IiwiZXhlY0ZvY3VzT25OZXh0IiwiZXhlY1JlbW92ZUZvcm1hdCIsImp1c3RpZnlMZWZ0IiwianVzdGlmeUNlbnRlciIsImp1c3RpZnlSaWdodCIsImV4ZWNDcmVhdGVEZWZhdWx0QmxvY2siLCJleGVjSW5zZXJ0TmV3IiwiZm9jdXNPblByZXZpb3VzQmxvY2siLCJleGVjRm9jdXNPblByZXZpb3VzQmxvY2siLCJleGVjTWVyZ2VXaXRoTmV4dEJsb2NrIiwiZXhlY01lcmdlV2l0aFByZXZpb3VzQmxvY2siLCJpbnNlcnRDb2x1bW5MZWZ0IiwiaW5zZXJ0Q29sdW1uUmlnaHQiLCJpbnNlcnRSb3dBYm92ZSIsImluc2VydFJvd0JlbG93IiwiZXhlY0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJleGVjQ2hhbmdlQ2FsbG91dEJhY2tncm91bmQiLCJmb3JtYXQiLCJjcmVhdGVOZXdFbGVtZW50QW5kU3BsaXRDb250ZW50IiwiU2hvcnRjdXRMaXN0ZW5lcnMiLCJzdGFydExpc3RlbiIsImdldE1vZGlmaWVyU3RhdGUiLCJpc051bVBhZCIsIm51bUxvY2tPbiIsImFsZXJ0IiwiVGFibGVMaXN0ZW5lcnMiLCJzaG93bkVsZW1lbnRzIiwiTWFwIiwiRm9jdXNTdGFjayIsInN0YWNrIiwiY2FwYWNpdHkiLCJzaGlmdCIsImNsZWFyIiwiQmxvY2tPcGVyYXRpb25zU2VydmljZSIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsInRoZW4iLCJjb3BpZWRFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY2F0Y2giLCJlcnIiLCJyZWFkVGV4dCIsInBhc3RlZFRleHQiLCJzZWxlY3Rpb25FdmVudCIsImdldEN1cnJlbnRTZWxlY3RlZEJsb2NrIiwiZm9jdXNPbkZpcnN0QmxvY2siLCJnZXREcmFnZ2FibGVFbGVtZW50RnJvbVNlbGVjdGlvbiIsImN1cnJlbnRDb250ZW50RWRpdGFibGUiLCJwcmV2aW91c0NvbnRlbnRFZGl0YWJsZSIsImNhcmV0UG9zaXRpb24iLCJsaXN0SXRlbSIsImFkanVzdGVkQ2FyZXRQb3NpdGlvbiIsIm5leHRDb250ZW50RWRpdGFibGUiLCJuZXh0RWxlbWVudCIsImhpZGVFdmVudCIsImZvY3VzT25OZXh0IiwiZGVsZXRlVGhlQ3VycmVudEVsZW1lbnRBbmRUaGVEcmFnZ2FibGVCbG9ja0lmRW1wdHkiLCJuZXdDb250ZW50QmxvY2siLCJmb2N1c1N0YWNrVG9BZGQiLCJlZGl0YWJsZUNvbnRlbnQiLCJjYWxsb3V0IiwicmVwbGFjZUNoaWxkIiwiZm9jdXNhYmxlIiwiY3JlYXRlTmV3RWxlbWVudCIsImNyZWF0ZUxpc3RJdGVtIiwibmV3Q29udGVudEVsZW1lbnQiLCJjdXJyZW50SXRlbSIsImNvbnRlbnRDdXJyZW50IiwiY29udGVudENsb25lIiwiY291bnRlciIsIm5ld1BhcmFncmFwaCIsImN1cnJlbnRCbG9jayIsImNsb25lZEJsb2NrIiwiY2xvbmVkVGl0bGUiLCJuZXdCbG9jayIsImV2ZW50UGFyYWdyYXBoIiwiY3VycmVudEFjdGl2ZUVsZW1lbnQiLCJmb2N1c09uUHJldmlvdXMiLCJhY3R1YWxFbGVtZW50IiwidG9VcHBlckNhc2UiLCJwcmV2aW91c0VsZW1lbnQiLCJhcHBseUN1cnNvclhFbmRQb3NpdGlvbiIsInNpYmxpbmciLCJmb2N1c2FibGVDYW5kaWRhdGVzIiwiZ2V0UHJldmlvdXNGb2N1c2FibGVFbGVtZW50IiwiYXBwbHlDdXJzb3JYU3RhcnRQb3NpdGlvbiIsImdldE5leHRGb2N1c2FibGVFbGVtZW50IiwiYWN0dWFsIiwieFBvc2l0aW9uIiwiYWRqdXN0Q3Vyc29yT2Zmc2V0IiwicHJldmlvdXNTaWJsaW5nIiwiY2xvc2VzdE5vZGUiLCJjbG9zZXN0T2Zmc2V0IiwiY2xvc2VzdERpZmYiLCJsZWZ0RGlmZiIsInJpZ2h0RGlmZiIsIm1pbiIsImdldEN1cnJlbnRTZWxlY3RlZEZvY3VzYWJsZSIsInJlbW92ZUp1c3RpZnkiLCJjYWxsb3V0RGl2IiwiVGV4dE9wZXJhdGlvbnNTZXJ2aWNlIiwibm9ybWFsaXplQW5jaG9ycyIsImFuY2hvciIsInF1ZXJ5QW5jaG9yQ29tbWFuZFN0YXRlIiwicXVlcnlJbmxpbmVDb2RlQ29tbWFuZFN0YXRlIiwiZXh0cmFjdENvbnRlbnRzIiwiaXNDb2RlIiwiY29udGFpbnNDb2RlIiwicGFyZW50Q29kZSIsImNvZGVFbGVtZW50IiwicXVlcnlVbmRlcmxpbmVDb21tYW5kU3RhdGUiLCJpc05vZGVJbnNpZGVBbmNob3IiLCJjbG9uZUNvbnRlbnRzIiwiZXhwZWN0ZWRDb2xvciIsImZvbnRDb2xvciIsInJnYkNvbG9yIiwic3BhbldpdGhCYWNrZ3JvdW5kIiwiZ2V0VGFyZ2V0RWxlbWVudE1hcCIsImdldFNlbGVjdGVkSFRNTEVsZW1lbnQiLCJnZXRTZWxlY3RlZFRleHROb2RlcyIsIm5vZGVJdGVyYXRvciIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIkZJTFRFUl9SRUpFQ1QiLCJub2RlUmFuZ2UiLCJjb21wYXJlQm91bmRhcnlQb2ludHMiLCJFTkRfVE9fU1RBUlQiLCJTVEFSVF9UT19FTkQiLCJmaW5kQ2xvc2VzdE1hdGNoaW5nUGFyZW50IiwiZWxlbSIsImV2ZXJ5IiwiZXh0cmFjdFNlbGVjdGVkVGV4dCIsImVuZCIsIlRhYmxlT3BlcmF0aW9uc1NlcnZpY2UiLCJpc0FjdGl2ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJUYWJsZVRvb2xiYXIiLCJpc0NlbGxCYWNrZ3JvdW5kQ29sb3IiLCJ0YXJnZXRIZXhDb2xvciIsImN1cnJlbnRCYWNrZ3JvdW5kQ29sb3IiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicXVlcnlTdGF0ZUNlbGxCYWNrZ3JvdW5kQ29sb3IiLCJlbGVtZW50cyIsImlzIiwic2hvd0luc2VydExpbmVFbGVtZW50Iiwic2hvd0luc2VydENvbHVtbkVsZW1lbnQiLCJoaWRlSW5zZXJ0Um93RWxlbWVudCIsImhpZGVJbnNlcnRDb2x1bW5FbGVtZW50IiwiTWVtZW50byIsInVuZG9TdGFjayIsInJlZG9TdGFjayIsInF1ZXJ5IiwiaHRtbCIsInVuZG8iLCJzdGF0ZVRvUmVzdG9yZSIsInJlZG8iLCJzdGF0ZVRvQXBwbHkiLCJTcGFjZSIsIkVkaXRhYmxlTmF2aWdhdGlvbiIsImhhbmRsZUFycm93S2V5cyIsImN1cnJlbnRFZGl0YWJsZSIsInNob3VsZFN3aXRjaEVkaXRhYmxlIiwibmV4dEVkaXRhYmxlIiwiZmluZE5leHRFZGl0YWJsZSIsInBsYWNlQ2FyZXRJblNpbWlsYXJQb3NpdGlvbiIsImlzQXRGaXJzdExpbmUiLCJpc0F0TGluZUJvdW5kYXJ5IiwiRmlyc3QiLCJpc0F0TGFzdExpbmUiLCJMYXN0IiwiYm91bmRhcnkiLCJhbGxFZGl0YWJsZXMiLCJjdXJyZW50SW5kZXgiLCJuZWlnaGJvckNlbGwiLCJuZXh0SW5kZXgiLCJmaW5kVmVydGljYWxFZGl0YWJsZUluZGV4IiwibmV4dCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file